diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 000000000..83994b6a0 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,27 @@ +# template for auto-generated release notes +# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes + +changelog: + # exclude: + # labels: + # - ignore-for-release + # authors: + # - octocat + categories: + - title: ✨ Major Features + labels: + - epic + - title: 🪲 Bug Fixes + labels: + - bug + - cs + - title: 📱 Team Apps + labels: + - team_apps + - title: 📶 Team SDK + labels: + - team_sdk + - title: 🛠️ Team Infra + labels: + - team_infra + - telemetry diff --git a/.github/workflows/browerstack.yml b/.github/workflows/browerstack.yml index 2da8b7f40..e009a94bd 100644 --- a/.github/workflows/browerstack.yml +++ b/.github/workflows/browerstack.yml @@ -3,8 +3,7 @@ name: BrowserStack CI on: push: branches: [ ios-migrate ] - pull_request: - branches: [ ios-migrate ] + env: GOPRIVATE: github.com/getlantern diff --git a/.github/workflows/build-darwin.yml b/.github/workflows/build-darwin.yml new file mode 100644 index 000000000..9dbe0f357 --- /dev/null +++ b/.github/workflows/build-darwin.yml @@ -0,0 +1,150 @@ +name: Build Darwin +on: + workflow_call: + inputs: + version_file: + type: string + required: true + version: + type: string + required: true + prefix: + type: string + required: true + +env: + GOPRIVATE: github.com/getlantern + S3_BUCKET: lantern +jobs: + build-darwin: + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + version_file: ${{ inputs.version_file }} + prefix: ${{ inputs.prefix }} + AC_USERNAME: accounts@getlantern.org + AC_PASSWORD: ${{ secrets.AC_PASSWORD }} + runs-on: macos-13 + steps: + - uses: actions/checkout@v3 + with: + lfs: true + + - name: Pull LFS objects + run: git lfs pull + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: 1.21 + + - name: Setup Xcode version + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: 14.3.1 + + - name: Granting private modules access + run: | + git config --global url."https://${{ secrets.GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" + + - name: Repo access + run: | + mkdir /tmp/cache + echo "machine github.com login ${{ secrets.GH_TOKEN }} password x-oauth-basic" > /tmp/cache/.netrc + chmod 600 /tmp/cache/.netrc + + - name: Setup Sentry CLI + uses: mathieu-bour/setup-sentry-cli@v1 + with: + version: latest + token: ${{ SECRETS.SENTRY_TOKEN }} # from GitHub secrets + organization: getlantern + project: android + + - name: Build liblantern.dylib + run: go build -buildmode=c-shared -o desktop/liblantern.dylib desktop/lib.go + + - uses: actions/upload-artifact@v3 + with: + name: libgo-mac-build + if-no-files-found: error + path: | + desktop/liblantern.dylib + + # Install Flutter + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.13.9' + channel: "stable" + + - run: flutter --version + + - name: Setup protoc + uses: arduino/setup-protoc@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Activate protoc-gen-dart plugin + run: | + dart pub global activate protoc_plugin + + - name: Build Flutter app + run: flutter build macos --release + + - uses: actions/setup-node@v4 + with: + node-version: latest + + - name: Install darwin installer dependencies + run: | + npm install -g appdmg + brew tap joshdk/tap + brew install joshdk/tap/retry + brew install imagemagick + + - name: Build darwin installer + run: | + echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12 + security create-keychain -p temporaty-password build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p temporaty-password build.keychain + security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PWD -T /usr/bin/codesign + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k temporaty-password build.keychain + make package-darwin + env: + VERSION: "${{ env.version }}" + MACOS_CERTIFICATE: ${{ secrets.MACOS_CERT }} + MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERT_PASS }} + + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: Install s3cmd + run: pip install s3cmd + + - name: Set s3cmd permissions + run: | + echo "[default]" > "$HOME/.s3cfg" + echo "access_key = ${{ secrets.AWS_ACCESS_KEY }}" >> "$HOME/.s3cfg" + echo "secret_key = ${{ secrets.AWS_SECRET_KEY }}" >> "$HOME/.s3cfg" + + - uses: actions/upload-artifact@v3 + with: + name: osx-build + retention-days: 2 + path: | + lantern-installer.dmg + + - name: Push binaries to s3 + env: + VERSION: "${{ env.version }}" + DMG: "${{ env.prefix }}-${{ env.version }}.dmg" + run: | + mv lantern-installer.dmg "$DMG" + cp "$DMG" ${{ env.prefix }}.dmg + echo ${{ env.version }} > ${{ env.version_file }} + shasum -a 256 "$DMG" | cut -d " " -f 1 > "$DMG".sha256 + cp "$DMG".sha256 ${{ env.prefix }}.dmg.sha256 + s3cmd put --acl-public "$DMG" ${{ env.version_file }} "$DMG".sha256 ${{ env.prefix }}.dmg.sha256 ${{ env.prefix }}.dmg "s3://lantern" \ No newline at end of file diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml new file mode 100644 index 000000000..a8ffcaf71 --- /dev/null +++ b/.github/workflows/build-linux.yml @@ -0,0 +1,119 @@ +name: Build Linux +on: + workflow_call: + inputs: + version: + type: string + required: true + prefix: + type: string + required: true + dist-suffix: # "arm64" or "amd64" + type: string + required: true + +jobs: + build-linux: + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Granting private modules access + run: git config --global url."https://${{ secrets.GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" + - name: Repo access + run: | + mkdir /tmp/cache + echo "machine github.com login ${{ secrets.GH_TOKEN }} password x-oauth-basic" > /tmp/cache/.netrc + chmod 600 /tmp/cache/.netrc + + - name: Install dependencies + run: | + sudo apt-get install -y file build-essential pkg-config + sudo apt-get install -y libunwind-dev libstdc++-12-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-d cmake + sudo apt-get install -y libgtk-3-0 libblkid1 liblzma5 + sudo apt-get install -y libpcap-dev libgtk-3-dev libayatana-appindicator3-dev ruby ruby-dev && sudo gem install bundler -v 2.2.26 + + - uses: actions/setup-go@v3 + with: + go-version: 1.21 + + - name: Build + env: + VERSION: ${{ inputs.version }} + run: | + make linux-amd64 + + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install s3cmd + run: pip install s3cmd + + - name: Set s3cmd permissions + run: | + echo "[default]" > "$HOME/.s3cfg" + echo "access_key = ${{ secrets.AWS_ACCESS_KEY }}" >> "$HOME/.s3cfg" + echo "secret_key = ${{ secrets.AWS_SECRET_KEY }}" >> "$HOME/.s3cfg" + + # Install Flutter + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.13.9' + channel: "stable" + + - run: flutter --version + + - name: Setup protoc + uses: arduino/setup-protoc@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Activate protoc-gen-dart plugin + run: | + dart pub global activate protoc_plugin + + - uses: seanmiddleditch/gha-setup-ninja@master + + - name: Build Flutter app + run: flutter build linux + + - name: Build installer + run: | + cp liblantern.so "build/linux/${{inputs.dist-suffix}}/release/bundle" + VERSION="${{ inputs.version }}" make "package-linux-${{inputs.dist-suffix}}" + + - uses: actions/upload-artifact@v3 + with: + name: linux-build + path: | + lantern_${{inputs.version}}_x64.deb + + - name: Push binaries to s3 + + env: + VERSION: "${{ inputs.version }}" + dist_versionless: "${{inputs.prefix}}-64-bit.deb" + dist: "${{inputs.prefix}}-${{inputs.version}}-64-bit.deb" + update: "lantern_update_linux_x64-${{inputs.version}}.bz2" + dist_source: "lantern_${{inputs.version}}_x64.deb" + update_source: lantern_update_linux_x64.bz2 + + run: | + ls -l + mv ${{ env.dist_source }} ${{ env.dist }} + mv ${{ env.update_source }} ${{ env.update }} + cp ${{ env.dist }} ${{ env.dist_versionless }} + + shasum -a 256 ${{ env.dist }} | cut -d " " -f 1 > ${{ env.dist }}.sha256 + shasum -a 256 ${{ env.update }} | cut -d " " -f 1 > ${{ env.update }}.sha256 + cp ${{ env.dist }}.sha256 ${{ env.dist_versionless }}.sha256 + ls -l + + s3cmd put --acl-public ${{ env.dist }} ${{ env.update }} ${{ env.update }}.sha256 ${{ env.dist }}.sha256 ${{ env.dist_versionless }}.sha256 ${{ env.dist_versionless }} "s3://lantern" diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml new file mode 100644 index 000000000..fc4a7d104 --- /dev/null +++ b/.github/workflows/build-windows.yml @@ -0,0 +1,299 @@ +name: Build Windows + +on: + workflow_call: + inputs: + version: + type: string + required: true + prefix: + type: string + required: true + build-suffix: # "64" or "" + type: string + required: false + dist-suffix: # "64-bit" or "32-bit" + type: string + required: true + update-suffix: # "x64" or "386" + type: string + required: true + arch: + type: string + required: true + installer-suffix: # "-x64" or "" + type: string + required: false + +env: + GOPRIVATE: github.com/getlantern + S3_BUCKET: lantern +jobs: + build-desktop: + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + with: + lfs: true + + - name: Pull LFS objects + run: git lfs pull + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: 1.21 + + - name: Granting private modules access + run: | + git config --global url."https://${{ secrets.GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" + + - name: Repo access + run: | + mkdir /tmp/cache + echo "machine github.com login ${{ secrets.GH_TOKEN }} password x-oauth-basic" > /tmp/cache/.netrc + chmod 600 /tmp/cache/.netrc + + - name: Setup Sentry CLI + uses: mathieu-bour/setup-sentry-cli@v1 + with: + version: latest + token: ${{ SECRETS.SENTRY_TOKEN }} # from GitHub secrets + organization: getlantern + project: android + + - name: Install dependencies + run: | + sudo apt-get install -y file build-essential pkg-config + sudo apt-get install -y mingw-w64 nsis + + - name: Build liblantern.dll + if: ${{inputs.update-suffix == '386'}} + run: | + make windows + + - name: Build liblantern.dll + if: ${{inputs.update-suffix == 'x64'}} + run: | + make windows64 + + - uses: actions/upload-artifact@v3 + with: + name: libgo-windows-${{inputs.update-suffix}}-build + if-no-files-found: error + path: | + liblantern.dll + + - uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install s3cmd + run: pip install s3cmd + + - name: Set s3cmd permissions + run: | + echo "[default]" > "$HOME/.s3cfg" + echo "access_key = ${{ secrets.AWS_ACCESS_KEY }}" >> "$HOME/.s3cfg" + echo "secret_key = ${{ secrets.AWS_SECRET_KEY }}" >> "$HOME/.s3cfg" + + - name: Push libgo to S3 + run: s3cmd put --acl-public liblantern.dll "s3://lantern/liblantern-${{inputs.update-suffix}}.dll" + + build-windows: + needs: build-desktop + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + with: + lfs: true + + # Install Flutter + - uses: subosito/flutter-action@v2 + with: + channel: "stable" + + - run: flutter --version + + - name: Setup protoc + uses: arduino/setup-protoc@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Activate protoc-gen-dart plugin + run: | + dart pub global activate protoc_plugin + + - name: Download the win build output + uses: actions/download-artifact@v3 + with: + name: libgo-windows-${{inputs.update-suffix}}-build + + - name: Build Flutter app + run: flutter build windows + + - name: Sign liblantern.dll with Azure Code Signing + uses: azure/azure-code-signing-action@v0.2.22 + with: + azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} + azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} + azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} + endpoint: https://wus2.codesigning.azure.net/ + code-signing-account-name: code-signing + certificate-profile-name: Lantern + files-folder: ${{ github.workspace }}\ + files-folder-filter: dll + file-digest: SHA256 + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 + + - uses: actions/upload-artifact@v3 + with: + if-no-files-found: error + name: windows${{inputs.build-suffix}}-build-signed + path: | + liblantern.dll + + - name: Create archive + run: | + ls build/windows + cp liblantern.dll "build/windows/${{inputs.arch}}/runner/Release" + Compress-Archive "build/windows/${{inputs.arch}}/runner/Release" lantern.zip + + - uses: actions/upload-artifact@v3 + with: + if-no-files-found: error + name: windows${{inputs.build-suffix}}-build + path: lantern.zip + + build-installer: + needs: build-windows + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: ubuntu-20.04 + + steps: + - name: Install dependencies + run: | + sudo apt-get install -y file build-essential pkg-config + sudo apt-get install -y mingw-w64 nsis + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: windows${{inputs.build-suffix}}-build + - name: Make installer + run: | + pwd + unzip lantern.zip + cp installer-resources-lantern/.packaged-lantern.yaml installer-resources-lantern/windows/.packaged-lantern.yaml + cp installer-resources-lantern/lantern.yaml installer-resources-lantern/windows/lantern.yaml + cp -r Release/* installer-resources-lantern/windows + makensis -V1 -DVERSION=${{ inputs.version }} -DAPP_NAME=lantern.exe -DOUT_FILE="lantern-installer${{inputs.installer-suffix}}.exe" installer-resources-lantern/windows/lantern.nsi + mv installer-resources-lantern/windows/lantern-installer${{inputs.installer-suffix}}.exe lantern-installer${{inputs.installer-suffix}}.exe + + - uses: actions/upload-artifact@v3 + with: + if-no-files-found: error + name: windows${{inputs.build-suffix}}-installer-unsigned + path: lantern-installer${{inputs.installer-suffix}}.exe + + sign-installer: + needs: build-installer + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: windows-latest + steps: + - name: Download the win build output + uses: actions/download-artifact@v3 + with: + name: windows${{inputs.build-suffix}}-installer-unsigned + + - name: Sign EXE with Azure Code Signing + uses: azure/azure-code-signing-action@v0.2.22 + with: + azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} + azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} + azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} + endpoint: https://wus2.codesigning.azure.net/ + code-signing-account-name: code-signing + certificate-profile-name: Lantern + files-folder: ${{ github.workspace }}\ + files-folder-filter: exe + file-digest: SHA256 + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 + - name: Rename file + run: ren lantern-installer-unsigned.exe lantern-installer${{inputs.installer-suffix}}.exe + + - uses: actions/upload-artifact@v3 + with: + name: windows${{inputs.build-suffix}}-installer-signed + path: | + lantern-installer${{inputs.installer-suffix}}.exe + + upload-windows: + needs: build-installer + permissions: + contents: "read" + id-token: "write" + env: + version: ${{ inputs.version }} + prefix: ${{ inputs.prefix }} + runs-on: ubuntu-20.04 + + steps: + - name: Download the artifact + uses: actions/download-artifact@v3 + with: + name: windows${{inputs.build-suffix}}-installer-signed + + - name: Install s3cmd + run: pip install s3cmd + + - name: Set s3cmd permissions + run: | + echo "[default]" > "$HOME/.s3cfg" + echo "access_key = ${{ secrets.AWS_ACCESS_KEY }}" >> "$HOME/.s3cfg" + echo "secret_key = ${{ secrets.AWS_SECRET_KEY }}" >> "$HOME/.s3cfg" + + - name: Push binaries to s3 + + env: + VERSION: "${{ inputs.version }}" + dist_versionless: "${{inputs.prefix}}-${{inputs.dist-suffix}}.exe" + dist: "${{inputs.prefix}}-${{inputs.version}}-${{inputs.dist-suffix}}.exe" + update: "lantern_update_windows_${{inputs.update-suffix}}-${{inputs.version}}.bz2" + + run: | + ls -l + cat lantern.exe | bzip2 > ${{ env.update }} + mv lantern-installer${{inputs.installer-suffix}}.exe ${{ env.dist }} + cp ${{ env.dist }} ${{ env.dist_versionless }} + + shasum -a 256 ${{ env.dist }} | cut -d " " -f 1 > ${{ env.dist }}.sha256 + shasum -a 256 ${{ env.update }} | cut -d " " -f 1 > ${{ env.update }}.sha256 + cp ${{ env.dist }}.sha256 ${{ env.dist_versionless }}.sha256 + ls -l + + s3cmd put --acl-public ${{ env.dist }} ${{ env.update }} ${{ env.update }}.sha256 ${{ env.dist }}.sha256 ${{ env.dist_versionless }}.sha256 ${{ env.dist_versionless }} "s3://lantern" + diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 840ad2e2a..74355fd60 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -26,6 +26,7 @@ jobs: git config --global url."https://${{ secrets.CI_PRIVATE_REPOS_GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" - name: Run Unit tests run: | + go mod tidy go test -failfast -coverprofile=profile.cov ./... - name: Install goveralls env: diff --git a/.github/workflows/release-changelog.yml b/.github/workflows/release-changelog.yml new file mode 100644 index 000000000..14def1133 --- /dev/null +++ b/.github/workflows/release-changelog.yml @@ -0,0 +1,58 @@ +name: Release and Changelog + +on: + workflow_dispatch: + push: + tags: + # a prerelease noted by a hyphen will not trigger + - 'lantern-[0-9]+.[0-9]+.[0-9]+' + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - name: Check if release already exists + id: exists + env: + GH_TOKEN: ${{ github.token }} + run: | + echo EXISTING=$(gh api \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${{ github.repository }}/releases \ + | jq -r '.[].tag_name' | grep -c "${{ github.ref_name }}") >> "$GITHUB_OUTPUT" + + - name: Create release if none exists + if: ${{ steps.exists.outputs.EXISTING < 1 }} + env: + GH_TOKEN: ${{ github.token }} + # https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release + run: | + gh api -i \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${{ github.repository }}/releases \ + -f tag_name='${{ github.ref_name }}' \ + -f name='Release ${{ github.ref_name }}' \ + -f body='🤖 Autogenerated changelog for ${{ github.repository }} ${{ github.ref_name }}' \ + -F draft=false \ + -F prerelease=false \ + -F generate_release_notes=true + + - name: Strip repository name of owner + if: ${{ steps.exists.outputs.EXISTING < 1 }} + id: repo + run: | + echo "REPO_NAME=$(echo ${{ github.repository }} | sed s/'${{ github.repository_owner }}\/'//g)" >> "$GITHUB_OUTPUT" + + - name: Trigger QC Checklist in customer-service repo + if: ${{ steps.exists.outputs.EXISTING < 1 }} + env: + GH_GRANTS_TOKEN: ${{ secrets.GH_GRANTS_TOKEN }} + run: | + echo "Sending QC Checklist trigger for ${{ steps.repo.outputs.REPO_NAME }} ${{ github.ref_name }}" + curl -i -H "Accept: application/vnd.github.everest-preview+json" \ + -H "Authorization: token $GH_GRANTS_TOKEN" \ + --request POST --data '{"event_type": "TRIGGER_QC_CHECKLIST", "client_payload": { "platform": "${{ steps.repo.outputs.REPO_NAME }}", "version": "${{ github.ref_name }}"}}' \ + https://api.github.com/repos/getlantern/customer-support/dispatches diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6cb7682ee..fb0d24198 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,10 +1,8 @@ name: Publish releases on: - workflow_dispatch: - -permissions: - contents: read + push: + branches: [ atavism/ios-migrate-desktop ] env: GOPRIVATE: github.com/getlantern @@ -51,6 +49,50 @@ jobs: print(f'::set-output name=version::{version}') print(f'::set-output name=prefix::{li}') print(f'::set-output name=version_file::{vf}') + + build-linux: + uses: ./.github/workflows/build-linux.yml + secrets: inherit + needs: set-version + with: + version: ${{ needs.set-version.outputs.version }} + prefix: ${{ needs.set-version.outputs.prefix }} + dist-suffix: x64 + + build-windows-x32: + uses: ./.github/workflows/build-windows.yml + secrets: inherit + needs: set-version + with: + version: ${{ needs.set-version.outputs.version }} + prefix: ${{ needs.set-version.outputs.prefix }} + dist-suffix: 32-bit + installer-suffix: -x32 + update-suffix: 386 + arch: x32 + + build-windows-x64: + uses: ./.github/workflows/build-windows.yml + secrets: inherit + needs: set-version + with: + version: ${{ needs.set-version.outputs.version }} + prefix: ${{ needs.set-version.outputs.prefix }} + build-suffix: 64 + dist-suffix: 64-bit + update-suffix: x64 + installer-suffix: -x64 + arch: x64 + + build-darwin: + uses: ./.github/workflows/build-darwin.yml + secrets: inherit + needs: set-version + with: + version: ${{ needs.set-version.outputs.version }} + version_file: ${{ needs.set-version.outputs.version_file }} + prefix: ${{ needs.set-version.outputs.prefix }} + build-android: needs: set-version env: @@ -70,7 +112,7 @@ jobs: # Install Flutter - uses: subosito/flutter-action@v2 with: - flutter-version: "3.10.5" + flutter-version: '3.13.9' channel: "stable" - run: flutter --version diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..0b7a796e6 --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'fpm', '~> 1.13.1' diff --git a/Makefile b/Makefile index 0a039de59..d03082e22 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,13 @@ INTERNALSDK_FRAMEWORK_DIR = ios/internalsdk INTERNALSDK_FRAMEWORK_NAME = Internalsdk.xcframework +%.pb.go: %.proto + go build -o build/protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go codegen: protos routes # You can install the dart protoc support by running 'dart pub global activate protoc_plugin' -protos: lib/messaging/protos_flutteronly/messaging.pb.dart lib/vpn/protos_shared/vpn.pb.dart +protos: lib/vpn/protos_shared/vpn.pb.dart lib/messaging/protos_flutteronly/messaging.pb.dart: protos_flutteronly/messaging.proto @protoc --dart_out=./lib/messaging --plugin=protoc-gen-dart=$$HOME/.pub-cache/bin/protoc-gen-dart protos_flutteronly/messaging.proto @@ -50,6 +52,13 @@ INSTALLER_NAME ?= lantern-installer CHANGELOG_NAME ?= CHANGELOG.md CHANGELOG_MIN_VERSION ?= 5.0.0 +PACKAGE_MAINTAINER := Lantern Team +PACKAGE_VENDOR := Brave New Software Project, Inc +PACKAGE_URL := https://lantern.io + +APP_DESCRIPTION := Censorship circumvention tool +APP_EXTENDED_DESCRIPTION := Lantern allows you to access sites blocked by internet censorship.\nWhen you run it, Lantern reroutes traffic to selected domains through servers located where such domains are uncensored. + get-command = $(shell which="$$(which $(1) 2> /dev/null)" && if [[ ! -z "$$which" ]]; then printf %q "$$which"; fi) GO := $(call get-command,go) @@ -60,8 +69,11 @@ AWSCLI := $(call get-command,aws) CHANGE := $(call get-command,git-chglog) PIP := $(call get-command,pip) WGET := $(call get-command,wget) +RUBY := $(call get-command,ruby) APPDMG := $(call get-command,appdmg) +RETRY := $(call get-command,retry) MAGICK := $(call get-command,magick) +MINGW := $(call get-command,i686-w64-mingw32-gcc) BUNDLER := $(call get-command,bundle) ADB := $(call get-command,adb) OPENSSL := $(call get-command,openssl) @@ -85,7 +97,7 @@ STAGING = false UPDATE_SERVER_URL ?= VERSION ?= 9999.99.99 # Note - we don't bother stripping symbols or DWARF table as Android's packaging seems to take care of that for us -LDFLAGS := -X github.com/getlantern/android-lantern/internalsdk.RevisionDate=$(REVISION_DATE) -X github.com/getlantern/android-lantern/internalsdk.ApplicationVersion=$(VERSION) -X github.com/getlantern/flashlight/v7/common.StagingMode=$(STAGING) +LDFLAGS := -X github.com/getlantern/lantern-client/internalsdk.RevisionDate=$(REVISION_DATE) -X github.com/getlantern/lantern-client/internalsdk.ApplicationVersion=$(VERSION) -X github.com/getlantern/flashlight/v7/common.StagingMode=$(STAGING) # Ref https://pkg.go.dev/cmd/link # -w omits the DWARF table @@ -120,6 +132,24 @@ SENTRY_PROJECT_IOS=lantern-ios DWARF_DSYM_FOLDER_PATH=$(shell pwd)/build/ios/Release-prod-iphoneos/Runner.app.dSYM INFO_PLIST := ios/Runner/Info.plist +APP ?= lantern +CAPITALIZED_APP := Lantern +DARWIN_BINARY_NAME ?= desktop/liblantern.dylib +DARWIN_APP_NAME ?= $(CAPITALIZED_APP).app +INSTALLER_RESOURCES ?= installer-resources-$(APP) +INSTALLER_NAME ?= $(APP)-installer +WINDOWS_BINARY_NAME ?= liblantern.dll +WINDOWS_APP_NAME ?= $(APP).exe +WINDOWS64_BINARY_NAME ?= liblantern.dll +WINDOWS64_APP_NAME ?= $(APP)_x64.exe + +LINUX_BINARY_NAME_64 ?= liblantern.so +LINUX_BINARY_NAME_32 ?= $(APP)_linux_386 + +APP_YAML := lantern.yaml +APP_YAML_PATH := installer-resources-lantern/$(APP_YAML) +PACKAGED_YAML := .packaged-$(APP_YAML) + # By default, build APKs containing support for ARM only 32 bit. Since we're using multi-architecture # app bundles for play store, we no longer need to include 64 bit in our APKs that we distribute. @@ -180,7 +210,9 @@ MOBILE_TESTS_APK := $(BASE_MOBILE_DIR)/build/app/outputs/apk/autoTest/debug/app- CI_APK_PATH := $(BASE_MOBILE_DIR)/build/app/outputs/flutter-apk/app-prod-debug.apk BUILD_TAGS ?= BUILD_TAGS += ' lantern' -GO_SOURCES := go.mod go.sum $(shell find internalsdk -type f -name "*.go") +PROTO_SOURCES = $(shell find . -name '*.proto' -not -path './vendor/*') +GENERATED_PROTO_SOURCES = $(shell echo "$(PROTO_SOURCES)" | sed 's/\.proto/\.pb\.go/g') +GO_SOURCES := $(GENERATED_PROTO_SOURCES) go.mod go.sum $(shell find internalsdk -type f -name "*.go") MOBILE_SOURCES := $(shell find Makefile android assets go.mod go.sum lib protos* -type f -not -path "*/libs/$(ANDROID_LIB_BASE)*" -not -iname "router.gr.dart") @@ -211,6 +243,44 @@ define check-go-version fi endef +define fpm-debian-build = + echo "Running fpm-debian-build" && \ + PKG_ARCH=$1 && \ + WORKDIR=$$(mktemp -dt "$$(basename $$0).XXXXXXXXXX") && \ + INSTALLER_RESOURCES=./$(INSTALLER_RESOURCES)/linux && \ + \ + mkdir -p $$WORKDIR/usr/bin && \ + mkdir -p $$WORKDIR/usr/lib/$(APP) && \ + mkdir -p $$WORKDIR/usr/share/applications && \ + mkdir -p $$WORKDIR/usr/share/icons/hicolor/128x128/apps && \ + mkdir -p $$WORKDIR/usr/share/doc/$(APP) && \ + chmod -R 755 $$WORKDIR && \ + \ + cp $$INSTALLER_RESOURCES/deb-copyright $$WORKDIR/usr/share/doc/$(APP)/copyright && \ + cp $$INSTALLER_RESOURCES/$(APP).desktop $$WORKDIR/usr/share/applications && \ + cp $$INSTALLER_RESOURCES/icon128x128on.png $$WORKDIR/usr/share/icons/hicolor/128x128/apps/$(APP).png && \ + \ + cp build/linux/$$PKG_ARCH/release/bundle/$(APP) $$WORKDIR/usr/lib/$(APP)/$(APP)-binary && \ + cp $$INSTALLER_RESOURCES/$(APP).sh $$WORKDIR/usr/lib/$(APP) && \ + \ + chmod -x $$WORKDIR/usr/lib/$(APP)/$(APP)-binary && \ + chmod +x $$WORKDIR/usr/lib/$(APP)/$(APP).sh && \ + \ + ln -s /usr/lib/$(APP)/$(APP).sh $$WORKDIR/usr/bin/$(APP) && \ + rm -f $$WORKDIR/usr/lib/$(APP)/$(PACKAGED_YAML) && \ + rm -f $$WORKDIR/usr/lib/$(APP)/$(APP_YAML) && \ + cp $(INSTALLER_RESOURCES)/$(PACKAGED_YAML) $$WORKDIR/usr/lib/$(APP)/$(PACKAGED_YAML) && \ + cp $(APP_YAML_PATH) $$WORKDIR/usr/lib/$(APP)/$(APP_YAML) && \ + \ + cat $$WORKDIR/usr/lib/$(APP)/$(APP)-binary | bzip2 > $(APP)_update_linux_$$PKG_ARCH.bz2 && \ + bundle install && \ + fpm -a $$PKG_ARCH -s dir -t deb -n $(APP) -v $$VERSION -m "$(PACKAGE_MAINTAINER)" --description "$(APP_DESCRIPTION)\n$(APP_EXTENDED_DESCRIPTION)" --category net --license "Apache-2.0" --vendor "$(PACKAGE_VENDOR)" --url $(PACKAGE_URL) --deb-compression gz -f -C $$WORKDIR usr; +endef + +define osxcodesign + codesign --options runtime --strict --timestamp --force --deep -r="designated => anchor trusted and identifier com.getlantern.lantern" -s "Developer ID Application: Innovate Labs LLC (4FYC28AXA2)" -v $(1) +endef + guard-%: @ if [ -z '${${*}}' ]; then echo 'Environment variable $* not set' && exit 1; fi @@ -261,10 +331,22 @@ require-wget: require-magick: @if [[ -z "$(MAGICK)" ]]; then echo 'Missing "magick" command. Try brew install imagemagick.'; exit 1; fi +.PHONY: require-mingw +require-mingw: + @if [[ -z "$(MINGW)" ]]; then echo 'Missing "mingw" command. Try "brew install mingw-w64."'; exit 1; fi + .PHONY: require-sentry require-sentry: @if [[ -z "$(SENTRY)" ]]; then echo 'Missing "sentry-cli" command. See sentry.io for installation instructions.'; exit 1; fi +.PHONY: require-appdmg +require-appdmg: + @if [[ -z "$(APPDMG)" ]]; then echo 'Missing "appdmg" command. Try sudo npm install -g appdmg.'; exit 1; fi + +.PHONY: require-retry +require-retry: + @if [[ -z "$(RETRY)" ]]; then echo 'Missing retry command. Try go install github.com/joshdk/retry'; exit 1; fi + release-autoupdate: require-version @curl https://s3.amazonaws.com/lantern/lantern-installer.apk | bzip2 > update_android_arm.bz2 && \ $(RUBY) ./create_or_update_release.rb getlantern lantern $$VERSION update_android_arm.bz2 @@ -282,7 +364,7 @@ $(ANDROID_LIB): -androidapi=23 \ -ldflags="$(LDFLAGS)" \ $(GOMOBILE_EXTRA_BUILD_FLAGS) \ - github.com/getlantern/android-lantern/internalsdk github.com/getlantern/pathdb/testsupport github.com/getlantern/pathdb/minisql + github.com/getlantern/lantern-client/internalsdk github.com/getlantern/pathdb/testsupport github.com/getlantern/pathdb/minisql $(MOBILE_ANDROID_LIB): $(ANDROID_LIB) mkdir -p $(MOBILE_LIBS) && \ @@ -386,6 +468,161 @@ ios-release:set-version build-framework echo "iOS IPA generated under: $$IPA_PATH"; \ open "$$IPA_PATH" +.PHONY: echo-build-tags +echo-build-tags: ## Prints build tags and extra ldflags. Run this with `REPLICA=1 make echo-build-tags` for example to see how it changes + @if [[ -z "$$VERSION" ]]; then \ + echo "** VERSION was not set, using default version. This is OK while in development."; \ + fi + @echo "Build tags: $(BUILD_TAGS)" + @echo "Extra ldflags: $(EXTRA_LDFLAGS)" + @echo "Binary name: $(BINARY_NAME)" + @if [[ "$$GOOS" ]]; then echo "GOOS: $(GOOS)"; fi + @if [[ "$$GOARCH" ]]; then echo "GOARCH: $(GOARCH)"; fi + @if [[ "$$CC" ]]; then echo "CC: $(CC)"; fi + @if [[ "$$CXX" ]]; then echo "CXX: $(CXX)"; fi + +.PHONY: desktop-app +desktop-app: export GOPRIVATE = github.com/getlantern +desktop-app: export CGO_ENABLED = 1 +desktop-app: echo-build-tags + go build $(BUILD_RACE) $(GO_BUILD_FLAGS) -o "$(BINARY_NAME)" -tags="$(BUILD_TAGS)" -ldflags="$(LDFLAGS) $(EXTRA_LDFLAGS)" desktop/lib.go + +.PHONY: linux-amd64 +linux-amd64: $(LINUX_BINARY_NAME_64) ## Build lantern for linux-amd64 + +.PHONY: package-linux-x64 +package-linux-x64: require-version + @$(call fpm-debian-build,"x64") + @echo "-> $(APP)_$(VERSION)_x64.deb" + +.PHONY: package-linux-arm64 +package-linux-amd64: require-version + @$(call fpm-debian-build,"arm64") + @echo "-> $(APP)_$(VERSION)_arm64.deb" + +$(LINUX_BINARY_NAME_64): export GOOS = linux +$(LINUX_BINARY_NAME_64): export GOARCH = amd64 +$(LINUX_BINARY_NAME_64): export BINARY_NAME = $(LINUX_BINARY_NAME_64) +$(LINUX_BINARY_NAME_64): export EXTRA_LDFLAGS += -linkmode external -s -w +$(LINUX_BINARY_NAME_64): export GO_BUILD_FLAGS += -a +$(LINUX_BINARY_NAME_64): export Environment = production +$(LINUX_BINARY_NAME_64): desktop-app + +.PHONY: windows +windows: require-mingw $(WINDOWS_BINARY_NAME) ## Build lantern for windows + +$(WINDOWS_BINARY_NAME): export CXX = i686-w64-mingw32-g++ +$(WINDOWS_BINARY_NAME): export CC = i686-w64-mingw32-gcc +$(WINDOWS_BINARY_NAME): export CGO_LDFLAGS = -static +$(WINDOWS_BINARY_NAME): export GOOS = windows +$(WINDOWS_BINARY_NAME): export GOARCH = 386 +$(WINDOWS_BINARY_NAME): export BINARY_NAME = $(WINDOWS_BINARY_NAME) +$(WINDOWS_BINARY_NAME): export BUILD_TAGS += walk_use_cgo +$(WINDOWS_BINARY_NAME): export EXTRA_LDFLAGS += +$(WINDOWS_BINARY_NAME): export GO_BUILD_FLAGS += -buildmode=c-shared +$(WINDOWS_BINARY_NAME): export BUILD_RACE = +$(WINDOWS_BINARY_NAME): export Environment = production +$(WINDOWS_BINARY_NAME): desktop-app + +.PHONY: windows64 +windows64: require-mingw $(WINDOWS64_BINARY_NAME) ## Build lantern for windows + +$(WINDOWS64_BINARY_NAME): export CXX = x86_64-w64-mingw32-g++ +$(WINDOWS64_BINARY_NAME): export CC = x86_64-w64-mingw32-gcc +$(WINDOWS64_BINARY_NAME): export CGO_LDFLAGS = -static +$(WINDOWS64_BINARY_NAME): export GOOS = windows +$(WINDOWS64_BINARY_NAME): export GOARCH = amd64 +$(WINDOWS64_BINARY_NAME): export BINARY_NAME = $(WINDOWS64_BINARY_NAME) +$(WINDOWS64_BINARY_NAME): export BUILD_TAGS += walk_use_cgo +$(WINDOWS64_BINARY_NAME): export EXTRA_LDFLAGS += +$(WINDOWS64_BINARY_NAME): export GO_BUILD_FLAGS += -buildmode=c-shared +$(WINDOWS64_BINARY_NAME): export BUILD_RACE = +$(WINDOWS64_BINARY_NAME): desktop-app + +## Darwin +.PHONY: darwin +darwin: $(DARWIN_BINARY_NAME) ## Build lantern for darwin (can only be run from a darwin machine) + +$(DARWIN_BINARY_NAME): export BINARY_NAME = $(DARWIN_BINARY_NAME) +$(DARWIN_BINARY_NAME): export GOOS = darwin +$(DARWIN_BINARY_NAME): export GOARCH = amd64 +$(DARWIN_BINARY_NAME): export GO_BUILD_FLAGS += -a +$(DARWIN_BINARY_NAME): export EXTRA_LDFLAGS += -s +$(DARWIN_BINARY_NAME): echo-build-tags + @echo "Building darwin/amd64..." && \ + export OSX_DEV_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(OSX_MIN_VERSION).sdk && \ + if [[ "$$(uname -s)" == "Darwin" ]]; then \ + if [[ -d $$OSX_DEV_SDK ]]; then \ + export CGO_CFLAGS="--sysroot $$OSX_DEV_SDK" && \ + export CGO_LDFLAGS="--sysroot $$OSX_DEV_SDK"; \ + fi && \ + MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION) \ + make desktop-app; \ + else \ + echo "-> Skipped: Can not compile $(CAPITALIZED_APP) for OSX on a non-OSX host."; \ + fi + +$(INSTALLER_NAME).dmg: require-version require-appdmg require-retry require-magick + @echo "Generating distribution package for darwin/amd64..." && \ + if [[ "$$(uname -s)" == "Darwin" ]]; then \ + INSTALLER_RESOURCES="$(INSTALLER_RESOURCES)/darwin" && \ + rm -rf $(DARWIN_APP_NAME) && \ + cp -r $$INSTALLER_RESOURCES/$(DARWIN_APP_NAME)_template $(DARWIN_APP_NAME) && \ + mkdir $(DARWIN_APP_NAME)/Contents/MacOS && \ + cp -a build/macos/Build/Products/Release/Lantern.app/Contents/* $(DARWIN_APP_NAME)/Contents/ && \ + ls build/macos/Build/Products/Release/Lantern.app/Contents && \ + cp $(DARWIN_BINARY_NAME) build/macos/Build/Products/Release/Lantern.app/Contents/Frameworks && \ + $(call osxcodesign,$(DARWIN_APP_NAME)/Contents/Frameworks/liblantern.dylib) && \ + mkdir $(DARWIN_APP_NAME)/Contents/Resources/en.lproj && \ + cp $(INSTALLER_RESOURCES)/$(PACKAGED_YAML) $(DARWIN_APP_NAME)/Contents/Resources/en.lproj/$(PACKAGED_YAML) && \ + cp $(APP_YAML_PATH) $(DARWIN_APP_NAME)/Contents/Resources/en.lproj/$(APP_YAML) && \ + cat $(DARWIN_APP_NAME)/Contents/MacOS/Lantern | bzip2 > $(APP)_update_darwin_amd64.bz2 && \ + ls -l $(DARWIN_BINARY_NAME) $(APP)_update_darwin_amd64.bz2 && \ + rm -rf $(INSTALLER_NAME).dmg && \ + sed "s/__VERSION__/$$VERSION/g" $$INSTALLER_RESOURCES/dmgbackground.svg > $$INSTALLER_RESOURCES/dmgbackground_versioned.svg && \ + $(MAGICK) -size 600x400 $$INSTALLER_RESOURCES/dmgbackground_versioned.svg $$INSTALLER_RESOURCES/dmgbackground.png && \ + sed "s/__VERSION__/$$VERSION/g" $$INSTALLER_RESOURCES/$(APP).dmg.json > $$INSTALLER_RESOURCES/$(APP)_versioned.dmg.json && \ + $(call osxcodesign,$(DARWIN_APP_NAME)/Contents/MacOS/Lantern) && \ + $(call osxcodesign,$(DARWIN_APP_NAME)) && \ + retry -attempts 5 $(APPDMG) --quiet $$INSTALLER_RESOURCES/$(APP)_versioned.dmg.json $(INSTALLER_NAME).dmg && \ + mv $(INSTALLER_NAME).dmg $(CAPITALIZED_APP).dmg.zlib && \ + hdiutil convert -quiet -format UDBZ -o $(INSTALLER_NAME).dmg $(CAPITALIZED_APP).dmg.zlib && \ + $(call osxcodesign,$(INSTALLER_NAME).dmg) && \ + rm $(CAPITALIZED_APP).dmg.zlib; \ + else \ + echo "-> Skipped: Can not generate a package on a non-OSX host."; \ + fi; + +.PHONY: darwin-installer +darwin-installer: $(INSTALLER_NAME).dmg + +.PHONY: notarize-darwin +notarize-darwin: darwin-installer require-ac-username require-ac-password + @echo "Notarizing distribution package for darwin/amd64..." && \ + if [[ "$$(uname -s)" == "Darwin" ]]; then \ + ./$(INSTALLER_RESOURCES)/tools/notarize-darwin.py \ + -u $$AC_USERNAME \ + -p $$AC_PASSWORD \ + -a 4FYC28AXA2 \ + $(INSTALLER_NAME).dmg; \ + else \ + echo "-> Skipped: Can not notarize a package on a non-OSX host."; \ + fi; + +.PHONY: require-ac-username +require-ac-username: guard-AC_USERNAME ## App Store Connect username - needed for notarizing macOS apps. + +.PHONY: require-ac-password +require-ac-password: guard-AC_PASSWORD ## App Store Connect password - needed for notarizing macOS apps. It is recommended that this be stored in the keychain and provided like `security find-generic-password -s -w`. This must be an "app-specific password". See https://support.apple.com/en-us/HT204397. + +.PHONY: require-bundler +require-bundler: + @if [ "$(BUNDLER)" = "" ]; then \ + echo "Missing 'bundle' command. See https://rubygems.org/gems/bundler/versions/1.16.1 or just gem install bundler -v '1.16.1'" && exit 1; \ + fi + +.PHONY: package-darwin +package-darwin: darwin-installer notarize-darwin android-bundle: $(MOBILE_BUNDLE) @@ -420,10 +657,10 @@ changelog: require-version require-changelog require-app # Creates a dump of the source code lantern-android-sources-.tar.gz sourcedump: require-version here=`pwd` && \ - rm -Rf /tmp/android-lantern ; \ - mkdir -p /tmp/android-lantern && \ - cp -R LICENSE LICENSING.md android internalsdk lib protos* go.mod go.sum /tmp/android-lantern && \ - cd /tmp/android-lantern && \ + rm -Rf /tmp/lantern-client ; \ + mkdir -p /tmp/lantern-client && \ + cp -R LICENSE LICENSING.md android internalsdk lib protos* go.mod go.sum /tmp/lantern-client && \ + cd /tmp/lantern-client && \ find . -name "*_test.go" -exec rm {} \; && \ find . -name "*.jks" -exec rm {} \; && \ rm -Rf android/.idea android/sentry.properties android/.settings android/local.properties android/app/.classpath android/app/.project android/app/.settings android/app/src/androidTest android/app/src/test android/app/src/main/res android/app/libs android/.gradle android/alipaySdk-15.6.5-20190718211148/ android/app/bin android/app/.cxx android/app/google-services.json && \ @@ -445,7 +682,7 @@ build-framework: assert-go-version install-gomobile -tags='headless lantern ios' \ -ldflags="$(LDFLAGS)" \ $(GOMOBILE_EXTRA_BUILD_FLAGS) \ - github.com/getlantern/android-lantern/internalsdk github.com/getlantern/pathdb/testsupport github.com/getlantern/pathdb/minisql github.com/getlantern/flashlight/v7/ios + github.com/getlantern/lantern-client/internalsdk github.com/getlantern/pathdb/testsupport github.com/getlantern/pathdb/minisql github.com/getlantern/flashlight/v7/ios @echo "moving framework" mkdir -p $(INTERNALSDK_FRAMEWORK_DIR) mv ./$(INTERNALSDK_FRAMEWORK_NAME) $(INTERNALSDK_FRAMEWORK_DIR)/$(INTERNALSDK_FRAMEWORK_NAME) @@ -471,7 +708,3 @@ clean: rm -f `which gomobile` && \ rm -f `which gobind` rm -Rf "$(FLASHLIGHT_FRAMEWORK_PATH)" "$(INTERMEDIATE_FLASHLIGHT_FRAMEWORK_PATH)" - - - - diff --git a/README.md b/README.md index 82157cd24..ae01e112f 100644 --- a/README.md +++ b/README.md @@ -83,11 +83,11 @@ All those dependencies must be in your PATH * `flutter pub get` * `flutter run --flavor prod` -**Note**: If you're using an M1 or M2 chip, navigate to the ios folder and run `arch -x86_64 pod install` +**Note**: If you're using an M1 or M2 chip, navigate to the ios folder and run `arch -x86_64 pod install` ### 👩‍💻 Using Android Studio? No problem! -We've got you covered! If you prefer using Android Studio, we have already set up the configuration files for you. Just select the prod configuration and hit Run... Get ready to start digging! 😄🔍 +We've got you covered! If you prefer using Android Studio, we have already set up the configuration files for you. Just select the prod configuration and hit Run... Get ready to start digging! 😄🔍 You can build an emulator with `./scripts/run_avd.rb`. Here's an example run: `./scripts/run_avd.rb --level=30 --abi=x86 --use_google_apis --window`. You'll need Ruby >= 2.3 installed and `colorize` gem (i.e., `gem install colorize`). @@ -104,7 +104,7 @@ A sane terminal command (using [pidcat](https://github.com/JakeWharton/pidcat)) The core Lantern functionality is written in Go and lives in `./internalsdk`. -It is compiled from Go using [Gomobile](https://github.com/golang/mobile) to an AAR file that +It is compiled from Go using [Gomobile](https://github.com/golang/mobile) to an AAR file that #### Android For compiled code lives in `./android/app/libs` and is called `liblantern-ARCH.aar`. @@ -115,6 +115,20 @@ Package the AAR with `make android-lib ANDROID_ARCH=all` For compiled code lives in `./ios/internalsdk/` and is called `Internalsdk.xcframework`. +#### Desktop + +The desktop app lives under `desktop` .. To build the Go shared library: + +``` +CGO_ENABLED=1 GOARCH=arm64 go build -buildmode=c-shared -o desktop/liblantern.dylib desktop/lib.go +``` + +Then to run the Flutter app on macOS: + +``` +flutter run -d macOS +``` + #### Testing against Lantern's staging servers Package the AAR with `make android-lib ANDROID_ARCH=all STAGING=true` @@ -160,10 +174,10 @@ Do this to make a release build: ``` **Note**: Replace x.x.x with the version number of your release. -This will +This will - Set the version number in the info.plist file and increment the build number 1 - Upload the DSYM file to Sentry -- Open the build folder once the build is complete +- Open the build folder once the build is complete #### Android @@ -275,18 +289,18 @@ You can run integration tests from the integration_test directory against a live 1. Run the app with these additional run arguments `--dart-define=driver=true --observatory-port 8888 --disable-service-auth-codes` 2. Run the integration test as a dart application -3. When running tests in different locales, change `const simulatedLocale = 'en_US';` in `integration_test_contants.dart` to the desired locale. +3. When running tests in different locales, change `const simulatedLocale = 'en_US';` in `integration_test_contants.dart` to the desired locale. 4. Go to SETTINGS view and then run `change_language_test.dart`. 5. All tests should start with testing device showing Chats tab. 6. Start by running test `1A`. 7. A handful of tests have specific requirements, marked by a "Test requirements" comment at the start of the test: 1. `6A_scan_QR_code_test` needs another phone to do the QR scanning process with - 2. `6B_request_flow_test` requires a message request to have just been received + 2. `6B_request_flow_test` requires a message request to have just been received 3. `6C_introductions_test` requires the testing device/emulator to have received an introduction to another contact 4. `17C_verify_contact_test` requires the most recent message to have been shared in conversation with an unverified contact 8. We will have some duplicate screenshots in there - run `python3 scripts/screenshot_generation_assets/remove_dups.py [your android-lantern-path]/screenshots/` to deduplicate. 9. To generate stitched landscape images for all screenshots in a given test folder, run `python3 scripts/screenshot_generation_assets/merge_screenshots.py [your android-lantern-path]/screenshots/[a locale e.g. en_US]` - + This mechanism for running integration tests follows [this article](https://medium.com/flutter-community/hot-reload-for-flutter-integration-tests-e0478b63bd54). Using this mechanism, you can modify and rerun the integration test without having to redeploy the application. WARNING - when running with flutter driver enabled, the on-screen keyboard does not work. @@ -295,7 +309,7 @@ WARNING - if you try to run an instance of the app using `--observatory-port` an TODO: we need to automate the running of integration tests in a CI environment using Flutter driver. -NOTE ⚠ : Flutter driver is borderline maintained and clearly the expectation is to move to using `integration_test`. [Here](https://github.com/flutter/flutter/issues/12810) is a good depiction of related conversations. +NOTE ⚠ : Flutter driver is borderline maintained and clearly the expectation is to move to using `integration_test`. [Here](https://github.com/flutter/flutter/issues/12810) is a good depiction of related conversations. #### Testing Replica A few Replica tests run [json-server](https://github.com/typicode/json-server) to serve dummy data during tests instead of hitting an actual Replica instance. diff --git a/assets/images/lantern_connected_32.ico b/assets/images/lantern_connected_32.ico new file mode 100644 index 000000000..62d7598ce Binary files /dev/null and b/assets/images/lantern_connected_32.ico differ diff --git a/assets/images/lantern_connected_32.png b/assets/images/lantern_connected_32.png new file mode 100644 index 000000000..d263b06df Binary files /dev/null and b/assets/images/lantern_connected_32.png differ diff --git a/assets/images/lantern_disconnected_32.ico b/assets/images/lantern_disconnected_32.ico new file mode 100644 index 000000000..bfaaf8f64 Binary files /dev/null and b/assets/images/lantern_disconnected_32.ico differ diff --git a/assets/images/lantern_disconnected_32.png b/assets/images/lantern_disconnected_32.png new file mode 100644 index 000000000..d28569e7b Binary files /dev/null and b/assets/images/lantern_disconnected_32.png differ diff --git a/assets/locales/en.po b/assets/locales/en.po index 10cda3ce3..cdbe82e52 100644 --- a/assets/locales/en.po +++ b/assets/locales/en.po @@ -427,6 +427,12 @@ msgstr "Yes" msgid "No" msgstr "No" +msgid "exit" +msgstr "Exit" + +msgid "show" +msgstr "Show" + msgid "Enter or paste linking code" msgstr "Enter or paste linking code" @@ -472,6 +478,9 @@ msgstr "No Ads" msgid "choose_plan" msgstr "Choose Plan" +msgid "billed_one_time" +msgstr "billed one time" + msgid "connect_up_to_3_devices" msgstr "Connect up to 3 devices" diff --git a/desktop/analytics/analytics.go b/desktop/analytics/analytics.go new file mode 100644 index 000000000..ee4f4cb4d --- /dev/null +++ b/desktop/analytics/analytics.go @@ -0,0 +1,193 @@ +package analytics + +import ( + "bytes" + "net/http" + "net/http/httputil" + "net/url" + "os" + "strconv" + "sync" + "time" + + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/proxied" + "github.com/getlantern/flashlight/v7/util" + "github.com/getlantern/golog" + + "github.com/getlantern/lantern-client/desktop/analytics/engine" +) + +var ( + log = golog.LoggerFor("lantern-desktop.analytics") + + // GA and Matomo ends a session after 30 minutes of inactivity. Prevent it by sending + // keepalive. Note that the session still ends at the midnight. See + // https://support.google.com/analytics/answer/2731565?hl=en + // https://help.piwik.pro/support/questions/how-is-a-session-counted-in-piwik-pro/ + keepaliveInterval = 25 * time.Minute +) + +// Start starts the analytics session with the given data. +func Start(deviceID, version string) *session { + s := newSession(deviceID, version, keepaliveInterval, proxied.ChainedThenFronted()) + go s.keepalive() + return s +} + +type Session interface { + SetIP(string) + EventWithLabel(string, string, string) + Event(string, string) + End() +} + +type NullSession struct{} + +func (s NullSession) SetIP(string) {} +func (s NullSession) EventWithLabel(string, string, string) {} +func (s NullSession) Event(string, string) {} +func (s NullSession) End() {} + +type session struct { + vals url.Values + muVals sync.RWMutex + rt http.RoundTripper + keepaliveInterval time.Duration + chDoneTracking chan struct{} + engine engine.Engine +} + +func newSession(deviceID, version string, keepalive time.Duration, rt http.RoundTripper) *session { + eng := engine.New() + return &session{ + vals: eng.GetSessionValues(version, deviceID, getExecutableHash()), + rt: rt, + keepaliveInterval: keepalive, + chDoneTracking: make(chan struct{}), + engine: eng, + } +} + +// SetIP sets the client IP for better analysis. The IP is always anonymized by +// both Google and matomo engines +func (s *session) SetIP(ip string) { + s.muVals.Lock() + s.vals = s.engine.SetIP(s.vals, ip) + s.muVals.Unlock() + go s.track() +} + +// EventWithLabel tells engine that some event happens in the current page with a label +func (s *session) EventWithLabel(category, action, label string) { + s.muVals.Lock() + s.vals = s.engine.SetEventWithLabel(s.vals, category, action, label) + s.muVals.Unlock() + go s.track() +} + +// Event tells engine that some event happens in the current page. +func (s *session) Event(category, action string) { + s.EventWithLabel(category, action, "") +} + +// End tells engine to force end the current session. +func (s *session) End() { + s.muVals.Lock() + s.vals = s.engine.End(s.vals) + s.muVals.Unlock() + go s.track() +} + +// keepalive keeps tracking session with the latest parameters to avoid engine from +// ending the session. +func (s *session) keepalive() { + keepaliveTimer := time.NewTimer(s.keepaliveInterval) + for { + select { + case <-s.chDoneTracking: + // Note this does not drain the channel before resetting, so + // keepalive may be sent more than required, but that is okay. + keepaliveTimer.Reset(s.keepaliveInterval) + case <-keepaliveTimer.C: + go s.track() + } + } +} + +func (s *session) track() { + s.muVals.RLock() + args := s.vals.Encode() + s.muVals.RUnlock() + defer func() { + select { + case s.chDoneTracking <- struct{}{}: + default: + // tests may not have keepalive loop to receive from the channel + } + }() + + r, err := http.NewRequest("POST", s.engine.GetEndpoint(), bytes.NewBufferString(args)) + if err != nil { + _ = log.Errorf("Error constructing analytics request: %s", err) + return + } + + r.Header.Add("Content-Type", "application/x-www-form-urlencoded") + r.Header.Add("Content-Length", strconv.Itoa(len(args))) + + if req, er := httputil.DumpRequestOut(r, true); er != nil { + log.Debugf("Could not dump request: %v", er) + } else { + log.Debugf("Full analytics request: %v", string(req)) + } + + resp, err := s.rt.RoundTrip(r) + if err != nil { + _ = log.Errorf("Could not send HTTP request to analytics: %s", err) + return + } + log.Debugf("Successfully sent request to analytics: %s", resp.Status) + if err := resp.Body.Close(); err != nil { + log.Debugf("Unable to close response body: %v", err) + } +} + +// getExecutableHash returns the hash of the currently running executable. +// If there's an error getting the hash, this returns +func getExecutableHash() string { + // We don't know how to get a useful hash here for Android but also this + // code isn't currently called on Android, so just guard against something + // bad happening here. + if common.Platform == "android" { + return "android" + } + if lanternPath, err := os.Executable(); err != nil { + log.Debugf("Could not get path to executable %v", err) + return err.Error() + } else { + if b, er := util.GetFileHash(lanternPath); er != nil { + return er.Error() + } else { + return b + } + } +} + +// AddCampaign adds Google Analytics campaign tracking to a URL and returns +// that URL. +func AddCampaign(urlStr, campaign, content, medium string) (string, error) { + u, err := url.Parse(urlStr) + if err != nil { + log.Errorf("Could not parse click URL: %v", err) + return "", err + } + + q := u.Query() + q.Set("utm_source", common.Platform) + q.Set("utm_medium", medium) + q.Set("utm_campaign", campaign) + q.Set("utm_content", content) + u.RawQuery = q.Encode() + return u.String(), nil +} diff --git a/desktop/analytics/analytics_test.go b/desktop/analytics/analytics_test.go new file mode 100644 index 000000000..e6830e1d6 --- /dev/null +++ b/desktop/analytics/analytics_test.go @@ -0,0 +1,105 @@ +package analytics + +import ( + "bytes" + "errors" + "io/ioutil" + "net/http" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/getlantern/flashlight/v7/common" + + "github.com/stretchr/testify/assert" +) + +type errorTripper struct { + request *http.Request +} + +func (et *errorTripper) RoundTrip(r *http.Request) (*http.Response, error) { + et.request = r + return nil, errors.New("error") +} + +type successTripper struct { + numRequests int32 + request *http.Request +} + +func (st *successTripper) RoundTrip(r *http.Request) (*http.Response, error) { + st.request = r + atomic.AddInt32(&st.numRequests, 1) + t := &http.Response{ + Body: ioutil.NopCloser(bytes.NewBufferString("Hello World")), + } + + return t, nil +} + +func TestRoundTrip(t *testing.T) { + et := &errorTripper{} + session := newSession("1", "2.2.0", 0, et) + session.track() + assert.Equal(t, "application/x-www-form-urlencoded", et.request.Header.Get("Content-Type"), "unexpected content type") + + st := &successTripper{} + session.rt = st + session.track() + assert.Equal(t, "application/x-www-form-urlencoded", st.request.Header.Get("Content-Type"), "unexpected content type") +} + +func TestKeepalive(t *testing.T) { + st := &successTripper{} + session := newSession("1", "2.2.0", 100*time.Millisecond, st) + go session.keepalive() + time.Sleep(110 * time.Millisecond) + assert.EqualValues(t, 1, atomic.LoadInt32(&st.numRequests), "Should have sent keepalive after the inteval") + time.Sleep(20 * time.Millisecond) + session.Event("category", "action") + // have to wait because event is sent asynchronously + time.Sleep(10 * time.Millisecond) + assert.EqualValues(t, 2, atomic.LoadInt32(&st.numRequests), "Should have sent event") + time.Sleep(80 * time.Millisecond) + assert.EqualValues(t, 2, atomic.LoadInt32(&st.numRequests), "Other requests should reset the keepalive timer") + time.Sleep(30 * time.Millisecond) + assert.EqualValues(t, 3, atomic.LoadInt32(&st.numRequests), "Should have sent another keepalive after the new timer expired") +} + +func TestAnalytics(t *testing.T) { + session := newSession("1", "2.2.0", 0, http.DefaultTransport) + session.SetIP("127.0.0.1") + + argString := session.vals.Encode() + assert.True(t, strings.Contains(argString, "pageview")) + assert.True(t, strings.Contains(argString, "127.0.0.1")) + + // Now actually hit the GA debug server to validate the hit. + url := "https://www.google-analytics.com/debug/collect?" + argString + resp, err := http.Get(url) + if !assert.NoError(t, err, "Should have no error") { + return + } + + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + assert.Nil(t, err, "Should be nil") + + assert.True(t, strings.Contains(string(body), "\"valid\": true"), "Should be a valid hit") + + session.End() +} + +func TestAddCampaign(t *testing.T) { + startURL := "https://test.com" + campaignURL, err := AddCampaign(startURL, "test-campaign", "test-content", "test-medium") + assert.NoError(t, err) + assert.Equal(t, "https://test.com?utm_campaign=test-campaign&utm_content=test-content&utm_medium=test-medium&utm_source="+common.Platform, campaignURL) + + // Now test a URL that will produce an error + startURL = ":" + _, err = AddCampaign(startURL, "test-campaign", "test-content", "test-medium") + assert.Error(t, err) +} diff --git a/desktop/analytics/engine/engine.go b/desktop/analytics/engine/engine.go new file mode 100644 index 000000000..d7902b10d --- /dev/null +++ b/desktop/analytics/engine/engine.go @@ -0,0 +1,20 @@ +package engine + +import "net/url" + +const useMatomo = false + +type Engine interface { + End(vals url.Values) url.Values + GetEndpoint() string + SetIP(vals url.Values, ip string) url.Values + SetEventWithLabel(vals url.Values, category, action, label string) url.Values + GetSessionValues(version, deviceID, execHash string) url.Values +} + +func New() Engine { + if useMatomo { + return NewMatomo() + } + return NewGA() +} diff --git a/desktop/analytics/engine/google.go b/desktop/analytics/engine/google.go new file mode 100644 index 000000000..268200b24 --- /dev/null +++ b/desktop/analytics/engine/google.go @@ -0,0 +1,64 @@ +package engine + +import ( + "net/url" + + "github.com/getlantern/flashlight/v7/common" +) + +const ( + // endpoint is the endpoint to report GA data to. + gaEndpoint = `https://ssl.google-analytics.com/collect` +) + +type googleAnalytics struct{} + +func NewGA() Engine { + return &googleAnalytics{} +} + +func (ga googleAnalytics) GetEndpoint() string { + return gaEndpoint +} + +func (ga googleAnalytics) SetIP(vals url.Values, ip string) url.Values { + vals.Set("uip", ip) + return vals +} + +func (ga googleAnalytics) SetEventWithLabel(vals url.Values, category, action, label string) url.Values { + vals.Set("ec", category) + vals.Set("ea", action) + vals.Set("el", label) + vals.Set("t", "event") + return vals +} + +func (ga googleAnalytics) End(vals url.Values) url.Values { + vals.Add("sc", "end") + return vals +} + +func (ga googleAnalytics) GetSessionValues(version, clientID, execHash string) url.Values { + vals := make(url.Values) + + vals.Add("v", "1") + vals.Add("cid", clientID) + vals.Add("tid", common.TrackingID) + + // Make call to anonymize the user's IP address -- basically a policy thing + // where Google agrees not to store it. + vals.Add("aip", "1") + + // Custom dimension for the Lantern version + vals.Add("cd1", version) + + // Custom dimension for the hash of the executable. We combine the version + // to make it easier to interpret in GA. + vals.Add("cd2", version+"-"+execHash) + + vals.Add("dp", "localhost") + vals.Add("t", "pageview") + + return vals +} diff --git a/desktop/analytics/engine/matomo.go b/desktop/analytics/engine/matomo.go new file mode 100644 index 000000000..e4d3564a8 --- /dev/null +++ b/desktop/analytics/engine/matomo.go @@ -0,0 +1,63 @@ +package engine + +import ( + "net/url" +) + +const ( + // endpoint is the endpoint to report Matomo data to. + matomoEndpoint = `https://analytics.lantern.io/matomo.php` // - this should be in an env + matomoIDSite = "1" // lantern.io - this should be in an env + matomoAuthToken = "9da6ac71d684a0cc5dd3c36034699859" // this should be in an env +) + +type matomo struct{} + +func NewMatomo() Engine { + return &matomo{} +} + +func (ga matomo) GetEndpoint() string { + return matomoEndpoint +} + +func (ga matomo) SetIP(vals url.Values, ip string) url.Values { + vals.Set("cip", ip) + return vals +} + +func (ga matomo) SetEventWithLabel(vals url.Values, category, action, label string) url.Values { + vals.Set("e_c", category) + vals.Set("e_a", action) + vals.Set("e_n", label) + vals.Set("action_name", "event") + return vals +} + +func (ga matomo) End(vals url.Values) url.Values { + vals.Add("new_visit", "1") + return vals +} + +func (ga matomo) GetSessionValues(version, clientID, execHash string) url.Values { + vals := make(url.Values) + + vals.Add("apiv", "1") + vals.Add("rec", "1") + + vals.Add("cid", clientID) + vals.Add("idsite", matomoIDSite) + vals.Add("token_auth", matomoAuthToken) + + // Custom dimension for the Lantern version + vals.Add("dimension1", version) + + // Custom dimension for the hash of the executable. We combine the version + // to make it easier to interpret in GA. + vals.Add("dimension2", version+"-"+execHash) + + vals.Add("url", "localhost") + vals.Add("action_name", "pageview") + + return vals +} diff --git a/desktop/app/app.go b/desktop/app/app.go new file mode 100644 index 000000000..c1eab7baf --- /dev/null +++ b/desktop/app/app.go @@ -0,0 +1,651 @@ +package app + +import ( + "fmt" + "io/fs" + "io/ioutil" + "math/rand" + "net" + "os" + "path/filepath" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/getsentry/sentry-go" + + "github.com/getlantern/errors" + "github.com/getlantern/eventual" + "github.com/getlantern/flashlight/v7" + "github.com/getlantern/flashlight/v7/balancer" + "github.com/getlantern/flashlight/v7/browsers/simbrowser" + flashlightClient "github.com/getlantern/flashlight/v7/client" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/config" + "github.com/getlantern/flashlight/v7/email" + "github.com/getlantern/flashlight/v7/geolookup" + "github.com/getlantern/flashlight/v7/logging" + "github.com/getlantern/flashlight/v7/ops" + "github.com/getlantern/flashlight/v7/pro" + "github.com/getlantern/flashlight/v7/pro/client" + "github.com/getlantern/flashlight/v7/stats" + "github.com/getlantern/golog" + "github.com/getlantern/i18n" + "github.com/getlantern/memhelper" + notify "github.com/getlantern/notifier" + "github.com/getlantern/profiling" + "github.com/getlantern/trafficlog-flashlight/tlproc" + + "github.com/getlantern/lantern-client/desktop/analytics" + "github.com/getlantern/lantern-client/desktop/autoupdate" + uicommon "github.com/getlantern/lantern-client/desktop/common" + "github.com/getlantern/lantern-client/desktop/features" + "github.com/getlantern/lantern-client/desktop/notifier" + "github.com/getlantern/lantern-client/desktop/ws" +) + +var ( + log = golog.LoggerFor("lantern-desktop.app") + startTime = time.Now() + translationAppName = strings.ToUpper(common.DefaultAppName) +) + +func init() { + autoupdate.Version = ApplicationVersion + autoupdate.PublicKey = []byte(packagePublicKey) + + rand.Seed(time.Now().UnixNano()) +} + +// App is the core of the Lantern desktop application, in the form of a library. +type App struct { + hasExited int64 + fetchedGlobalConfig int32 + fetchedProxiesConfig int32 + + Flags flashlight.Flags + configDir string + exited eventual.Value + analyticsSession analytics.Session + settings *Settings + statsTracker *statsTracker + + muExitFuncs sync.RWMutex + exitFuncs []func() + + chGlobalConfigChanged chan bool + + + translations eventual.Value + + ws ws.UIChannel + flashlight *flashlight.Flashlight + + // If both the trafficLogLock and proxiesLock are needed, the trafficLogLock should be obtained + // first. Keeping the order consistent avoids deadlocking. + + // Log of network traffic to and from the proxies. Used to attach packet capture files to + // reported issues. Nil if traffic logging is not enabled. + trafficLog *tlproc.TrafficLogProcess + trafficLogLock sync.RWMutex + + // Also protected by trafficLogLock. + captureSaveDuration time.Duration + + proClient *client.Client + referralCode string + referralCodeMu sync.Mutex + + // proxies are tracked by the application solely for data collection purposes. This value should + // not be changed, except by Flashlight.onProxiesUpdate. State-changing methods on the dialers + // should not be called. In short, this slice and its elements should be treated as read-only. + proxies []balancer.Dialer + proxiesLock sync.RWMutex + + selectedTab Tab + selectedTabMu sync.Mutex +} + +// NewApp creates a new desktop app that initializes the app and acts as a moderator between all desktop components. +func NewApp(flags flashlight.Flags, configDir string, proClient *client.Client, settings *Settings) *App { + analyticsSession := newAnalyticsSession(settings) + app := &App{ + configDir: configDir, + exited: eventual.NewValue(), + proClient: proClient, + settings: settings, + analyticsSession: analyticsSession, + selectedTab: AccountTab, + statsTracker: NewStatsTracker(), + translations: eventual.NewValue(), + ws: ws.NewUIChannel(), + } + + app.translations.Set(os.DirFS("locale/translation")) + + return app +} + +func newAnalyticsSession(settings *Settings) analytics.Session { + if settings.IsAutoReport() { + session := analytics.Start(settings.GetDeviceID(), ApplicationVersion) + go func() { + session.SetIP(geolookup.GetIP(eventual.Forever)) + }() + return session + } else { + return analytics.NullSession{} + } +} + +func (app *App) SelectedTab() Tab { + app.selectedTabMu.Lock() + defer app.selectedTabMu.Unlock() + return app.selectedTab +} + +func (app *App) SetSelectedTab(selectedTab Tab) { + app.selectedTabMu.Lock() + defer app.selectedTabMu.Unlock() + app.selectedTab = selectedTab +} + +// Run starts the app. +func (app *App) Run(isMain bool) { + golog.OnFatal(app.exitOnFatal) + + memhelper.Track(15*time.Second, 15*time.Second, func(err error) { + sentry.CaptureException(err) + }) + + go func() { + for <-geolookup.OnRefresh() { + app.settings.SetCountry(geolookup.GetCountry(0)) + } + }() + + // Run below in separate goroutine as config.Init() can potentially block when Lantern runs + // for the first time. User can still quit Lantern through systray menu when it happens. + go func() { + log.Debug(app.Flags) + if app.Flags.ProxyAll { + // If proxyall flag was supplied, force proxying of all + app.settings.SetProxyAll(true) + } + + listenAddr := app.Flags.Addr + if listenAddr == "" { + listenAddr = app.settings.getString(SNAddr) + } + if listenAddr == "" { + listenAddr = defaultHTTPProxyAddress + } + + socksAddr := app.Flags.SocksAddr + if socksAddr == "" { + socksAddr = app.settings.getString(SNSOCKSAddr) + } + if socksAddr == "" { + socksAddr = defaultSOCKSProxyAddress + } + + if app.Flags.Timeout > 0 { + go func() { + time.AfterFunc(app.Flags.Timeout, func() { + app.Exit(errors.New("No succeeding proxy got after running for %v, global config fetched: %v, proxies fetched: %v", + app.Flags.Timeout, atomic.LoadInt32(&app.fetchedGlobalConfig) == 1, atomic.LoadInt32(&app.fetchedProxiesConfig) == 1)) + }) + }() + } + + if app.Flags.Initialize { + app.statsTracker.AddListener(func(newStats stats.Stats) { + if newStats.HasSucceedingProxy { + log.Debug("Finished initialization") + app.Exit(nil) + } + }) + } + + cacheDir, err := os.UserCacheDir() + if err != nil { + cacheDir = os.TempDir() + } + cacheDir = filepath.Join(cacheDir, common.DefaultAppName, "dhtup", "data") + os.MkdirAll(cacheDir, 0o700) + + app.flashlight, err = flashlight.New( + common.DefaultAppName, + ApplicationVersion, + RevisionDate, + app.configDir, + app.Flags.VPN, + func() bool { return app.settings.getBool(SNDisconnected) }, // check whether we're disconnected + app.settings.GetProxyAll, + app.settings.GetGoogleAds, + func() bool { return false }, // on desktop, we do not allow private hosts + app.settings.IsAutoReport, + app.Flags.AsMap(), + app.onConfigUpdate, + app.onProxiesUpdate, + app.settings, + app.statsTracker, + app.IsPro, + app.settings.GetLanguage, + func() string { + isPro, statusKnown := app.isProUserFast() + if (isPro || !statusKnown) && !common.ForceAds() { + // pro user (or status unknown), don't ad swap + return "" + } + return app.PlansURL() + }, + func(addr string) (string, error) { return addr, nil }, // no dnsgrab reverse lookups on desktop + app.AdTrackURL, + app.analyticsSession.EventWithLabel, + ) + if err != nil { + app.Exit(err) + return + } + app.beforeStart(listenAddr) + + chProStatusChanged := make(chan bool, 1) + pro.OnProStatusChange(func(isPro bool, _ bool) { + chProStatusChanged <- isPro + }) + chUserChanged := make(chan bool, 1) + app.settings.OnChange(SNUserID, func(v interface{}) { + chUserChanged <- true + }) + // Just pass all of the channels that should trigger re-evaluating which features + // are enabled for this user, country, etc. + app.startFeaturesService(geolookup.OnRefresh(), chUserChanged, chProStatusChanged, app.chGlobalConfigChanged) + + notifyConfigSaveErrorOnce := new(sync.Once) + app.flashlight.SetErrorHandler(func(t flashlight.HandledErrorType, err error) { + switch t { + case flashlight.ErrorTypeProxySaveFailure, flashlight.ErrorTypeConfigSaveFailure: + log.Errorf("failed to save config (%v): %v", t, err) + + notifyConfigSaveErrorOnce.Do(func() { + note := ¬ify.Notification{ + Title: i18n.T("BACKEND_CONFIG_SAVE_ERROR_TITLE"), + Message: i18n.T("BACKEND_CONFIG_SAVE_ERROR_MESSAGE", i18n.T(translationAppName)), + ClickLabel: i18n.T("BACKEND_CLICK_LABEL_GOT_IT"), + IconURL: app.AddToken("/img/lantern_logo.png"), + } + _ = notifier.ShowNotification(note, "alert-prompt") + }) + + default: + log.Errorf("flashlight error: %v: %v", t, err) + } + }) + + app.flashlight.Run( + listenAddr, + socksAddr, + app.afterStart, + func(err error) { _ = app.Exit(err) }, + ) + }() +} + +// setFeatures enables or disables the features specified by values in the features map +// sent back to the UI +func (app *App) setFeatures(enabledFeatures map[string]bool, values map[features.Feature]bool) { + for feature, isEnabled := range values { + if isEnabled { + enabledFeatures[feature.String()] = isEnabled + } + } +} + +// checkEnabledFeatures checks if features are enabled +// (based on the env vars at build time or the user's settings/geolocation) +// and starts appropriate services +func (app *App) checkEnabledFeatures(enabledFeatures map[string]bool) { + app.setFeatures(enabledFeatures, features.EnabledFeatures) + + log.Debugf("Starting enabled features: %v", enabledFeatures) + //go app.startReplicaIfNecessary(enabledFeatures) + enableTrafficLog := app.isFeatureEnabled(enabledFeatures, config.FeatureTrafficLog) + go app.toggleTrafficLog(enableTrafficLog) +} + +// startFeaturesService starts a new features service that dispatches features to any relevant +// listeners. +func (app *App) startFeaturesService(chans ...<-chan bool) { + if service, err := app.ws.Register("features", func(write func(interface{})) { + enabledFeatures := app.flashlight.EnabledFeatures() + app.checkEnabledFeatures(enabledFeatures) + write(enabledFeatures) + }); err != nil { + log.Errorf("Unable to serve enabled features to UI: %v", err) + } else { + for _, ch := range chans { + go func(c <-chan bool) { + for range c { + features := app.flashlight.EnabledFeatures() + app.checkEnabledFeatures(features) + select { + case service.Out <- features: + // ok + default: + // don't block if no-one is listening + } + } + }(ch) + } + } +} + +func (app *App) beforeStart(listenAddr string) { + log.Debug("Got first config") + if app.Flags.CpuProfile != "" || app.Flags.MemProfile != "" { + log.Debugf("Start profiling with cpu file %s and mem file %s", app.Flags.CpuProfile, app.Flags.MemProfile) + finishProfiling := profiling.Start(app.Flags.CpuProfile, app.Flags.MemProfile) + app.AddExitFunc("finish profiling", finishProfiling) + } + + if err := setUpSysproxyTool(); err != nil { + app.Exit(err) + } + + if app.Flags.ClearProxySettings { + // This is a workaround that attempts to fix a Windows-only problem where + // Lantern was unable to clean the system's proxy settings before logging + // off. + // + // See: https://github.com/getlantern/lantern/issues/2776 + log.Debug("Requested clearing of proxy settings") + _, port, splitErr := net.SplitHostPort(listenAddr) + if splitErr == nil && port != "0" { + log.Debugf("Clearing system proxy settings for: %v", listenAddr) + clearSysproxyFor(listenAddr) + } else { + log.Debugf("Can't clear proxy settings for: %v", listenAddr) + } + app.Exit(nil) + os.Exit(0) + } + app.AddExitFunc("stopping notifier", notifier.NotificationsLoop(app.analyticsSession)) +} + +func (app *App) isFeatureEnabled(features map[string]bool, feature string) bool { + val, ok := features[feature] + return ok && val +} + +// Connect turns on proxying +func (app *App) Connect() { + app.analyticsSession.Event("systray-menu", "connect") + ops.Begin("connect").End() + app.settings.setBool(SNDisconnected, false) +} + +// Disconnect turns off proxying +func (app *App) Disconnect() { + app.analyticsSession.Event("systray-menu", "disconnect") + ops.Begin("disconnect").End() + app.settings.setBool(SNDisconnected, true) +} + +// GetLanguage returns the user language +func (app *App) GetLanguage() string { + return app.settings.GetLanguage() +} + +// SetLanguage sets the user language +func (app *App) SetLanguage(lang string) { + app.settings.SetLanguage(lang) +} + +// OnSettingChange sets a callback cb to get called when attr is changed from server. +// When calling multiple times for same attr, only the last one takes effect. +func (app *App) OnSettingChange(attr SettingName, cb func(interface{})) { + app.settings.OnChange(attr, cb) +} + +// OnStatsChange adds a listener for Stats changes. +func (app *App) OnStatsChange(fn func(stats.Stats)) { + app.statsTracker.AddListener(fn) +} + +func (app *App) SysproxyOn() { + if err := SysproxyOn(); err != nil { + app.statsTracker.SetAlert( + stats.FAIL_TO_SET_SYSTEM_PROXY, err.Error(), false) + } +} + +func (app *App) afterStart(cl *flashlightClient.Client) { + app.OnSettingChange(SNSystemProxy, func(val interface{}) { + enable := val.(bool) + if enable { + app.SysproxyOn() + } else { + SysProxyOff() + } + }) +} + +func (app *App) onConfigUpdate(cfg *config.Global, src config.Source) { + if src == config.Fetched { + atomic.StoreInt32(&app.fetchedGlobalConfig, 1) + } + autoupdate.Configure(cfg.UpdateServerURL, cfg.AutoUpdateCA, func() string { + return "/img/lantern_logo.png" + }) + email.SetDefaultRecipient(cfg.ReportIssueEmail) + if len(cfg.GlobalBrowserMarketShareData) > 0 { + err := simbrowser.SetMarketShareData( + cfg.GlobalBrowserMarketShareData, cfg.RegionalBrowserMarketShareData) + if err != nil { + log.Errorf("failed to set browser market share data: %v", err) + } + } + app.chGlobalConfigChanged <- true +} + +func (app *App) onProxiesUpdate(proxies []balancer.Dialer, src config.Source) { + if src == config.Fetched { + atomic.StoreInt32(&app.fetchedProxiesConfig, 1) + } + app.trafficLogLock.Lock() + app.proxiesLock.Lock() + app.proxies = proxies + if app.trafficLog != nil { + proxyAddresses := []string{} + for _, p := range proxies { + proxyAddresses = append(proxyAddresses, p.Addr()) + } + if err := app.trafficLog.UpdateAddresses(proxyAddresses); err != nil { + log.Errorf("failed to update traffic log addresses: %v", err) + } + } + app.proxiesLock.Unlock() + app.trafficLogLock.Unlock() +} + +// AddExitFunc adds a function to be called before the application exits. +func (app *App) AddExitFunc(label string, exitFunc func()) { + app.muExitFuncs.Lock() + app.exitFuncs = append(app.exitFuncs, func() { + log.Debugf("Processing exit function: %v", label) + exitFunc() + log.Debugf("Done processing exit function: %v", label) + }) + app.muExitFuncs.Unlock() +} + +// Exit tells the application to exit, optionally supplying an error that caused +// the exit. Returns true if the app is actually exiting, false if exit has +// already been requested. +func (app *App) Exit(err error) bool { + if atomic.CompareAndSwapInt64(&app.hasExited, 0, 1) { + app.doExit(err) + return true + } + return false +} + +func (app *App) doExit(err error) { + if err != nil { + log.Errorf("Exiting app %d(%d) because of %v", os.Getpid(), os.Getppid(), err) + if ShouldReportToSentry() { + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelFatal) + }) + + sentry.CaptureException(err) + if result := sentry.Flush(common.SentryTimeout); !result { + log.Error("Flushing to Sentry timed out") + } + } + } else { + log.Debugf("Exiting app %d(%d)", os.Getpid(), os.Getppid()) + } + recordStopped() + defer func() { + app.exited.Set(err) + log.Debugf("Finished exiting app %d(%d)", os.Getpid(), os.Getppid()) + }() + + ch := make(chan struct{}) + go func() { + app.runExitFuncs() + close(ch) + }() + t := time.NewTimer(10 * time.Second) + select { + case <-ch: + log.Debug("Finished running exit functions") + case <-t.C: + log.Debug("Timeout running exit functions, quit anyway") + } + if err := logging.Close(); err != nil { + log.Errorf("Error closing log: %v", err) + } +} + +func (app *App) runExitFuncs() { + var wg sync.WaitGroup + // call plain exit funcs in parallel + app.muExitFuncs.RLock() + log.Debugf("Running %d exit functions", len(app.exitFuncs)) + wg.Add(len(app.exitFuncs)) + for _, f := range app.exitFuncs { + go func(f func()) { + f() + wg.Done() + }(f) + } + app.muExitFuncs.RUnlock() + wg.Wait() +} + +// WaitForExit waits for a request to exit the application. +func (app *App) WaitForExit() error { + err, _ := app.exited.Get(-1) + if err == nil { + return nil + } + return err.(error) +} + +// is only used in the panicwrap parent process. +func (app *App) LogPanicAndExit(msg string) { + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelFatal) + }) + + sentry.CaptureMessage(msg) + if result := sentry.Flush(common.SentryTimeout); !result { + log.Error("Flushing to Sentry timed out") + } +} + +func (app *App) exitOnFatal(err error) { + _ = logging.Close() + app.Exit(err) +} + +// IsPro indicates whether or not the app is pro +func (app *App) IsPro() bool { + isPro, _ := app.isProUserFast() + return isPro +} + +// ReferralCode returns a user's unique referral code +func (app *App) ReferralCode(uc common.UserConfig) (string, error) { + app.referralCodeMu.Lock() + defer app.referralCodeMu.Unlock() + referralCode := app.referralCode + if referralCode == "" { + resp, err := app.proClient.UserData(uc) + if err != nil { + return "", err + } + app.referralCode = resp.Code + return resp.Code, nil + } + return referralCode, nil +} + +func recordStopped() { + ops.Begin("client_stopped"). + SetMetricSum("uptime", time.Since(startTime).Seconds()). + End() +} + +// ShouldReportToSentry determines if we should report errors/panics to Sentry +func ShouldReportToSentry() bool { + return !uicommon.IsDevEnvironment() +} + +// OnTrayShow indicates the user has selected to show lantern from the tray. +func (app *App) OnTrayShow() { + app.analyticsSession.Event("systray-menu", "show") +} + +// OnTrayUpgrade indicates the user has selected to upgrade lantern from the tray. +func (app *App) OnTrayUpgrade() { + app.analyticsSession.Event("systray-menu", "upgrade") +} + +// PlansURL returns the URL for accessing the checkout/plans page directly. +func (app *App) PlansURL() string { + return "#/plans" +} + +// AdTrackURL returns the URL for adding tracking on injected ads. +func (app *App) AdTrackURL() string { + return "/ad_track" +} + +// AddToken adds our secure token to a given request path. +func (app *App) AddToken(path string) string { + return path +} + +func (app *App) Settings() *Settings { + return app.settings +} + +// GetTranslations accesses translations with the given filename +func (app *App) GetTranslations(filename string) ([]byte, error) { + log.Tracef("Accessing translations %v", filename) + tr, ok := app.translations.Get(30 * time.Second) + if !ok || tr == nil { + return nil, fmt.Errorf("could not get traslation for file name: %v", filename) + } + f, err := tr.(fs.FS).Open(filename) + if err != nil { + return nil, fmt.Errorf("could not get traslation for file name: %v, %w", filename, err) + } + return ioutil.ReadAll(f) +} + diff --git a/desktop/app/autoupdate.go b/desktop/app/autoupdate.go new file mode 100644 index 000000000..59a9502f5 --- /dev/null +++ b/desktop/app/autoupdate.go @@ -0,0 +1,16 @@ +//go:build !mockupdate +// +build !mockupdate + +package app + +// This is the public key of the BNS cert. Incoming updates will be signed to +// prevent MITM attacks. +const packagePublicKey = `-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxeReZ0VHDQ+/XYEHhFq0 +krT+a/+/mlhCkgJ/605KmPXqBv8qo5f1iK6C+TQ87264J4Z9yw0tRwcdY1/ofpH7 +Tywq3pBOgfrnnP9gFtquQ/tgzVkorQ0L51w9HLZ3cCjpaLpofIaztgbCIzsCT6kV +Nx6Sd/4KBSuThhMEnP5pu5Wxr4/lujIpTeVEXzljQMxqX+58ISeXYx6SxLXx5Vgj +1IB6NJwjg7r4Nzg/zUH0ZkCWj3rDWo6itIoeo61o+hPQAjH23TCKOn8Ssaejocyg +CrcOc7aqfGuVM3HuHxtXsjYPqJMVHiXKosi9HcHo5BACPT0FkrZIwz3k6Vy1h7nB +HQIDAQAB +-----END PUBLIC KEY-----` diff --git a/desktop/app/defaults.go b/desktop/app/defaults.go new file mode 100644 index 000000000..50e926d54 --- /dev/null +++ b/desktop/app/defaults.go @@ -0,0 +1,34 @@ +//go:build !disableresourcerandomization +// +build !disableresourcerandomization + +package app + +import ( + "crypto/rand" + "encoding/hex" +) + +const ( + defaultHTTPProxyAddress = "127.0.0.1:0" + defaultSOCKSProxyAddress = "127.0.0.1:0" +) + +func randRead(size int) string { + buf := make([]byte, size) + if _, err := rand.Read(buf); err != nil { + log.Fatalf("Failed to get random bytes: %s", err) + } + return hex.EncodeToString(buf) +} + +// localHTTPToken fetches the local HTTP token from disk if it's there, and +// otherwise creates a new one and stores it. +func localHTTPToken(set *Settings) string { + tok := set.GetLocalHTTPToken() + if tok == "" { + t := randRead(16) + set.SetLocalHTTPToken(t) + return t + } + return tok +} \ No newline at end of file diff --git a/desktop/app/pro.go b/desktop/app/pro.go new file mode 100644 index 000000000..0d8359071 --- /dev/null +++ b/desktop/app/pro.go @@ -0,0 +1,121 @@ +package app + +import ( + "time" + + "github.com/getlantern/errors" + "github.com/getlantern/flashlight/v7/pro" + "github.com/getlantern/flashlight/v7/pro/client" + "github.com/getlantern/golog" + + "github.com/getlantern/lantern-client/desktop/deviceid" + "github.com/getlantern/lantern-client/desktop/ws" +) + +// isProUser blocks itself to check if current user is Pro, or !ok if error +// happens getting user status from pro-server. The result is not cached +// because the user can become Pro or free at any time. It waits until +// the user ID becomes non-zero. +func (app *App) IsProUser() (isPro bool, ok bool) { + _, err := app.settings.GetInt64Eventually(SNUserID) + if err != nil { + return false, false + } + return pro.IsProUser(app.settings) +} + +// isProUserFast checks a cached value for the pro status and doesn't wait for +// an answer. It works because servePro below fetches user data / create new +// user when starts up. The pro proxy also updates user data implicitly for +// '/userData' calls initiated from desktop UI. +func (app *App) isProUserFast() (isPro bool, statusKnown bool) { + return pro.IsProUserFast(app.settings) +} + +// servePro fetches user data or creates new user when the application starts +// up or a new WebSocket client is connected, and serves user data to all +// connected WebSocket clients via the "pro" channel. +// It loops forever in 10 seconds interval until the user is fetched or +// created, as it's fundamental for the UI to work. +func (app *App) servePro(channel ws.UIChannel) error { + logger := golog.LoggerFor("lantern-desktop.app.pro") + chFetch := make(chan bool) + go func() { + fetchOrCreate := func() error { + userID := app.settings.GetUserID() + if userID == 0 { + user, err := pro.NewUser(app.settings) + if err != nil { + return errors.New("Could not create new Pro user: %v", err) + } + app.settings.SetUserIDAndToken(user.Auth.ID, user.Auth.Token) + } else { + isPro, _ := pro.IsProUserFast(app.settings) + if isPro && userID != app.settings.GetMigratedDeviceIDForUserID() { + // If we've gotten here, that means this client may have previously used an old-style device ID. We don't know for sure, + // because it's possible that the user never used an old version of Lantern on this device. In either case, it's safe + // to request to migrate the device ID, as the server will know whether or not the old-style device ID was already associated + // with the current pro user. + oldStyleDeviceID := deviceid.OldStyleDeviceID() + if oldStyleDeviceID != app.settings.GetDeviceID() { + log.Debugf("Attempting to migrate device ID from %v to %v", oldStyleDeviceID, app.settings.GetDeviceID()) + err := pro.MigrateDeviceID(app.settings, oldStyleDeviceID) + if err != nil { + errString := err.Error() + if errString == "old-device-id-not-found" { + log.Debugf("Could not migrate device id, not fatal: %v", err) + } else { + return log.Errorf("Could not migrate device id: %v", err) + } + } else { + log.Debug("Successfully migrated device ID") + } + app.settings.SetMigratedDeviceIDForUserID(userID) + } + } + _, err := pro.FetchUserData(app.settings) + if err != nil { + return errors.New("Could not get user data for %v: %v", userID, err) + } + } + return nil + } + + retry := time.NewTimer(0) + retryOnFail := func(drainChannel bool) { + if err := fetchOrCreate(); err != nil { + if drainChannel && !retry.Stop() { + <-retry.C + } + retry.Reset(10 * time.Second) + } + } + for { + select { + case <-chFetch: + retryOnFail(true) + case <-retry.C: + retryOnFail(false) + } + } + }() + + helloFn := func(write func(interface{})) { + if user, known := pro.GetUserDataFast(app.settings.GetUserID()); known { + logger.Debugf("Sending current user data to new client: %v", user) + write(user) + } + logger.Debugf("Fetching user data again to see if any changes") + select { + case chFetch <- true: + default: // fetching in progress, skipping + } + } + service, err := channel.Register("pro", helloFn) + pro.OnUserData(func(current *client.User, new *client.User) { + logger.Debugf("Sending updated user data to all clients: %v", new) + service.Out <- new + }) + + return err +} diff --git a/desktop/app/settings.go b/desktop/app/settings.go new file mode 100644 index 000000000..1c8d724bd --- /dev/null +++ b/desktop/app/settings.go @@ -0,0 +1,651 @@ +package app + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "reflect" + "strings" + "sync" + "time" + + "github.com/getlantern/eventual" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/golog" + "github.com/getlantern/launcher" + "github.com/getlantern/timezone" + "github.com/getlantern/yaml" + + "github.com/getlantern/lantern-client/desktop/deviceid" + "github.com/getlantern/lantern-client/desktop/ws" +) + +// SettingName is the name of a setting. +type SettingName string + +const ( + SNAutoReport SettingName = "autoReport" + SNAutoLaunch SettingName = "autoLaunch" + SNProxyAll SettingName = "proxyAll" + SNGoogleAds SettingName = "googleAds" + SNSystemProxy SettingName = "systemProxy" + SNDisconnected SettingName = "disconnected" + + SNLanguage SettingName = "lang" + SNCountry SettingName = "country" + SNLocalHTTPToken SettingName = "localHTTPToken" + + SNDeviceID SettingName = "deviceID" + SNUserID SettingName = "userID" + SNUserToken SettingName = "userToken" + SNMigratedDeviceIDForUserID SettingName = "migratedDeviceIDForUserID" + SNTakenSurveys SettingName = "takenSurveys" + SNPastAnnouncements SettingName = "pastAnnouncements" + + SNAddr SettingName = "addr" + SNSOCKSAddr SettingName = "socksAddr" + SNUIAddr SettingName = "uiAddr" + + SNVersion SettingName = "version" + SNBuildDate SettingName = "buildDate" + SNRevisionDate SettingName = "revisionDate" + SNEnabledExperiments SettingName = "enabledExperiments" +) + +type settingType byte + +const ( + stBool settingType = iota + stNumber + stString + stStringArray +) + +var settingMeta = map[SettingName]struct { + sType settingType + persist bool + omitempty bool +}{ + SNAutoReport: {stBool, true, false}, + SNAutoLaunch: {stBool, true, false}, + SNProxyAll: {stBool, true, false}, + SNSystemProxy: {stBool, true, false}, + SNDisconnected: {stBool, false, false}, + SNGoogleAds: {stBool, true, false}, + SNLanguage: {stString, true, true}, + SNCountry: {stString, true, true}, + SNLocalHTTPToken: {stString, true, true}, + + // SNDeviceID: intentionally omit, to avoid setting it from UI + SNUserID: {stNumber, true, true}, + SNUserToken: {stString, true, true}, + SNMigratedDeviceIDForUserID: {stNumber, true, true}, + SNTakenSurveys: {stStringArray, true, true}, + SNPastAnnouncements: {stStringArray, true, true}, + + SNAddr: {stString, true, true}, + SNSOCKSAddr: {stString, true, true}, + SNUIAddr: {stString, true, true}, + + SNVersion: {stString, false, false}, + SNBuildDate: {stString, false, false}, + SNRevisionDate: {stString, false, false}, + + SNEnabledExperiments: {stStringArray, false, false}, +} + +// Settings is a struct of all settings unique to this particular Lantern instance. +type Settings struct { + muNotifiers sync.RWMutex + changeNotifiers map[SettingName][]func(interface{}) + wsOut chan<- interface{} + + m map[SettingName]interface{} + sync.RWMutex + filePath string + + log golog.Logger +} + +func LoadSettingsFrom(version, revisionDate, buildDate, path string) *Settings { + // Create default settings that may or may not be overridden from an existing file + // on disk. + sett := newSettings(path) + set := sett.m + + // Use settings from disk if they're available. + if bytes, err := ioutil.ReadFile(path); err != nil { + sett.log.Debugf("Could not read file %v", err) + } else if err := yaml.Unmarshal(bytes, set); err != nil { + sett.log.Errorf("Could not load yaml %v", err) + // Just keep going with the original settings not from disk. + } else { + sett.log.Debugf("Loaded settings from %v", path) + } + // old lantern persist settings with all lower case, convert them to camel cased. + toCamelCase(set) + + set[SNDeviceID] = deviceid.Get() + + // SNUserID may be unmarshalled as int, which causes panic when GetUserID(). + // Make sure to store it as int64. + switch id := set[SNUserID].(type) { + case int: + set[SNUserID] = int64(id) + case int64: + set[SNUserID] = id + } + + // Always just sync the auto-launch configuration on startup. + go launcher.CreateLaunchFile(sett.IsAutoLaunch()) + + // always override below 3 attributes as they are not meant to be persisted across versions + set[SNVersion] = version + set[SNBuildDate] = buildDate + set[SNRevisionDate] = revisionDate + + return sett +} + +// emptySettings returns a new settings instance without loading any file from disk. +func emptySettings() *Settings { + return LoadSettingsFrom("version", "revisionDate", "buildDate", "") +} + +func toCamelCase(m map[SettingName]interface{}) { + for k := range settingMeta { + lowerCased := SettingName(strings.ToLower(string(k))) + if v, exists := m[lowerCased]; exists { + delete(m, lowerCased) + m[k] = v + } + } +} + +func newSettings(filePath string) *Settings { + return &Settings{ + m: map[SettingName]interface{}{ + SNUserID: int64(0), + SNAutoReport: true, + SNAutoLaunch: true, + SNProxyAll: false, + SNGoogleAds: true, + SNSystemProxy: true, + SNDisconnected: false, + SNLanguage: "", + SNLocalHTTPToken: "", + SNUserToken: "", + SNUIAddr: "", + SNMigratedDeviceIDForUserID: int64(0), + }, + filePath: filePath, + changeNotifiers: make(map[SettingName][]func(interface{})), + log: golog.LoggerFor("app.settings"), + } +} + +// StartService starts the settings service that synchronizes Lantern's configuration with +// every UI client +func (s *Settings) StartService(channel ws.UIChannel) error { + helloFn := func(write func(interface{})) { + s.log.Debugf("Sending Lantern settings to new client") + write(s.uiMap()) + } + + service, err := channel.Register("settings", helloFn) + if err != nil { + return err + } + s.muNotifiers.Lock() + s.wsOut = service.Out + s.muNotifiers.Unlock() + go s.read(service.In, service.Out) + return nil +} + +func (s *Settings) read(in <-chan interface{}, out chan<- interface{}) { + s.log.Debugf("Start reading settings messages!!") + for message := range in { + s.log.Debugf("Read settings message %v", message) + + data, ok := (message).(map[string]interface{}) + if !ok { + continue + } + + for k, v := range data { + name := SettingName(k) + t, exists := settingMeta[name] + if !exists { + // We do not allow the UI to set the device ID, so only log an + // error if it's something else. Some discussion here: + // https://github.com/getlantern/lantern-internal/issues/5367 + if name != SNDeviceID { + s.log.Errorf("Unknown settings name %s", k) + } + continue + } + switch t.sType { + case stBool: + s.setBool(name, v) + case stString: + s.setString(name, v) + case stNumber: + s.setNum(name, v) + case stStringArray: + s.setStringArray(name, v) + } + } + + out <- s.uiMap() + } +} + +func (s *Settings) setBool(name SettingName, v interface{}) { + b, ok := v.(bool) + if !ok { + s.log.Errorf("Could not convert %s(%v) to bool", name, v) + return + } + s.setVal(name, b) +} + +func (s *Settings) setInt64(name SettingName, v interface{}) { + b, ok := v.(int64) + if !ok { + s.log.Errorf("Could not convert %s(%v) to int64", name, v) + return + } + s.setVal(name, b) +} + +func (s *Settings) setNum(name SettingName, v interface{}) { + number, ok := v.(json.Number) + if !ok { + s.log.Errorf("Could not convert %v of type %v", name, reflect.TypeOf(v)) + return + } + bigint, err := number.Int64() + if err != nil { + s.log.Errorf("Could not get int64 value for %v with error %v", name, err) + return + } + s.setVal(name, bigint) +} + +func (s *Settings) setStringArray(name SettingName, v interface{}) { + if v == nil { + v = []string{} + } + sa, ok := v.([]string) + if !ok { + ss, ok := v.([]interface{}) + if !ok { + s.log.Errorf("Could not convert %s(%v) to array", name, v) + return + } + for i := range ss { + sa = append(sa, fmt.Sprintf("%v", ss[i])) + } + } + s.setVal(name, sa) +} + +func (s *Settings) setString(name SettingName, v interface{}) { + str, ok := v.(string) + if !ok { + s.log.Errorf("Could not convert %s(%v) to string", name, v) + return + } + s.setVal(name, str) +} + +// save saves settings to disk. +func (s *Settings) save() { + s.saveDefault() +} + +// save saves settings to disk as yaml in the default lantern user settings directory. +func (s *Settings) saveDefault() { + s.log.Trace("Saving settings") + if f, err := os.Create(s.filePath); err != nil { + s.log.Errorf("Could not open settings file for writing: %v", err) + } else { + defer f.Close() + if _, err := s.writeTo(f); err != nil { + s.log.Errorf("Could not save settings file: %v", err) + } else { + s.log.Tracef("Saved settings to %s", s.filePath) + } + } +} + +func (s *Settings) writeTo(w io.Writer) (int, error) { + toBeSaved := s.mapToSave() + if bytes, err := yaml.Marshal(toBeSaved); err != nil { + return 0, err + } else { + return w.Write(bytes) + } +} + +func (s *Settings) mapToSave() map[string]interface{} { + m := make(map[string]interface{}) + s.RLock() + defer s.RUnlock() + for k, v := range s.m { + if settingMeta[k].persist { + m[string(k)] = v + } + } + return m +} + +// uiMap makes a copy of our map for the UI with support for omitting empty +// values. +func (s *Settings) uiMap() map[string]interface{} { + m := make(map[string]interface{}) + s.RLock() + defer s.RUnlock() + for key, v := range s.m { + meta := settingMeta[key] + k := string(key) + // This mimics https://golang.org/pkg/encoding/json/ for what are considered + // empty values. + if !meta.omitempty { + m[k] = v + } else { + if v == nil { + continue + } + switch meta.sType { + case stBool: + if v.(bool) { + m[k] = v + } + case stString: + if v != "" { + m[k] = v + } + case stStringArray: + if a, ok := v.([]string); ok { + m[k] = a + } + case stNumber: + if v != 0 { + m[k] = v + } + } + } + } + return m +} + +func (s *Settings) GetAppName() string { + return common.DefaultAppName +} + +// GetEnabledExperiments returns the names of the Lantern experiment IDs that were enabled via flags. +func (s *Settings) GetEnabledExperiments() []string { + return s.getStringArray(SNEnabledExperiments) +} + +// SetEnabledExperiments sets the Lantern experiment IDs that were enabled via flags. +func (s *Settings) SetEnabledExperiments(ex []string) { + s.setStringArray(SNEnabledExperiments, ex) +} + +// GetTakenSurveys returns the IDs of surveys the user has already taken. +func (s *Settings) GetTakenSurveys() []string { + return s.getStringArray(SNTakenSurveys) +} + +// SetTakenSurveys sets the IDs of taken surveys. +func (s *Settings) SetTakenSurveys(campaigns []string) { + s.setStringArray(SNTakenSurveys, campaigns) +} + +// GetProxyAll returns whether or not to proxy all traffic. +func (s *Settings) GetProxyAll() bool { + return s.getBool(SNProxyAll) +} + +// SetProxyAll sets whether or not to proxy all traffic. +func (s *Settings) SetProxyAll(proxyAll bool) { + s.setVal(SNProxyAll, proxyAll) +} + +// GetGoogleAds returns whether or not to proxy all traffic. +func (s *Settings) GetGoogleAds() bool { + return s.getBool(SNGoogleAds) +} + +// SetGoogleAds sets whether or not to proxy all traffic. +func (s *Settings) SetGoogleAds(g bool) { + s.setVal(SNGoogleAds, g) +} + +// IsAutoReport returns whether or not to auto-report debugging and analytics data. +func (s *Settings) IsAutoReport() bool { + return s.getBool(SNAutoReport) +} + +// IsAutoLaunch returns whether or not to automatically launch on system +// startup. +func (s *Settings) IsAutoLaunch() bool { + return s.getBool(SNAutoLaunch) +} + +// SetLanguage sets the user language +func (s *Settings) SetLanguage(language string) { + s.setVal(SNLanguage, language) +} + +// GetLanguage returns the user language +func (s *Settings) GetLanguage() string { + return s.getString(SNLanguage) +} + +// SetCountry sets the user's country. +func (s *Settings) SetCountry(country string) { + s.setVal(SNCountry, country) +} + +// GetCountry returns the user country +func (s *Settings) GetCountry() string { + return s.getString(SNCountry) +} + +func (s *Settings) GetTimeZone() (string, error) { + return timezone.IANANameForTime(time.Now()) +} + +// SetLocalHTTPToken sets the local HTTP token, stored on disk because we've +// seen weird issues on Windows where the OS remembers old, inactive PAC URLs +// with old tokens and uses them, breaking Edge and IE. +func (s *Settings) SetLocalHTTPToken(token string) { + s.setVal(SNLocalHTTPToken, token) +} + +// GetLocalHTTPToken returns the local HTTP token. +func (s *Settings) GetLocalHTTPToken() string { + return s.getString(SNLocalHTTPToken) +} + +// SetUIAddr sets the last known UI address. +func (s *Settings) SetUIAddr(uiaddr string) { + s.setVal(SNUIAddr, uiaddr) +} + +// GetAddr gets the HTTP proxy address. +func (s *Settings) GetAddr() string { + return s.getString(SNAddr) +} + +// GetUIAddr returns the address of the UI, stored across runs to avoid a +// different port on each run, which breaks things like local storage in the UI. +func (s *Settings) GetUIAddr() string { + return s.getString(SNUIAddr) +} + +// GetDeviceID returns the unique ID of this device. +func (s *Settings) GetDeviceID() string { + return s.getString(SNDeviceID) +} + +// SetUserIDAndToken sets the user ID and token atomically +func (s *Settings) SetUserIDAndToken(id int64, token string) { + s.setVals(map[SettingName]interface{}{SNUserID: id, SNUserToken: token}) +} + +// GetUserID returns the user ID +func (s *Settings) GetUserID() int64 { + return s.getInt64(SNUserID) +} + +// GetToken returns the user token +func (s *Settings) GetToken() string { + return s.getString(SNUserToken) +} + +// GetMigratedDeviceIDForUserID returns the user ID (if any) for which the current device's ID has been migrated from the old style to the new style +func (s *Settings) GetMigratedDeviceIDForUserID() int64 { + return s.getInt64(SNMigratedDeviceIDForUserID) +} + +// SetMigratedDeviceIDForUserID stores the user ID (if any) for which the current device's ID has been migrated from the old style to the new style +func (s *Settings) SetMigratedDeviceIDForUserID(userID int64) { + s.setInt64(SNMigratedDeviceIDForUserID, userID) +} + +// GetInternalHeaders returns extra headers sent with requests to internal services +func (s *Settings) GetInternalHeaders() map[string]string { + // stubbed + return make(map[string]string) +} + +// GetSystemProxy returns whether or not to set system proxy when lantern starts +func (s *Settings) GetSystemProxy() bool { + return s.getBool(SNSystemProxy) +} + +func (s *Settings) getBool(name SettingName) bool { + if val, err := s.getVal(name); err == nil { + if v, ok := val.(bool); ok { + return v + } + } + return false +} + +func (s *Settings) getStringArray(name SettingName) []string { + if val, err := s.getVal(name); err == nil { + if v, ok := val.([]string); ok { + return v + } + if v, ok := val.([]interface{}); ok { + var sa []string + for _, item := range v { + sa = append(sa, fmt.Sprintf("%v", item)) + } + return sa + } + } + return nil +} + +func (s *Settings) getString(name SettingName) string { + if val, err := s.getVal(name); err == nil { + if v, ok := val.(string); ok { + return v + } + } + return "" +} + +func (s *Settings) getInt64(name SettingName) int64 { + if val, err := s.getVal(name); err == nil { + if v, ok := val.(int64); ok { + return v + } + if v, ok := val.(int); ok { + return int64(v) + } + } + return int64(0) +} + +func (s *Settings) getVal(name SettingName) (interface{}, error) { + s.log.Tracef("Getting value for %v", name) + s.RLock() + defer s.RUnlock() + if val, ok := s.m[name]; ok { + return val, nil + } + s.log.Debugf("Could not get value for %s", name) + return nil, fmt.Errorf("no value for %v", name) +} + +func (s *Settings) setVal(name SettingName, val interface{}) { + s.setVals(map[SettingName]interface{}{name: val}) +} + +func (s *Settings) setVals(vals map[SettingName]interface{}) { + s.log.Debugf("Setting %v in %v", vals, s.m) + s.Lock() + for name, val := range vals { + s.m[name] = val + } + // Need to unlock here because s.save() will lock again. + s.Unlock() + s.save() + for name, val := range vals { + s.onChange(name, val) + } +} + +// GetInt64Eventually blocks returning an int64 until the int has a value +// other than the defualt. +func (s *Settings) GetInt64Eventually(name SettingName) (int64, error) { + nval := eventual.NewValue() + s.OnChange(name, func(val interface{}) { + nval.Set(val) + }) + + val := s.getInt64(name) + if val > 0 { + return val, nil + } + + eid, _ := nval.Get(-1) + intVal, ok := eid.(int64) + if !ok { + return int64(0), errors.New("Could not cast to int64?") + } + return intVal, nil +} + +// OnChange sets a callback cb to get called when attr is changed from UI. +func (s *Settings) OnChange(attr SettingName, cb func(interface{})) { + s.muNotifiers.Lock() + s.changeNotifiers[attr] = append(s.changeNotifiers[attr], cb) + s.muNotifiers.Unlock() +} + +// onChange is called when attr is changed from UI +func (s *Settings) onChange(attr SettingName, value interface{}) { + s.muNotifiers.RLock() + notifiers := s.changeNotifiers[attr] + wsOut := s.wsOut + s.muNotifiers.RUnlock() + for _, fn := range notifiers { + fn(value) + } + if wsOut != nil { + // notify UI of changed settings + wsOut <- s.uiMap() + } +} diff --git a/desktop/app/stats_tracker.go b/desktop/app/stats_tracker.go new file mode 100644 index 000000000..393d52533 --- /dev/null +++ b/desktop/app/stats_tracker.go @@ -0,0 +1,38 @@ +package app + +import ( + "github.com/getlantern/flashlight/v7/stats" + + "github.com/getlantern/lantern-client/desktop/ws" +) + +type statsTracker struct { + stats.Tracker + service *ws.Service +} + +func NewStatsTracker() *statsTracker { + return &statsTracker{ + Tracker: stats.NewTracker(), + } +} + +func (s *statsTracker) StartService(channel ws.UIChannel) (err error) { + helloFn := func(write func(interface{})) { + log.Debugf("Sending Lantern stats to new client") + write(s.Latest()) + } + + s.service, err = channel.Register("stats", helloFn) + if err == nil { + s.AddListener(func(newStats stats.Stats) { + select { + case s.service.Out <- newStats: + // ok + default: + // don't block if no-one is listening + } + }) + } + return +} diff --git a/desktop/app/sysproxy.go b/desktop/app/sysproxy.go new file mode 100644 index 000000000..c351064a0 --- /dev/null +++ b/desktop/app/sysproxy.go @@ -0,0 +1,152 @@ +package app + +import ( + "fmt" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/getlantern/errors" + "github.com/getlantern/filepersist" + "github.com/getlantern/flashlight/v7/client" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/ops" + "github.com/getlantern/sysproxy" + + "github.com/getlantern/lantern-client/desktop/icons" +) + +var ( + _sysproxyOff func() error + sysproxyOffMx sync.Mutex +) + +func setUpSysproxyTool() error { + var iconFile string + if common.Platform == "darwin" { + icon, err := icons.Asset(appIcon("connected")) + if err != nil { + return fmt.Errorf("unable to load escalation prompt icon: %v", err) + } + // We have to use a short filepath here because Cocoa won't display the + // icon if the path is too long. + iconFile = filepath.Join("/tmp", appIcon("escalate")) + err = filepersist.Save(iconFile, icon, 0644) + if err != nil { + log.Errorf("Unable to persist icon to disk, fallback to default icon: %v", err) + } else { + log.Debugf("Saved icon file to: %v", iconFile) + } + } + err := sysproxy.EnsureHelperToolPresent("sysproxy-cmd", "Lantern would like to be your system proxy", iconFile) + if err != nil { + return fmt.Errorf("unable to set up sysproxy setting tool: %v", err) + } + return nil +} + +func IsSysProxyOn() bool { + sysproxyOffMx.Lock() + off := _sysproxyOff + sysproxyOffMx.Unlock() + return off != nil +} + +func SysproxyOn() (err error) { + op := ops.Begin("sysproxy_on") + defer op.End() + addr, found := getProxyAddr() + if !found { + err = errors.New("Unable to set lantern as system proxy, no proxy address available") + op.FailIf(log.Error(err)) + return + } + log.Debugf("Setting lantern as system proxy at: %v", addr) + off, e := sysproxy.On(addr) + if e != nil { + err = errors.New("Unable to set lantern as system proxy: %v", e) + op.FailIf(log.Error(err)) + return + } + sysproxyOffMx.Lock() + _sysproxyOff = off + sysproxyOffMx.Unlock() + log.Debug("Finished setting lantern as system proxy") + return +} + +func SysProxyOff() { + sysproxyOffMx.Lock() + off := _sysproxyOff + _sysproxyOff = nil + sysproxyOffMx.Unlock() + + if off != nil { + doSysproxyOff(off) + } + + op := ops.Begin("sysproxy_off_force") + defer op.End() + log.Debug("Force clearing system proxy directly, just in case") + addr, found := getProxyAddr() + if !found { + op.FailIf(log.Error("Unable to find proxy address, can't force clear system proxy")) + return + } + doSysproxyClear(op, addr) +} + +func doSysproxyOff(off func() error) { + op := ops.Begin("sysproxy_off") + defer op.End() + log.Debug("Unsetting lantern as system proxy using off function") + err := off() + if err != nil { + op.FailIf(log.Errorf("Unable to unset lantern as system proxy using off function: %v", err)) + return + } + log.Debug("Unset lantern as system proxy using off function") +} + +// clearSysproxyFor is like sysproxyOffFor, but records its activity under the +// sysproxy_clear op instead of the sysproxy_off op. +func clearSysproxyFor(addr string) { + op := ops.Begin("sysproxy_clear") + doSysproxyClear(op, addr) + op.End() +} + +func doSysproxyClear(op *ops.Op, addr string) { + log.Debugf("Clearing lantern as system proxy at: %v", addr) + err := sysproxy.Off(addr) + if err != nil { + op.FailIf(log.Errorf("Unable to clear lantern as system proxy: %v", err)) + } else { + log.Debug("Cleared lantern as system proxy") + } +} + +func getProxyAddr() (addr string, found bool) { + var _addr interface{} + _addr, found = client.Addr(5 * time.Minute) + if found { + addr = _addr.(string) + } + return +} + +func appIcon(name string) string { + return strings.ToLower(common.DefaultAppName) + "_" + fmt.Sprintf(iconTemplate(), name) +} + +func iconTemplate() string { + if common.Platform == "darwin" { + if common.DefaultAppName == "Beam" { + return "%s_32.png" + } + // Lantern doesn't have png files to support dark mode yet + return "%s_32.ico" + } + return "%s_32.ico" +} diff --git a/desktop/app/tab.go b/desktop/app/tab.go new file mode 100644 index 000000000..6a6f43149 --- /dev/null +++ b/desktop/app/tab.go @@ -0,0 +1,27 @@ +package app + +import ( + "errors" + "strings" +) + +var ( + ErrMissingTab = errors.New("missing tab") + AccountTab = Tab("account") + DeveloperTab = Tab("developer") + VPNTab = Tab("vpn") + UnknownTab = Tab("") +) + +// Identifies a specific tab in the desktop app +type Tab string + +// Parse the given string into a Tab +func ParseTab(s string) (Tab, error) { + normalized := strings.ToLower(strings.TrimSpace(s)) + if normalized == "" { + // leave currency empty + return UnknownTab, ErrMissingTab + } + return Tab(normalized), nil +} \ No newline at end of file diff --git a/desktop/app/trafficlog.go b/desktop/app/trafficlog.go new file mode 100644 index 000000000..b936f3ddc --- /dev/null +++ b/desktop/app/trafficlog.go @@ -0,0 +1,328 @@ +package app + +import ( + stderrors "errors" + "io" + "io/ioutil" + "os" + "os/user" + "path/filepath" + "strings" + "time" + + "github.com/getlantern/appdir" + "github.com/getlantern/errors" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/config" + "github.com/getlantern/i18n" + "github.com/getlantern/trafficlog" + "github.com/getlantern/trafficlog-flashlight/tlproc" + "github.com/getlantern/yaml" + + "github.com/getlantern/lantern-client/desktop/features" + "github.com/getlantern/lantern-client/desktop/icons" +) + +const ( + trafficlogStartTimeout = 5 * time.Second + trafficlogRequestTimeout = time.Second + trafficlogDefaultSaveDuration = 5 * time.Minute + + // This file, in the config directory, holds information about installation failures. + tlInstallFailuresFilename = "tl_install_failures.yaml" + + yamlableTimeFormat = time.RFC3339 +) + +var errTrafficLogDisabled = errors.New("traffic log is disabled") + +type yamlableTime time.Time + +func yamlableNow() *yamlableTime { + yt := yamlableTime(time.Now()) + return &yt +} + +func (yt *yamlableTime) GetYAML() (tag string, value interface{}) { + if yt == nil { + return "", time.Time(yamlableTime{}).Format(yamlableTimeFormat) + } + return "", time.Time(*yt).Format(yamlableTimeFormat) +} + +func (yt *yamlableTime) SetYAML(tag string, value interface{}) bool { + valueString, ok := value.(string) + if !ok { + return false + } + t, err := time.Parse(yamlableTimeFormat, valueString) + if err != nil { + return false + } + *yt = yamlableTime(t) + return true +} + +func (yt *yamlableTime) IsZero() bool { + if yt == nil { + return true + } + return time.Time(*yt).IsZero() +} + +func (yt *yamlableTime) SetToZero() { + *yt = yamlableTime{} +} + +func (yt *yamlableTime) timeSince() time.Duration { + return time.Since(time.Time(*yt)) +} + +// A YAML file in which we store data about traffic log installation failures. +type tlInstallFailuresFile struct { + LastFailed, LastDenial *yamlableTime + Failures, Denials int + + path string +} + +// If the file does not exist, this function returns a default value, pointed at the input path. +func openTLInstallFailuresFile(path string) (*tlInstallFailuresFile, error) { + f := new(tlInstallFailuresFile) + b, err := ioutil.ReadFile(path) + if stderrors.Is(err, os.ErrNotExist) { + return &tlInstallFailuresFile{&yamlableTime{}, &yamlableTime{}, 0, 0, path}, nil + } else if err != nil { + return nil, errors.New("failed to read file: %v", err) + } + if err := yaml.Unmarshal(b, f); err != nil { + return nil, errors.New("failed to unmarshal file: %v", err) + } + f.path = path + return f, nil +} + +// Write changes to disk. +func (f tlInstallFailuresFile) flushChanges() error { + b, err := yaml.Marshal(f) + if err != nil { + return errors.New("failed to marshal: %v", err) + } + if err := ioutil.WriteFile(f.path, b, 0644); err != nil { + return errors.New("failed to write file: %v", err) + } + return nil +} + +func trafficlogInstallPrompt() string { + translatedAppName := i18n.T(strings.ToUpper(common.DefaultAppName)) + return i18n.T("BACKEND_INSTALL_DIAGNOSTIC_TOOLS", translatedAppName, translatedAppName) +} + +// getCapturedPackets writes all packets captured during the input duration. The traffic log must be +// enabled. The packets are written to w in pcapng format. +func (app *App) getCapturedPackets(w io.Writer) error { + app.trafficLogLock.Lock() + app.proxiesLock.RLock() + defer app.trafficLogLock.Unlock() + defer app.proxiesLock.RUnlock() + + if app.trafficLog == nil { + return errTrafficLogDisabled + } + for _, p := range app.proxies { + if err := app.trafficLog.SaveCaptures(p.Addr(), app.captureSaveDuration); err != nil { + return errors.New("failed to save captures for %s: %v", p.Name(), err) + } + } + if err := app.trafficLog.WritePcapng(w); err != nil { + return errors.New("failed to write saved packets: %v", err) + } + return nil +} + +func (app *App) trafficLogOpts() (*config.TrafficLogOptions, error) { + opts := new(config.TrafficLogOptions) + if err := app.flashlight.FeatureOptions(config.FeatureTrafficLog, opts); err != nil { + log.Errorf("failed to unmarshal traffic log options: %v", err) + if features.EnableTrafficlog { + log.Debug("using forced traffic log options") + return features.ForcedTrafficLogOptions, nil + } + return nil, err + } + return opts, nil +} + +// This should be run in an independent routine as it may need to install and block for a +// user-action granting permissions. +func (app *App) toggleTrafficLog(enable bool) { + app.trafficLogLock.Lock() + app.proxiesLock.RLock() + defer app.trafficLogLock.Unlock() + defer app.proxiesLock.RUnlock() + + var ( + opts *config.TrafficLogOptions + err error + ) + if enable { + opts, err = app.trafficLogOpts() + if err != nil { + return + } + } + + switch { + case enable && app.trafficLog == nil: + installDir := appdir.General("Lantern") + log.Debugf("Installing traffic log if necessary in %s", installDir) + if err := app.tryTrafficLogInstall(installDir, *opts); err != nil { + log.Errorf("Failed to install traffic log: %v", err) + return + } + log.Debug("Turning traffic log on") + if err := app.turnOnTrafficLog(installDir, *opts); err != nil { + log.Errorf("Failed to turn on traffic log: %v", err) + } + app.captureSaveDuration = opts.CaptureSaveDuration + if app.captureSaveDuration == 0 { + app.captureSaveDuration = trafficlogDefaultSaveDuration + } + + case enable && app.trafficLog != nil: + err := app.trafficLog.UpdateBufferSizes(opts.CaptureBytes, opts.SaveBytes) + if err != nil { + log.Debugf("Failed to update traffic log buffer sizes: %v", err) + } + + case !enable && app.trafficLog != nil: + log.Debug("Turning traffic log off") + if err := app.trafficLog.Close(); err != nil { + log.Errorf("Failed to close traffic log (this will create a memory leak): %v", err) + } + app.trafficLog = nil + } +} + +// Not concurrency-safe. Intended to serve as a helper to configureTrafficLog. +func (app *App) tryTrafficLogInstall(installDir string, opts config.TrafficLogOptions) error { + u, err := user.Current() + if err != nil { + return errors.New("failed to look up current user for traffic log install: %v", err) + } + + var iconFile string + icon, err := icons.Asset(appIcon("connected")) + if err != nil { + log.Debugf("Unable to load prompt icon during traffic log install: %v", err) + } else { + iconFile = filepath.Join(os.TempDir(), "lantern_tlinstall.ico") + if err := ioutil.WriteFile(iconFile, icon, 0644); err != nil { + // Failed to save the icon file, just use no icon. + iconFile = "" + } + } + + // Default for these options is to ask a single time. + if opts.FailuresThreshold == 0 { + opts.FailuresThreshold = 1 + } + if opts.UserDenialThreshold == 0 { + opts.UserDenialThreshold = 1 + } + + failuresFilePath := filepath.Join(app.configDir, tlInstallFailuresFilename) + failuresFile, err := openTLInstallFailuresFile(failuresFilePath) + if err != nil { + return errors.New("unable to open traffic log install-failures file: %v", err) + } + defer func() { failuresFile.flushChanges() }() + if !failuresFile.LastFailed.IsZero() && + failuresFile.LastFailed.timeSince() > opts.TimeBeforeFailureReset { + failuresFile.Failures = 0 + failuresFile.LastFailed.SetToZero() + } + if !failuresFile.LastDenial.IsZero() && + failuresFile.LastDenial.timeSince() > opts.TimeBeforeDenialReset { + failuresFile.Denials = 0 + failuresFile.LastDenial.SetToZero() + } + if failuresFile.Failures >= opts.FailuresThreshold { + return errors.New( + "failures (%d) already meets threshold (%d)", + failuresFile.Failures, opts.FailuresThreshold, + ) + } + if failuresFile.Denials >= opts.UserDenialThreshold { + return errors.New( + "user denials (%d) already meets threshold (%d)", + failuresFile.Denials, opts.UserDenialThreshold, + ) + } + if !failuresFile.LastFailed.IsZero() { + if opts.WaitTimeSinceFailedInstall == 0 { + return errors.New("aborting: install previously failed") + } + if failuresFile.LastFailed.timeSince() < opts.WaitTimeSinceFailedInstall { + return errors.New( + "aborting: last failed %v ago, wait time is %v", + failuresFile.LastFailed.timeSince(), opts.WaitTimeSinceFailedInstall, + ) + } + } + + // Note that this is a no-op if the traffic log is already installed. + installOpts := tlproc.InstallOptions{Overwrite: opts.Reinstall} + err = tlproc.Install(installDir, u.Username, trafficlogInstallPrompt(), iconFile, &installOpts) + if err != nil { + failuresFile.LastFailed = yamlableNow() + failuresFile.Failures++ + if stderrors.Is(err, tlproc.ErrPermissionDenied) { + failuresFile.Denials++ + failuresFile.LastDenial = yamlableNow() + } + return errors.Wrap(err) + } + return nil +} + +// Not concurrency-safe. Intended to serve as a helper to configureTrafficLog. +func (app *App) turnOnTrafficLog(installDir string, opts config.TrafficLogOptions) error { + var err error + app.trafficLog, err = tlproc.New( + opts.CaptureBytes, + opts.SaveBytes, + installDir, + &tlproc.Options{ + Options: trafficlog.Options{ + MutatorFactory: new(trafficlog.AppStripperFactory), + }, + StartTimeout: trafficlogStartTimeout, + RequestTimeout: trafficlogRequestTimeout, + }) + if err != nil { + return errors.Wrap(err) + } + // These goroutines will close when the traffic log is closed. + go func() { + for err := range app.trafficLog.Errors() { + log.Debugf("Traffic log error: %v", err) + } + }() + go func() { + for stats := range app.trafficLog.Stats() { + log.Debugf("Traffic log stats: %v", stats) + } + }() + proxyAddrs := []string{} + for _, p := range app.proxies { + proxyAddrs = append(proxyAddrs, p.Addr()) + } + if err := app.trafficLog.UpdateAddresses(proxyAddrs); err != nil { + app.trafficLog.Close() + app.trafficLog = nil + return errors.New("failed to start traffic logging for proxies: %v", err) + } + return nil +} diff --git a/desktop/app/trafficlog_test.go b/desktop/app/trafficlog_test.go new file mode 100644 index 000000000..7f5d97048 --- /dev/null +++ b/desktop/app/trafficlog_test.go @@ -0,0 +1,36 @@ +package app + +import ( + "io/ioutil" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestTLInstallFailuresFile(t *testing.T) { + f, err := ioutil.TempFile("", "flashlight-TestTLInstallFailuresFile") + require.NoError(t, err) + defer os.Remove(f.Name()) + f.Close() + + failuresFile, err := openTLInstallFailuresFile(f.Name()) + require.NoError(t, err) + require.True(t, failuresFile.LastDenial.IsZero()) + require.True(t, failuresFile.LastFailed.IsZero()) + require.Zero(t, failuresFile.Denials) + + failuresFile.Denials++ + failuresFile.LastDenial = yamlableNow() + require.NoError(t, failuresFile.flushChanges()) + + failuresFile2, err := openTLInstallFailuresFile(f.Name()) + require.NoError(t, err) + require.True(t, failuresFile2.LastFailed.IsZero()) + require.Equal(t, failuresFile.Denials, failuresFile2.Denials) + require.Equal(t, + time.Time(*failuresFile.LastDenial).Format(yamlableTimeFormat), + time.Time(*failuresFile2.LastDenial).Format(yamlableTimeFormat), + ) +} diff --git a/desktop/app/version.go b/desktop/app/version.go new file mode 100644 index 000000000..090423fed --- /dev/null +++ b/desktop/app/version.go @@ -0,0 +1,12 @@ +package app + +var ( + // This gets set at build time + ApplicationVersion = "9999.99.99" + + // This gets set at build time + RevisionDate = "" + + // This gets set at build time + BuildDate = "" +) diff --git a/desktop/assets/app.icns b/desktop/assets/app.icns new file mode 100644 index 000000000..3934730dc Binary files /dev/null and b/desktop/assets/app.icns differ diff --git a/desktop/autoupdate/autoupdate.go b/desktop/autoupdate/autoupdate.go new file mode 100644 index 000000000..800e8d03c --- /dev/null +++ b/desktop/autoupdate/autoupdate.go @@ -0,0 +1,108 @@ +package autoupdate + +import ( + "fmt" + "net/http" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/getlantern/autoupdate" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/proxied" + "github.com/getlantern/golog" + "github.com/getlantern/i18n" + notify "github.com/getlantern/notifier" + + "github.com/getlantern/lantern-client/desktop/notifier" +) + +var ( + log = golog.LoggerFor("lantern-desktop.autoupdate") + updateServerURL = common.UpdateServerURL + PublicKey = []byte(autoupdate.PackagePublicKey) + Version string + translationAppName = strings.ToUpper(common.DefaultAppName) + + cfgMutex sync.RWMutex + watchForUpdateOnce sync.Once + httpClient atomic.Value + fnIconURL func() string +) + +// Configure sets the CA certificate to pin for the TLS auto-update connection. +func Configure(updateURL, updateCA string, iconURL func() string) { + setUpdateURL(updateURL) + fnIconURL = iconURL + httpClient.Store( + &http.Client{ + Transport: proxied.ChainedThenFrontedWith(updateCA), + }) + enableAutoupdate() +} + +func setUpdateURL(url string) { + if url == "" { + return + } + cfgMutex.Lock() + defer cfgMutex.Unlock() + updateServerURL = url +} + +func getUpdateURL() string { + cfgMutex.RLock() + defer cfgMutex.RUnlock() + return fmt.Sprintf("%s/%s/%s", strings.TrimRight(updateServerURL, "/"), "update", strings.ToLower(common.DefaultAppName)) +} + +func enableAutoupdate() { + watchForUpdateOnce.Do(func() { + go watchForUpdate() + }) +} + +func CheckUpdates() (string, error) { + return autoupdate.CheckMobileUpdate(&autoupdate.Config{ + CurrentVersion: Version, + URL: getUpdateURL(), + HTTPClient: httpClient.Load().(*http.Client), + PublicKey: PublicKey, + }) +} + +func watchForUpdate() { + log.Debugf("Software version: %s", Version) + for { + newVersion, err := autoupdate.ApplyNext(&autoupdate.Config{ + CurrentVersion: Version, + CheckInterval: 4 * time.Hour, + URL: getUpdateURL(), + PublicKey: PublicKey, + HTTPClient: httpClient.Load().(*http.Client), + }) + if err == nil { + notifyUser(newVersion) + log.Debugf("Got update for version %s", newVersion) + } else { + // unrecoverable error which tends to happen again + log.Error(err) + } + // At this point we either updated the binary or failed to recover from a + // update error, let's wait a bit longer before looking for another update. + time.Sleep(24 * time.Hour) + } +} + +func notifyUser(newVersion string) { + note := ¬ify.Notification{ + Title: i18n.T("BACKEND_AUTOUPDATED_TITLE", i18n.T(translationAppName), newVersion), + Message: i18n.T("BACKEND_AUTOUPDATED_MESSAGE", i18n.T(translationAppName), newVersion, i18n.T(translationAppName)), + IconURL: fnIconURL(), + ClickLabel: i18n.T("BACKEND_CLICK_LABEL_GOT_IT"), + } + if !notifier.ShowNotification(note, "autoupdate-notification") { + log.Debug("Unable to show autoupdate notification") + } +} diff --git a/desktop/cmd/main.go b/desktop/cmd/main.go new file mode 100644 index 000000000..1e2d1aed7 --- /dev/null +++ b/desktop/cmd/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "os" + "os/signal" + "path/filepath" + "runtime" + "runtime/debug" + "syscall" + + "github.com/getlantern/appdir" + "github.com/getlantern/flashlight/v7" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/golog" + "github.com/getlantern/lantern-client/desktop/app" +) + +var ( + log = golog.LoggerFor("lantern-desktop.main") +) + +func main() { + // systray requires the goroutine locked with main thread, or the whole + // application will crash. + runtime.LockOSThread() + // Since Go 1.6, panic prints only the stack trace of current goroutine by + // default, which may not reveal the root cause. Switch to all goroutines. + debug.SetTraceback("all") + flags := flashlight.ParseFlags() + + cdir := configDir(&flags) + settings := loadSettings(cdir) + a := app.NewApp(flags, cdir, settings) + log.Debug("Running headless") + runApp(a) + err := a.WaitForExit() + if err != nil { + log.Errorf("Lantern stopped with error %v", err) + os.Exit(-1) + } + log.Debug("Lantern stopped") + os.Exit(0) +} + +// loadSettings loads the initial settings at startup, either from disk or using defaults. +func loadSettings(configDir string) *app.Settings { + path := filepath.Join(configDir, "settings.yaml") + if common.Staging { + path = filepath.Join(configDir, "settings-staging.yaml") + } + settings := app.LoadSettingsFrom(app.ApplicationVersion, app.RevisionDate, app.BuildDate, path) + if common.Staging { + settings.SetUserIDAndToken(9007199254740992, "OyzvkVvXk7OgOQcx-aZpK5uXx6gQl5i8BnOuUkc0fKpEZW6tc8uUvA") + } + return settings +} + +func configDir(flags *flashlight.Flags) string { + cdir := flags.ConfigDir + if cdir == "" { + cdir = appdir.General(common.DefaultAppName) + } + log.Debugf("Using config dir %v", cdir) + if _, err := os.Stat(cdir); err != nil { + if os.IsNotExist(err) { + // Create config dir + if err := os.MkdirAll(cdir, 0750); err != nil { + log.Errorf("Unable to create configdir at %s: %s", configDir, err) + } + } + } + return cdir +} + +func runApp(a *app.App) { + // Schedule cleanup actions + handleSignals(a) + a.Run(true) +} + +// Handle system signals for clean exit +func handleSignals(a *app.App) { + c := make(chan os.Signal, 1) + signal.Notify(c, + syscall.SIGHUP, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT) + go func() { + s := <-c + log.Debugf("Got signal \"%s\", exiting...", s) + os.Exit(1) + //desktop.QuitSystray(a) + }() +} diff --git a/desktop/common/common.go b/desktop/common/common.go new file mode 100644 index 000000000..551a0defc --- /dev/null +++ b/desktop/common/common.go @@ -0,0 +1,120 @@ +package common + +import ( + "os" + "strconv" + "strings" + + fcommon "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/golog" +) + +// Environment represents the different +// environment modes Lantern may be running in +type Environment int + +const ( + Development Environment = iota + Production + Staging +) + +// ServerType is a type that represents different Lantern +// back-end services +type ServerType int + +const ( + AuthServer ServerType = iota +) + +var ( + // EnvMapping is a mapping for the Environment enum + EnvMapping = map[string]Environment{ + Development.String(): Development, + Production.String(): Production, + Staging.String(): Staging, + } + + // AuthServerAddr is the auth server address to use + AuthServerAddr = "https://auth4.lantern.network" + + // DisablePort is a boolean flag that corresponds with the DISABLE_PORT_RANDOMIZATION env var + DisablePort bool + + // Environment is the environment flashlight is currently running in + env Environment + + // ZipkinEndpoint specifies the URL to which zipkin spans should be sent + ZipkinEndpoint = "https://zipkin-pro-server-neu.128.network/api/v2/spans" + // ZipkinAPIKey specifies the API key to use when sending spans to Zipkin, should match https://github.com/getlantern/pro-server-neu-infrastructure-zipkin/blob/main/.codedeploy/default#L30 + ZipkinAPIKey = "38249ee3-ca14-45b7-9c58-3e668c3e6791" + + log = golog.LoggerFor("lantern-desktop.common") +) + +func (e Environment) String() string { + switch e { + case Development: + return "development" + case Staging: + return "staging" + default: + return "production" + } +} + +// IsDevelopment checks if flashlight is currently being run in dev mode +func (e Environment) IsDevelopment() bool { + return e == Development +} + +// IsStaging checks if flashlight is currently being run in staging mode +func (e Environment) IsStaging() bool { + return e == Staging +} + +func (s ServerType) String() string { + switch s { + case AuthServer: + return "auth" + default: + return "" + } +} + +func init() { + DisablePort, _ = strconv.ParseBool(os.Getenv("DISABLE_PORT_RANDOMIZATION")) + envVar := strings.ToLower(os.Getenv("ENVIRONMENT")) + env = EnvMapping[envVar] + + if env.IsStaging() { + AuthServerAddr = "https://auth-staging.lantern.network" + } +} + +// GetAPIAddr returns the API address to use for the given +// server type. If an address is specified with a command line flag +// that value overides the default +func GetAPIAddr(serverType ServerType, flagAddr string) string { + var defaultAddr string + switch serverType { + case AuthServer: + defaultAddr = AuthServerAddr + } + addr := flagAddr + if addr == "" { + addr = defaultAddr + } + log.Debugf("Using %s server at %s", serverType.String(), addr) + return addr +} + +// IsDevEnvironment checks if flashlight is currently being run in development mode +func IsDevEnvironment() bool { + return DisablePort && env.IsDevelopment() +} + +// IsDevEnvironment checks if flashlight is currently being run in staging mode +func IsStagingEnvironment() bool { + return fcommon.Staging || env.IsStaging() +} diff --git a/desktop/deviceid/deviceid.go b/desktop/deviceid/deviceid.go new file mode 100644 index 000000000..085baa7b4 --- /dev/null +++ b/desktop/deviceid/deviceid.go @@ -0,0 +1,17 @@ +package deviceid + +import ( + "encoding/base64" + + "github.com/getlantern/golog" + "github.com/google/uuid" +) + +var ( + log = golog.LoggerFor("desktop.deviceid") +) + +// OldStyleDeviceID returns the old style of device ID, which is derived from the MAC address. +func OldStyleDeviceID() string { + return base64.StdEncoding.EncodeToString(uuid.NodeID()) +} diff --git a/desktop/deviceid/deviceid_nonwindows.go b/desktop/deviceid/deviceid_nonwindows.go new file mode 100644 index 000000000..d2f0ea3ce --- /dev/null +++ b/desktop/deviceid/deviceid_nonwindows.go @@ -0,0 +1,45 @@ +//go:build !windows +// +build !windows + +package deviceid + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/getlantern/appdir" + "github.com/google/uuid" +) + +// Get returns a unique identifier for this device. The identifier is a random UUID that's stored on +// disk at $HOME/.lanternsecrets/.deviceid. If unable to read/write to that location, this defaults to the +// old-style device ID derived from MAC address. +func Get() string { + path := filepath.Join(appdir.InHomeDir(".lanternsecrets")) + err := os.Mkdir(path, 0755) + if err != nil && !os.IsExist(err) { + log.Errorf("Unable to create folder to store deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + + filename := filepath.Join(path, ".deviceid") + existing, err := ioutil.ReadFile(filename) + if err != nil { + log.Debug("Storing new deviceID") + _deviceID, err := uuid.NewRandom() + if err != nil { + log.Errorf("Error generating new deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + deviceID := _deviceID.String() + err = ioutil.WriteFile(filename, []byte(deviceID), 0644) + if err != nil { + log.Errorf("Error storing new deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + return deviceID + } else { + return string(existing) + } +} diff --git a/desktop/deviceid/deviceid_test.go b/desktop/deviceid/deviceid_test.go new file mode 100644 index 000000000..d2d98c5c8 --- /dev/null +++ b/desktop/deviceid/deviceid_test.go @@ -0,0 +1,14 @@ +package deviceid + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGet(t *testing.T) { + id1 := Get() + require.True(t, len(id1) > 8) + id2 := Get() + require.Equal(t, id1, id2) +} diff --git a/desktop/deviceid/deviceid_windows.go b/desktop/deviceid/deviceid_windows.go new file mode 100644 index 000000000..e68999862 --- /dev/null +++ b/desktop/deviceid/deviceid_windows.go @@ -0,0 +1,47 @@ +//go:build windows +// +build windows + +package deviceid + +import ( + "github.com/google/uuid" + "golang.org/x/sys/windows/registry" +) + +const ( + keyPath = `Sofware\\Lantern` +) + +// Get returns a unique identifier for this device. The identifier is a random UUID that's stored in the registry +// at HKEY_CURRENT_USERS\Software\Lantern\deviceid. If unable to read/write to the registry, this defaults to the +// old-style device ID derived from MAC address. +func Get() string { + key, _, err := registry.CreateKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE|registry.SET_VALUE|registry.WRITE) + if err != nil { + log.Errorf("Unable to create registry entry to store deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + + existing, _, err := key.GetStringValue("deviceid") + if err != nil { + if err != registry.ErrNotExist { + log.Errorf("Unexpected error reading deviceID, default to old-style device ID: %v", err) + return OldStyleDeviceID() + } + log.Debug("Storing new deviceID") + _deviceID, err := uuid.NewRandom() + if err != nil { + log.Errorf("Error generating new deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + deviceID := _deviceID.String() + err = key.SetStringValue("deviceid", deviceID) + if err != nil { + log.Errorf("Error storing new deviceID, defaulting to old-style device ID: %v", err) + return OldStyleDeviceID() + } + return deviceID + } + + return existing +} diff --git a/desktop/features/features.go b/desktop/features/features.go new file mode 100644 index 000000000..4a3e44021 --- /dev/null +++ b/desktop/features/features.go @@ -0,0 +1,86 @@ +package features + +import ( + "os" + "strconv" + "strings" + "time" + + "github.com/getlantern/flashlight/v7/config" +) + +var ( + // EnableReplicaFeatures enables replica related features via the REPLICA + // build time variable. + EnableReplicaFeatures = "false" + + // EnableReplica is true when we should force replica to be enabled + // regardless of other configuration. + EnableReplica = false + + // EnableTrafficlogFeatures is true when the traffic log should be enabled regardless of other + // config. This can be set at build-time using -ldflags. For example, + // go build -ldflags "-X github.com/getlantern/flashlight/common.EnableTrafficlogFeatures=true" + // More commonly you'd enable this via the TRAFFICLOG build time variable. + EnableTrafficlogFeatures = "false" + + // EnableTrafficlog is true when the traffic log should be enabled regardless of + // other config. This can be set at build-time; see EnableTrafficlogFeatures + EnableTrafficlog = false + + // ForcedTrafficLogOptions contains the traffic log options that should be used if the + // traffic log is force enabled at build time. + ForcedTrafficLogOptions = &config.TrafficLogOptions{ + CaptureBytes: 10 * 1024 * 1024, + SaveBytes: 10 * 1024 * 1024, + CaptureSaveDuration: 5 * time.Minute, + Reinstall: true, + WaitTimeSinceFailedInstall: 24 * time.Hour, + UserDenialThreshold: 3, + TimeBeforeDenialReset: 24 * time.Hour, + FailuresThreshold: 3, + TimeBeforeFailureReset: 24 * time.Hour, + } + + // EnabledFeatures is a map of features to their + // current enabled status + EnabledFeatures map[Feature]bool +) + +// Feature represents different types of Lantern "features" that can be enabled +// with build time variables or environment variables +type Feature int + +const ( + Replica Feature = iota + Auth + Trafficlog +) + +func (f Feature) String() string { + switch f { + case Replica: + return "replica" + case Auth: + return "auth" + case Trafficlog: + return "trafficlog" + } + return "" +} + +// isFeatureEnabled checks if a feature is enabled via a build time variable +// OR environment variable +func isFeatureEnabled(buildTimeVar string, feature Feature) bool { + buildTimeEnable, _ := strconv.ParseBool(buildTimeVar) + envVar := strings.ToUpper(feature.String()) + envVarEnable, _ := strconv.ParseBool(os.Getenv(envVar)) + return buildTimeEnable || envVarEnable +} + +func init() { + EnabledFeatures = map[Feature]bool{ + Replica: isFeatureEnabled(EnableReplicaFeatures, Replica), + Trafficlog: isFeatureEnabled(EnableTrafficlogFeatures, Trafficlog), + } +} diff --git a/desktop/icons/beam_connected_32.ico b/desktop/icons/beam_connected_32.ico new file mode 100644 index 000000000..f78f43341 Binary files /dev/null and b/desktop/icons/beam_connected_32.ico differ diff --git a/desktop/icons/beam_connected_32.png b/desktop/icons/beam_connected_32.png new file mode 100644 index 000000000..5c7c32bf9 Binary files /dev/null and b/desktop/icons/beam_connected_32.png differ diff --git a/desktop/icons/beam_connectedalert_32.ico b/desktop/icons/beam_connectedalert_32.ico new file mode 100644 index 000000000..88c2bfae9 Binary files /dev/null and b/desktop/icons/beam_connectedalert_32.ico differ diff --git a/desktop/icons/beam_connectedalert_32.png b/desktop/icons/beam_connectedalert_32.png new file mode 100644 index 000000000..b408b6276 Binary files /dev/null and b/desktop/icons/beam_connectedalert_32.png differ diff --git a/desktop/icons/beam_disconnected_32.ico b/desktop/icons/beam_disconnected_32.ico new file mode 100644 index 000000000..07eace08f Binary files /dev/null and b/desktop/icons/beam_disconnected_32.ico differ diff --git a/desktop/icons/beam_disconnected_32.png b/desktop/icons/beam_disconnected_32.png new file mode 100644 index 000000000..874dba4bb Binary files /dev/null and b/desktop/icons/beam_disconnected_32.png differ diff --git a/desktop/icons/beam_disconnectedalert_32.ico b/desktop/icons/beam_disconnectedalert_32.ico new file mode 100644 index 000000000..88c2bfae9 Binary files /dev/null and b/desktop/icons/beam_disconnectedalert_32.ico differ diff --git a/desktop/icons/beam_disconnectedalert_32.png b/desktop/icons/beam_disconnectedalert_32.png new file mode 100644 index 000000000..b408b6276 Binary files /dev/null and b/desktop/icons/beam_disconnectedalert_32.png differ diff --git a/desktop/icons/icons.go b/desktop/icons/icons.go new file mode 100644 index 000000000..90b796ce7 --- /dev/null +++ b/desktop/icons/icons.go @@ -0,0 +1,503 @@ +// Code generated by go-bindata. +// sources: +// icons/.DS_Store +// icons/beam_connected_32.ico +// icons/beam_connected_32.png +// icons/beam_connectedalert_32.ico +// icons/beam_connectedalert_32.png +// icons/beam_disconnected_32.ico +// icons/beam_disconnected_32.png +// icons/beam_disconnectedalert_32.ico +// icons/beam_disconnectedalert_32.png +// icons/lantern_connected_32.ico +// icons/lantern_connectedalert_32.ico +// icons/lantern_disconnected_32.ico +// icons/lantern_disconnectedalert_32.ico +// DO NOT EDIT! + +package icons + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "strings" + "time" + "unsafe" +) + +func bindataRead(data, name string) ([]byte, error) { + var empty [0]byte + sx := (*reflect.StringHeader)(unsafe.Pointer(&data)) + b := empty[:] + bx := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bx.Data = sx.Data + bx.Len = len(data) + bx.Cap = bx.Len + return b, nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _Ds_store = "\x00\x00\x00\x01\x42\x75\x64\x31\x00\x00\x10\x00\x00\x00\x08\x00\x00\x00\x10\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\x01\x00\x00\x00\x80\x00\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x02\x00\x00\x00\x00\x01\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x20\x00\x00\x00\x00\x01\x00\x00\x40\x00\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x01\x00\x10\x00\x00\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x01\x00\x40\x00\x00\x00\x00\x00\x01\x00\x80\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x01\x20\x00\x00\x00\x00\x00\x00\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x10\x0b\x00\x00\x00\x45\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x44\x53\x44\x42\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x80\x00\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x02\x00\x00\x00\x00\x01\x00\x00\x04\x00\x00\x00\x00\x02\x00\x00\x08\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x20\x00\x00\x00\x00\x01\x00\x00\x40\x00\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x01\x00\x10\x00\x00\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x01\x00\x40\x00\x00\x00\x00\x00\x01\x00\x80\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x01\x20\x00\x00\x00\x00\x00\x00\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + +func Ds_storeBytes() ([]byte, error) { + return bindataRead( + _Ds_store, + ".DS_Store", + ) +} + +func Ds_store() (*asset, error) { + bytes, err := Ds_storeBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: ".DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1602507189, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_connected_32Ico = "\x00\x00\x01\x00\x01\x00\x22\x22\x00\x00\x01\x00\x20\x00\x48\x13\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x22\x00\x00\x00\x44\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x10\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa0\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\xa0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xa0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x40\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xaf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf0\x0f\xc0\x00\x00\x00\xff\xff\xc0\x03\xc0\x00\x00\x00\xff\xff\x80\x01\xc0\x00\x00\x00\xff\xff\x00\x00\xc0\x00\x00\x00\xff\xfe\x00\x00\x40\x00\x00\x00\xff\xfe\x02\x00\x40\x00\x00\x00\xff\xfc\x07\x00\x00\x00\x00\x00\xff\xfc\x0f\x80\x00\x00\x00\x00\xff\xf8\x1d\xc0\x00\x00\x00\x00\xff\xc0\x38\xe0\x00\x00\x00\x00\xff\x00\x10\x70\x00\x00\x00\x00\xfe\x00\x00\x38\x00\x00\x00\x00\xfc\x0c\x00\x1c\x00\x00\x00\x00\xf8\x3c\x00\x08\x00\x00\x00\x00\xf0\x7e\x00\x00\x40\x00\x00\x00\xe0\xfe\x00\x00\x40\x00\x00\x00\xe1\xff\x00\x00\xc0\x00\x00\x00\xc3\xff\x80\x00\xc0\x00\x00\x00\xc3\xff\xc0\x00\xc0\x00\x00\x00\x87\xff\xf0\x08\xc0\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00" + +func beam_connected_32IcoBytes() ([]byte, error) { + return bindataRead( + _beam_connected_32Ico, + "beam_connected_32.ico", + ) +} + +func beam_connected_32Ico() (*asset, error) { + bytes, err := beam_connected_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_connected_32.ico", size: 4958, mode: os.FileMode(420), modTime: time.Unix(1603243598, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_connected_32Png = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x22\x00\x00\x00\x22\x08\x06\x00\x00\x00\x3a\x47\x0b\xc2\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\x38\x65\x58\x49\x66\x4d\x4d\x00\x2a\x00\x00\x00\x08\x00\x01\x87\x69\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\x00\x00\x00\x00\x21\xb2\x83\x6e\x00\x00\x01\xf4\x49\x44\x41\x54\x58\x09\xed\x53\x6d\x71\x83\x50\x10\x4c\x6b\xa0\x48\x88\x84\x48\xc0\x41\xe3\x20\xcf\x41\xeb\xa0\x71\xd0\x54\x01\xcf\x41\x25\x14\x07\xc5\x01\x38\x48\xaa\xa0\xdd\x0d\xec\xcc\xe5\xf2\xc8\x10\xf2\xd1\x3f\xdc\xcc\x71\x5f\x7b\x7b\xc7\x31\xcc\x66\x93\x4c\x17\x98\x2e\x30\x5d\xe0\xb2\x0b\x3c\x74\xed\x39\xec\x0b\x34\xeb\xe2\x7b\x99\x1d\x06\x7d\x40\x4b\x0d\xdc\xc2\xf9\xfd\x27\xad\xb9\x84\x2e\xc2\x25\x24\x3f\x70\x2a\x05\x37\xb2\x0b\xf0\x3e\x19\x6e\xed\xb1\x3f\x8d\x2e\x42\xd0\xad\x25\xc7\x00\xcd\x2b\x39\xec\x91\x0f\x88\xbd\x40\xd6\xa6\xee\xf6\xdc\xcf\xd6\x22\xa5\x19\x7b\xaf\x8b\x68\xa4\x9d\xbd\xff\x5b\x74\xaa\x6f\x21\x46\xda\x15\xfa\x0a\x68\x0d\x15\xe7\x17\xfc\x4f\xe8\x33\x94\xa2\xda\xae\x0d\x0f\x9f\x11\xa1\x1a\xf3\xc3\xd2\xa0\x68\x09\x94\x06\x88\x27\x65\x2d\x26\xa6\x98\xe7\x48\xaa\xf1\xdc\xab\xbc\x9b\x5e\x71\x0c\xb1\x9c\x99\x94\x88\xac\x08\xd6\x49\xc4\x71\xb2\x30\x3d\xea\x1d\x6a\x37\xc7\x74\x6d\x26\x83\xe1\x77\x13\x51\x68\xd3\xbd\x4f\x7e\x0e\x61\xc7\x5a\x72\x24\xc5\x93\x87\x24\xaa\x4d\xd6\x30\xe7\x2c\xc0\x97\xcc\xa1\x95\xe9\x23\x47\xaf\x04\x54\xec\x80\xb7\x04\xd2\x63\x2c\xbe\xcf\xcf\x3b\x9e\x0c\xd6\x2e\x43\xae\x5e\x09\xa8\x58\xc2\x1a\xf1\xca\xa0\xa3\xab\x5b\x6c\xca\x0f\xa6\x97\x6e\x01\x15\x2e\x32\x71\x4a\x96\x28\xee\xa0\x6a\xa0\xdd\x42\x49\x52\xbb\x3c\x6b\x65\x22\xc7\x7c\x80\x5a\x61\x3f\xf3\xd2\x41\x7f\x29\xcf\x18\x4d\x93\x9a\xbd\x0d\xc0\x50\x22\xd4\xd6\x02\x62\x2b\x05\x02\x5b\x97\x6f\x31\x27\xfd\x39\xaa\x11\xea\x2f\x44\xa2\x35\xd4\x4a\x44\xc0\x7c\x80\x5a\x79\x45\xa0\xc1\xde\x5a\xdc\x60\x3f\x07\xb2\x81\x8a\x8c\x9f\x6b\x01\xb5\x92\xdb\x00\x7e\x80\x0a\xef\x6d\xe5\xb0\x67\x85\xd1\x11\xa7\x96\x11\x61\x70\x58\xbf\x48\x14\x70\x8c\x0d\x68\xf2\x84\x5c\x86\x79\x2b\x01\x81\xc7\xf9\x78\x69\x1b\xc6\xf8\x4d\xcf\x90\xd0\x91\xd1\xfa\xa1\x3e\x6e\x3a\xec\x45\x86\x6f\xe2\x89\x15\x17\x27\x6a\xc2\xd0\x5e\x7c\x0d\xbd\x41\x1c\x38\xd0\x0e\x97\xbf\x11\xc9\xb5\x2c\x09\x45\x3e\xd4\x5e\x7d\x09\xbd\x0c\x4f\xdc\x0c\x58\x88\x18\x62\x6f\x2e\x01\x13\x22\xb4\x82\xea\x3a\xf4\x99\xeb\x5d\xe0\x0f\x33\x52\x65\x7a\x94\xc2\x76\x09\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82" + +func beam_connected_32PngBytes() ([]byte, error) { + return bindataRead( + _beam_connected_32Png, + "beam_connected_32.png", + ) +} + +func beam_connected_32Png() (*asset, error) { + bytes, err := beam_connected_32PngBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_connected_32.png", size: 638, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_connectedalert_32Ico = "\x00\x00\x01\x00\x01\x00\x22\x22\x00\x00\x01\x00\x20\x00\x48\x13\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x22\x00\x00\x00\x44\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x10\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa0\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\xa0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xa0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xaf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf0\x0f\xc0\x00\x00\x00\xff\xff\xc0\x03\xc0\x00\x00\x00\xff\xff\x80\x01\xc0\x00\x00\x00\xff\xff\x03\xc0\xc0\x00\x00\x00\xff\xfe\x03\xc0\x40\x00\x00\x00\xff\xfe\x03\xc0\x40\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\xff\xf8\x00\x00\x00\x00\x00\x00\xff\xc0\x03\xc0\x00\x00\x00\x00\xff\x00\x03\xc0\x00\x00\x00\x00\xfe\x00\x03\xc0\x00\x00\x00\x00\xfc\x0c\x03\xc0\x00\x00\x00\x00\xf8\x3c\x03\xc0\x00\x00\x00\x00\xf0\x7e\x03\xc0\x40\x00\x00\x00\xe0\xfe\x03\xc0\x40\x00\x00\x00\xe1\xff\x03\xc0\xc0\x00\x00\x00\xc3\xff\x80\x00\xc0\x00\x00\x00\xc3\xff\xc0\x00\xc0\x00\x00\x00\x87\xff\xf0\x08\xc0\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00" + +func beam_connectedalert_32IcoBytes() ([]byte, error) { + return bindataRead( + _beam_connectedalert_32Ico, + "beam_connectedalert_32.ico", + ) +} + +func beam_connectedalert_32Ico() (*asset, error) { + bytes, err := beam_connectedalert_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_connectedalert_32.ico", size: 4958, mode: os.FileMode(420), modTime: time.Unix(1603243618, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_connectedalert_32Png = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x22\x00\x00\x00\x22\x08\x06\x00\x00\x00\x3a\x47\x0b\xc2\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\x38\x65\x58\x49\x66\x4d\x4d\x00\x2a\x00\x00\x00\x08\x00\x01\x87\x69\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\x00\x00\x00\x00\x21\xb2\x83\x6e\x00\x00\x01\xe6\x49\x44\x41\x54\x58\x09\xed\x55\xdb\x51\xc3\x40\x0c\x04\x1a\xc0\x25\xa4\x04\x4a\x30\x15\x90\x0e\xe2\x0e\xa0\x03\xe8\x80\x50\x41\xae\x03\xe8\x20\xea\x80\x50\x81\xdd\x41\x42\x05\x61\x65\x67\x67\x74\x9a\x3b\x63\x9c\x07\x3f\xd6\x8c\x4e\x8f\x5b\xad\x84\x6e\x1c\xae\xae\x26\x99\x36\x30\x6d\x60\xda\xc0\x71\x1b\xb8\x3e\x94\x97\xb0\x8f\xd0\xe2\x10\x5f\xca\xec\xd0\xe8\x0d\x2a\x6c\xb8\x85\xb3\xff\x27\xad\x75\x08\x6e\x44\x87\xa0\x7c\xc3\xd9\x30\x38\x93\xbd\x03\xef\xad\xe1\xe6\x1c\xed\x6a\xb8\x11\x05\x9d\x5b\x4a\x34\x60\x3f\xd1\x66\x37\x7a\x40\xec\x06\x8a\x2e\x75\xb1\xb3\xed\xcd\x41\xc4\xb4\xbd\xd4\x46\xd8\xd2\xf6\x6e\xbf\x16\xae\xaa\x26\x62\xa4\x5d\xa0\x6e\x05\x55\x9e\xfd\x41\xd7\xb0\xef\xd0\x07\xa8\x0a\xef\x76\x5d\x18\x9f\x01\x21\x0b\xcb\xf8\x6a\x50\x34\x07\x8a\x0d\xc8\x93\xb2\x16\x13\x52\xcc\x33\x24\x59\xf8\x99\x02\xf4\xe4\x5e\x4d\x2d\x39\x86\xd8\x59\x8e\x33\x18\xc2\x97\x1c\xc8\xe5\x57\xa6\xc6\x36\x77\xb0\xe8\xcb\x24\x6e\xe9\x41\x8c\x0b\x38\xfa\x6e\x04\x56\xbc\xc8\x58\x7d\x0e\x62\xbd\xf5\x25\x92\xc1\x2a\x47\x52\x3c\x79\x95\x44\x75\xc9\x1a\xc6\x0f\xc0\xd8\x97\x49\x06\xab\x1c\x59\xa9\x70\x43\x42\xb5\xcf\x09\xa4\xc7\x58\xbc\xfa\x5e\x04\x09\x8f\x61\x9c\xdd\x8a\x92\x54\xae\xb0\x46\xbc\x80\x52\x02\x1c\x12\xa5\x2c\x71\xb4\xd2\x83\x0f\x04\xe5\xac\x4e\xba\x83\xda\x46\x5b\xc4\x2b\x68\xed\xf2\x16\xa3\xbe\x17\x41\xc2\x63\x18\x0f\xfa\x4a\x0b\x10\x84\x1e\x12\x92\x79\x8b\x92\x48\x04\x91\xc7\xd8\x38\x02\xf7\x05\x33\x5c\x06\xa8\xdf\x90\x25\xb3\x3e\xa0\x91\x08\x22\x7b\xef\xfd\x08\x3c\x34\x28\x01\x6c\xa0\x9e\x6c\x6c\xbc\xe1\x3f\x3d\x70\xfe\x49\x04\x68\xd5\x53\xc9\xe8\x41\x74\x00\xf9\x65\x8a\x7b\xdc\x5b\xfd\xea\xc1\x7f\xf4\xdc\x0d\xba\x6a\x80\xca\x3d\x87\x27\x90\x0c\xb6\x51\xe0\xd8\xa7\xd1\x5a\x95\xa7\xce\x1c\x75\x9e\x82\xa3\x1d\x20\xe0\x4c\x6d\xc5\x4f\x27\x09\xdc\xd2\x83\x8e\x8d\x95\xd0\x0f\xb3\x46\xce\xaa\xfe\x10\x5a\xcc\xc9\x87\xe0\x1f\x31\x87\xd3\xb8\x66\xb6\x31\x7d\xc5\x28\xf6\xec\x52\xa1\x43\x80\x6e\xa0\x6c\xae\xbe\xe6\xb2\x03\xfc\x00\xac\x27\x39\xe2\xaf\xb9\x1e\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82" + +func beam_connectedalert_32PngBytes() ([]byte, error) { + return bindataRead( + _beam_connectedalert_32Png, + "beam_connectedalert_32.png", + ) +} + +func beam_connectedalert_32Png() (*asset, error) { + bytes, err := beam_connectedalert_32PngBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_connectedalert_32.png", size: 624, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_disconnected_32Ico = "\x00\x00\x01\x00\x01\x00\x22\x22\x00\x00\x01\x00\x20\x00\x48\x13\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x22\x00\x00\x00\x44\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x10\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x70\x00\x00\x00\x80\x00\x00\x00\x90\x00\x00\x00\x90\x00\x00\x00\x80\x00\x00\x00\x70\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x90\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x90\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x9f\x00\x00\x00\x5f\x00\x00\x00\x3f\x00\x00\x00\x3f\x00\x00\x00\x3f\x00\x00\x00\x3f\x00\x00\x00\x5f\x00\x00\x00\xaf\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x8f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xaf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xf8\x07\xff\xc0\x00\x00\x00\xff\xc0\x00\xff\xc0\x00\x00\x00\xff\x00\x00\x3f\xc0\x00\x00\x00\xfe\x00\x00\x1f\xc0\x00\x00\x00\xfc\x0f\xfc\x0f\xc0\x00\x00\x00\xf8\x3f\xfe\x07\xc0\x00\x00\x00\xf0\x7f\xff\x83\xc0\x00\x00\x00\xe0\xff\xff\xc1\xc0\x00\x00\x00\xe1\xff\xff\xe1\xc0\x00\x00\x00\xc3\xff\xff\xf0\xc0\x00\x00\x00\xc3\xff\xff\xf0\xc0\x00\x00\x00\x87\xff\xff\xf8\xc0\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00" + +func beam_disconnected_32IcoBytes() ([]byte, error) { + return bindataRead( + _beam_disconnected_32Ico, + "beam_disconnected_32.ico", + ) +} + +func beam_disconnected_32Ico() (*asset, error) { + bytes, err := beam_disconnected_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_disconnected_32.ico", size: 4958, mode: os.FileMode(420), modTime: time.Unix(1603243633, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_disconnected_32Png = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x22\x00\x00\x00\x22\x08\x06\x00\x00\x00\x3a\x47\x0b\xc2\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\x38\x65\x58\x49\x66\x4d\x4d\x00\x2a\x00\x00\x00\x08\x00\x01\x87\x69\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\x00\x00\x00\x00\x21\xb2\x83\x6e\x00\x00\x01\x61\x49\x44\x41\x54\x58\x09\xed\x55\xeb\x51\xc3\x30\x18\x33\x2c\xd0\x8c\x90\x11\x3a\x82\x47\x60\x03\xbc\x01\x23\xc0\x06\xc0\x06\x1e\xa1\x23\x78\x03\xba\x41\x3a\x42\x98\xa0\x48\x69\xc4\x7d\xb4\xc6\x4d\xc9\x25\xfc\xb1\xee\x14\x3f\xbe\x87\x6c\xe5\xd2\x3a\x57\x51\x1d\xa8\x0e\x54\x07\xe6\x39\x70\x37\x96\x7b\x8c\x4f\x60\x33\xae\xd7\x1a\x7a\x08\xbd\x83\x49\x82\x1d\x26\xc7\x7f\x22\xb5\x9d\x1c\xe1\x21\x84\x4f\x4c\xf6\x5a\x2c\x34\x6e\xd1\x77\x63\x7a\xeb\x1c\x83\x35\x72\x84\x49\x4b\xc3\x43\x40\x7a\x89\x62\xf7\x7c\x00\xd6\x81\xe6\xb4\xb5\xda\x73\xd0\xd6\x41\x92\x91\x5d\xcb\x11\x49\x5a\xed\xe1\x6b\x91\x55\x1f\xca\x58\x70\xec\xd0\x9b\x7a\x7d\x4e\x23\x8e\x41\x26\x78\x70\x29\x78\x34\xd6\xa5\x63\x4e\xa4\x35\x09\x4b\xba\xc2\xde\x3a\x08\x35\xb3\x88\xd8\x55\xd2\x4b\x36\x63\xde\x26\x7b\xaa\x7f\x2c\xb5\xe2\x17\xc3\xf7\xa6\xe4\x50\x4a\xbe\x31\xc6\x5e\xea\x4b\x0d\x6a\x15\xf1\x80\xa8\x0a\x38\x86\x62\xf6\xb4\x20\x7b\xd8\x9e\xd4\x98\x84\x80\x2c\x5b\xf8\x3c\xa9\xea\x32\x89\xb7\x7e\x3d\xeb\x15\x2e\xd3\xca\x3b\x2c\xb0\x87\xe9\xb0\x7e\x2c\x97\xfc\x88\x32\x97\x35\x47\xc3\x80\x79\x16\xdf\xbf\xf1\xd9\xa8\x73\xb4\x30\x82\x1b\x13\xef\x31\xdf\x81\x09\x3c\x80\x16\x2d\x16\xac\xf1\x60\x03\x0a\xfc\xff\x0a\x20\xeb\xfe\x0c\x36\x8c\xa0\xbd\xd9\x2d\x73\xd6\xda\x43\x61\x39\x0f\x2d\xca\xdf\xc0\x03\x78\xed\x20\xcc\x61\x6e\x0b\x4e\xc2\xb5\x57\xf3\x5b\x93\x2d\x02\x1e\xe4\x4d\x49\xa2\x1f\x99\x30\xee\xc1\x8a\xea\x40\x75\xa0\x3a\xb0\xaa\x03\x5f\xd9\x00\x8b\x40\xf9\x40\x04\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82" + +func beam_disconnected_32PngBytes() ([]byte, error) { + return bindataRead( + _beam_disconnected_32Png, + "beam_disconnected_32.png", + ) +} + +func beam_disconnected_32Png() (*asset, error) { + bytes, err := beam_disconnected_32PngBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_disconnected_32.png", size: 491, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_disconnectedalert_32Ico = "\x00\x00\x01\x00\x01\x00\x22\x22\x00\x00\x01\x00\x20\x00\x48\x13\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x22\x00\x00\x00\x44\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x10\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa0\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\xa0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\x40\x00\x00\x00\xd0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xe0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xa0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x9f\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xf0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\xf0\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\xaf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xaf\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf0\x0f\xc0\x00\x00\x00\xff\xff\xc0\x03\xc0\x00\x00\x00\xff\xff\x80\x01\xc0\x00\x00\x00\xff\xff\x03\xc0\xc0\x00\x00\x00\xff\xfe\x03\xc0\x40\x00\x00\x00\xff\xfe\x03\xc0\x40\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\xff\xf8\x00\x00\x00\x00\x00\x00\xff\xc0\x03\xc0\x00\x00\x00\x00\xff\x00\x03\xc0\x00\x00\x00\x00\xfe\x00\x03\xc0\x00\x00\x00\x00\xfc\x0c\x03\xc0\x00\x00\x00\x00\xf8\x3c\x03\xc0\x00\x00\x00\x00\xf0\x7e\x03\xc0\x40\x00\x00\x00\xe0\xfe\x03\xc0\x40\x00\x00\x00\xe1\xff\x03\xc0\xc0\x00\x00\x00\xc3\xff\x80\x00\xc0\x00\x00\x00\xc3\xff\xc0\x00\xc0\x00\x00\x00\x87\xff\xf0\x08\xc0\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x87\xff\xff\xf8\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\x00\x40\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xc0\x00\x00\x00" + +func beam_disconnectedalert_32IcoBytes() ([]byte, error) { + return bindataRead( + _beam_disconnectedalert_32Ico, + "beam_disconnectedalert_32.ico", + ) +} + +func beam_disconnectedalert_32Ico() (*asset, error) { + bytes, err := beam_disconnectedalert_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_disconnectedalert_32.ico", size: 4958, mode: os.FileMode(420), modTime: time.Unix(1603243641, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _beam_disconnectedalert_32Png = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x22\x00\x00\x00\x22\x08\x06\x00\x00\x00\x3a\x47\x0b\xc2\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\x38\x65\x58\x49\x66\x4d\x4d\x00\x2a\x00\x00\x00\x08\x00\x01\x87\x69\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x00\x22\x00\x00\x00\x00\x21\xb2\x83\x6e\x00\x00\x01\xe6\x49\x44\x41\x54\x58\x09\xed\x55\xdb\x51\xc3\x40\x0c\x04\x1a\xc0\x25\xa4\x04\x4a\x30\x15\x90\x0e\xe2\x0e\xa0\x03\xe8\x80\x50\x41\xae\x03\xe8\x20\xea\x80\x50\x81\xdd\x41\x42\x05\x61\x65\x67\x67\x74\x9a\x3b\x63\x9c\x07\x3f\xd6\x8c\x4e\x8f\x5b\xad\x84\x6e\x1c\xae\xae\x26\x99\x36\x30\x6d\x60\xda\xc0\x71\x1b\xb8\x3e\x94\x97\xb0\x8f\xd0\xe2\x10\x5f\xca\xec\xd0\xe8\x0d\x2a\x6c\xb8\x85\xb3\xff\x27\xad\x75\x08\x6e\x44\x87\xa0\x7c\xc3\xd9\x30\x38\x93\xbd\x03\xef\xad\xe1\xe6\x1c\xed\x6a\xb8\x11\x05\x9d\x5b\x4a\x34\x60\x3f\xd1\x66\x37\x7a\x40\xec\x06\x8a\x2e\x75\xb1\xb3\xed\xcd\x41\xc4\xb4\xbd\xd4\x46\xd8\xd2\xf6\x6e\xbf\x16\xae\xaa\x26\x62\xa4\x5d\xa0\x6e\x05\x55\x9e\xfd\x41\xd7\xb0\xef\xd0\x07\xa8\x0a\xef\x76\x5d\x18\x9f\x01\x21\x0b\xcb\xf8\x6a\x50\x34\x07\x8a\x0d\xc8\x93\xb2\x16\x13\x52\xcc\x33\x24\x59\xf8\x99\x02\xf4\xe4\x5e\x4d\x2d\x39\x86\xd8\x59\x8e\x33\x18\xc2\x97\x1c\xc8\xe5\x57\xa6\xc6\x36\x77\xb0\xe8\xcb\x24\x6e\xe9\x41\x8c\x0b\x38\xfa\x6e\x04\x56\xbc\xc8\x58\x7d\x0e\x62\xbd\xf5\x25\x92\xc1\x2a\x47\x52\x3c\x79\x95\x44\x75\xc9\x1a\xc6\x0f\xc0\xd8\x97\x49\x06\xab\x1c\x59\xa9\x70\x43\x42\xb5\xcf\x09\xa4\xc7\x58\xbc\xfa\x5e\x04\x09\x8f\x61\x9c\xdd\x8a\x92\x54\xae\xb0\x46\xbc\x80\x52\x02\x1c\x12\xa5\x2c\x71\xb4\xd2\x83\x0f\x04\xe5\xac\x4e\xba\x83\xda\x46\x5b\xc4\x2b\x68\xed\xf2\x16\xa3\xbe\x17\x41\xc2\x63\x18\x0f\xfa\x4a\x0b\x10\x84\x1e\x12\x92\x79\x8b\x92\x48\x04\x91\xc7\xd8\x38\x02\xf7\x05\x33\x5c\x06\xa8\xdf\x90\x25\xb3\x3e\xa0\x91\x08\x22\x7b\xef\xfd\x08\x3c\x34\x28\x01\x6c\xa0\x9e\x6c\x6c\xbc\xe1\x3f\x3d\x70\xfe\x49\x04\x68\xd5\x53\xc9\xe8\x41\x74\x00\xf9\x65\x8a\x7b\xdc\x5b\xfd\xea\xc1\x7f\xf4\xdc\x0d\xba\x6a\x80\xca\x3d\x87\x27\x90\x0c\xb6\x51\xe0\xd8\xa7\xd1\x5a\x95\xa7\xce\x1c\x75\x9e\x82\xa3\x1d\x20\xe0\x4c\x6d\xc5\x4f\x27\x09\xdc\xd2\x83\x8e\x8d\x95\xd0\x0f\xb3\x46\xce\xaa\xfe\x10\x5a\xcc\xc9\x87\xe0\x1f\x31\x87\xd3\xb8\x66\xb6\x31\x7d\xc5\x28\xf6\xec\x52\xa1\x43\x80\x6e\xa0\x6c\xae\xbe\xe6\xb2\x03\xfc\x00\xac\x27\x39\xe2\xaf\xb9\x1e\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82" + +func beam_disconnectedalert_32PngBytes() ([]byte, error) { + return bindataRead( + _beam_disconnectedalert_32Png, + "beam_disconnectedalert_32.png", + ) +} + +func beam_disconnectedalert_32Png() (*asset, error) { + bytes, err := beam_disconnectedalert_32PngBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "beam_disconnectedalert_32.png", size: 624, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _lantern_connected_32Ico = "\x00\x00\x01\x00\x01\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x11\xd2\xbc\x2c\x39\xd2\xbc\x2c\x65\xd2\xbc\x2c\x86\xd2\xbc\x2c\x97\xd2\xbc\x2c\x99\xd2\xbc\x2c\x8c\xd2\xbc\x2c\x6e\xd2\xbc\x2c\x44\xd2\xbc\x2c\x19\xd2\xbc\x2c\x02\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x03\xd2\xbc\x2c\x2c\xd2\xbc\x2c\x7d\xd2\xbc\x2c\xc4\xd2\xbc\x2c\xec\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xf1\xd2\xbc\x2c\xd1\xd2\xbc\x2c\x92\xd2\xbc\x2c\x3e\xd2\xbc\x2c\x08\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x1f\xd2\xbc\x2c\x89\xd2\xbc\x2c\xe4\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2c\xff\xd5\xbe\x2c\xff\xd3\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf0\xd2\xbc\x2c\xa5\xd2\xbc\x2c\x34\xd2\xbc\x2c\x01\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x02\xd2\xbc\x2c\x48\xd2\xbc\x2c\xce\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xcf\xb8\x2b\xff\xae\x9c\x29\xff\xa2\x92\x28\xff\xc6\xb2\x2b\xff\xd4\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xe3\xd2\xbc\x2c\x6b\xd2\xbc\x2c\x08\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x03\xd2\xbc\x2c\x63\xd2\xbc\x2c\xe9\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2a\xff\xbe\xc3\x47\xff\x67\x8e\x5c\xff\x2c\x2a\x1f\xff\x24\x22\x1c\xff\x4a\x65\x47\xff\x9e\xc4\x67\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf7\xd2\xbc\x2c\x8b\xd2\xbc\x2c\x0d\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x61\xd2\xbc\x2c\xef\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbe\x38\xff\x60\xd7\xb8\xff\x22\x83\x90\xff\x1d\x1b\x1c\xff\x1d\x1b\x1b\xff\x1f\x50\x58\xff\x3a\xd6\xdb\xff\xa7\xc5\x60\xff\xd4\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xfb\xd2\xbc\x2c\x8d\xd2\xbc\x2c\x09\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x43\xd2\xbc\x2c\xe6\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\x91\xca\x7a\xff\x2e\xe1\xf4\xff\x25\x7e\x89\xff\x1e\x1b\x1b\xff\x1e\x1b\x1b\xff\x21\x4c\x50\xff\x29\xd7\xed\xff\x59\xd6\xbd\xff\xc9\xbe\x36\xff\xd3\xbc\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf8\xd2\xbc\x2c\x6f\xd2\xbc\x2c\x01\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x19\xd2\xbc\x2c\xc5\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbe\x38\xff\x52\xd7\xc5\xff\x2a\xe2\xf8\xff\x25\x79\x83\xff\x1e\x1b\x1b\xff\x1e\x1c\x1b\xff\x21\x46\x4a\xff\x2b\xd4\xe8\xff\x31\xdf\xee\xff\xa0\xc7\x68\xff\xd4\xbb\x29\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xe6\xd2\xbc\x2c\x3a\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x7b\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbb\x29\xff\xa4\xc6\x63\xff\x32\xde\xec\xff\x2c\xe1\xf5\xff\x24\x74\x7d\xff\x1e\x1b\x1b\xff\x1e\x1c\x1c\xff\x21\x41\x45\xff\x2b\xd1\xe4\xff\x29\xe0\xf7\xff\x6b\xd2\xa8\xff\xd1\xbc\x2d\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xad\xd2\xbc\x2c\x0a\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x21\xd2\xbc\x2c\xd9\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x76\xcf\x9a\xff\x2a\xe0\xf6\xff\x2c\xe0\xf4\xff\x24\x6f\x78\xff\x1e\x1b\x1a\xff\x1e\x1c\x1c\xff\x20\x3d\x40\xff\x2b\xce\xe0\xff\x2b\xe0\xf6\xff\x43\xda\xd7\xff\xbf\xc0\x43\xff\xd3\xbc\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf3\xd2\xbc\x2c\x48\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x69\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbe\x38\xff\x50\xd7\xc8\xff\x2a\xdf\xf6\xff\x2c\xe0\xf4\xff\x24\x6a\x72\xff\x1e\x1b\x1a\xff\x1e\x1c\x1c\xff\x20\x38\x3b\xff\x2b\xca\xdc\xff\x2c\xe0\xf5\xff\x30\xde\xef\xff\x9f\xc7\x69\xff\xd5\xbb\x29\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x9d\xd2\xbc\x2c\x03\xd2\xbc\x2c\x08\xd2\xbc\x2c\xb0\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\xb2\xc3\x53\xff\x38\xdd\xe5\xff\x2b\xdf\xf4\xff\x2c\xdf\xf3\xff\x23\x66\x6d\xff\x1e\x1b\x1a\xff\x1e\x1d\x1c\xff\x20\x34\x37\xff\x2a\xc7\xd8\xff\x2c\xe1\xf5\xff\x2a\xdf\xf6\xff\x7a\xcf\x96\xff\xd3\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xda\xd2\xbc\x2c\x23\xd2\xbc\x2c\x24\xd2\xbc\x2c\xdd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x93\xc9\x77\xff\x2d\xdf\xf2\xff\x2c\xdf\xf3\xff\x2c\xde\xf1\xff\x23\x61\x68\xff\x1e\x1b\x1a\xff\x1e\x1d\x1d\xff\x1f\x31\x33\xff\x2a\xc2\xd3\xff\x2c\xe1\xf5\xff\x29\xe0\xf6\xff\x59\xd6\xbd\xff\xcd\xbd\x33\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf6\xd2\xbc\x2c\x54\xd2\xbc\x2c\x47\xd2\xbc\x2c\xf3\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x74\xd0\x9d\xff\x29\xe0\xf6\xff\x2c\xdf\xf3\xff\x2c\xdd\xf0\xff\x23\x5c\x63\xff\x1e\x1b\x1a\xff\x1e\x1d\x1d\xff\x1f\x2d\x2f\xff\x2a\xbe\xce\xff\x2c\xe1\xf5\xff\x2b\xdf\xf5\xff\x41\xdb\xda\xff\xbe\xc0\x44\xff\xd3\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x82\xd2\xbc\x2c\x64\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xcd\xbd\x32\xff\x59\xd6\xbe\xff\x29\xe0\xf6\xff\x2c\xdf\xf3\xff\x2c\xdb\xef\xff\x22\x58\x5e\xff\x1e\x1b\x1b\xff\x1e\x1d\x1d\xff\x1f\x2a\x2b\xff\x29\xb9\xc9\xff\x2c\xe1\xf6\xff\x2c\xdf\xf4\xff\x33\xde\xeb\xff\xa9\xc5\x5d\xff\xd4\xbb\x29\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xa2\xd2\xbc\x2c\x73\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc1\xc0\x41\xff\x44\xda\xd6\xff\x2a\xdf\xf5\xff\x2c\xdf\xf3\xff\x2c\xda\xed\xff\x22\x53\x59\xff\x1e\x1b\x1b\xff\x1e\x1d\x1d\xff\x1f\x28\x29\xff\x29\xb4\xc3\xff\x2c\xe2\xf6\xff\x2c\xdf\xf3\xff\x2c\xdf\xf3\xff\x90\xca\x7b\xff\xd5\xbb\x29\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xb0\xd2\xbc\x2c\x72\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\xb0\xc3\x55\xff\x36\xdd\xe7\xff\x2b\xdf\xf4\xff\x2c\xdf\xf3\xff\x2c\xd8\xeb\xff\x22\x4f\x54\xff\x1e\x1b\x1b\xff\x1e\x1e\x1e\xff\x1f\x25\x26\xff\x28\xae\xbd\xff\x2c\xe2\xf6\xff\x2c\xdf\xf3\xff\x29\xe0\xf6\xff\x77\xcf\x99\xff\xd3\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xb0\xd2\xbc\x2c\x63\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x9d\xc7\x6c\xff\x2e\xde\xf0\xff\x2c\xdf\xf3\xff\x2c\xe0\xf4\xff\x2b\xd6\xe9\xff\x21\x4b\x50\xff\x1e\x1b\x1b\xff\x1e\x1e\x1e\xff\x1e\x23\x23\xff\x28\xa9\xb7\xff\x2c\xe2\xf6\xff\x2c\xdf\xf3\xff\x29\xe0\xf6\xff\x61\xd4\xb3\xff\xd0\xbd\x2f\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xa1\xd2\xbc\x2c\x45\xd2\xbc\x2c\xf2\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x88\xcb\x84\xff\x2b\xdf\xf5\xff\x2c\xdf\xf3\xff\x2c\xe0\xf4\xff\x2b\xd5\xe7\xff\x21\x47\x4b\xff\x1e\x1b\x1b\xff\x1e\x1e\x1e\xff\x1e\x21\x21\xff\x28\xa3\xb1\xff\x2c\xe2\xf7\xff\x2c\xdf\xf3\xff\x2a\xdf\xf6\xff\x4f\xd8\xc9\xff\xc8\xbe\x37\xff\xd3\xbc\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x80\xd2\xbc\x2c\x22\xd2\xbc\x2c\xdb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x75\xd2\x9e\xff\x29\xe1\xf8\xff\x2c\xe0\xf4\xff\x2c\xe0\xf4\xff\x2b\xd3\xe5\xff\x21\x43\x47\xff\x1e\x1c\x1b\xff\x1e\x1e\x1e\xff\x1e\x20\x20\xff\x27\x9d\xaa\xff\x2c\xe2\xf7\xff\x2c\xdf\xf3\xff\x2b\xe1\xf6\xff\x41\xdd\xdc\xff\xbf\xc1\x44\xff\xd3\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf5\xd2\xbc\x2c\x51\xd2\xbc\x2c\x06\xd2\xbc\x2c\xad\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd0\xbb\x2c\xff\x61\xb2\x8c\xff\x27\xc4\xd8\xff\x2b\xd5\xe8\xff\x2c\xdf\xf3\xff\x2b\xd2\xe5\xff\x21\x40\x44\xff\x1e\x1c\x1c\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x27\x98\xa5\xff\x2c\xe3\xf7\xff\x2c\xd9\xec\xff\x2a\xcb\xde\xff\x35\xb7\xbc\xff\xb1\xb6\x44\xff\xd4\xbc\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xd7\xd2\xbc\x2c\x20\xd2\xbc\x2c\x00\xd2\xbc\x2c\x64\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2c\xff\xca\xb5\x2b\xff\x48\x49\x28\xff\x1d\x31\x35\xff\x21\x49\x4d\xff\x23\x66\x6d\xff\x25\x7a\x83\xff\x1f\x31\x33\xff\x1e\x1d\x1d\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x22\x5b\x61\xff\x24\x6f\x77\xff\x22\x51\x56\xff\x20\x3a\x3d\xff\x25\x2f\x2b\xff\xa3\x94\x2a\xff\xd5\xbe\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x99\xd2\xbc\x2c\x02\xd2\xbc\x2c\x00\xd2\xbc\x2c\x1e\xd2\xbc\x2c\xd5\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xc1\xad\x2b\xff\x38\x34\x20\xff\x1b\x1a\x1c\xff\x1e\x1b\x1b\xff\x1e\x1b\x1a\xff\x1e\x1c\x1c\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1d\x1c\xff\x1e\x1b\x1b\xff\x1e\x1b\x1b\xff\x1c\x1b\x1c\xff\x1f\x1e\x1d\xff\x9b\x8c\x28\xff\xd5\xbf\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf1\xd2\xbc\x2c\x43\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x74\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xc6\xb1\x2b\xff\x68\x5f\x24\xff\x35\x33\x20\xff\x20\x20\x1e\xff\x1d\x1d\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1d\x1d\x1e\xff\x1d\x1d\x1e\xff\x31\x2f\x1f\xff\x63\x5a\x23\xff\xb8\xa6\x2a\xff\xd3\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xa7\xd2\xbc\x2c\x08\xd2\xbc\x2c\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x16\xd2\xbc\x2c\xbf\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd0\xba\x2c\xff\xbc\xa9\x2a\xff\x94\x86\x27\xff\x45\x40\x21\xff\x1d\x1d\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1d\x1d\x1e\xff\x2d\x2b\x1f\xff\x7d\x71\x25\xff\xb5\xa3\x2a\xff\xd0\xba\x2c\xff\xd3\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xe1\xd2\xbc\x2c\x34\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x3c\xd2\xbc\x2c\xe2\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xd6\xbf\x2c\xff\x68\x5f\x24\xff\x19\x1a\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1e\x1e\x1e\xff\x1b\x1b\x1e\xff\x41\x3c\x21\xff\xc9\xb4\x2b\xff\xd4\xbe\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf5\xd2\xbc\x2c\x67\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x58\xd2\xbc\x2c\xeb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\x8e\x80\x27\xff\x36\x33\x20\xff\x1d\x1d\x1e\xff\x1d\x1d\x1e\xff\x1d\x1e\x1e\xff\x1b\x1c\x1e\xff\x25\x24\x1f\xff\x67\x5e\x24\xff\xcb\xb6\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf9\xd2\xbc\x2c\x83\xd2\xbc\x2c\x07\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x02\xd2\xbc\x2c\x59\xd2\xbc\x2c\xe4\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xb8\xa5\x2a\xff\x73\x69\x25\xff\x32\x2f\x20\xff\x25\x25\x1f\xff\x55\x4f\x22\xff\x9f\x8f\x28\xff\xcc\xb7\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf4\xd2\xbc\x2c\x81\xd2\xbc\x2c\x0a\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x01\xd2\xbc\x2c\x3f\xd2\xbc\x2c\xc5\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbd\x2c\xff\xd2\xbc\x2c\xff\xb2\xa0\x2a\xff\xa3\x92\x28\xff\xcb\xb6\x2b\xff\xd5\xbe\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xdd\xd2\xbc\x2c\x60\xd2\xbc\x2c\x06\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x18\xd2\xbc\x2c\x7d\xd2\xbc\x2c\xdd\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2c\xff\xd5\xbe\x2c\xff\xd3\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xeb\xd2\xbc\x2c\x99\xd2\xbc\x2c\x2b\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x01\xd2\xbc\x2c\x24\xd2\xbc\x2c\x71\xd2\xbc\x2c\xba\xd2\xbc\x2c\xe5\xd2\xbc\x2c\xf8\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xfa\xd2\xbc\x2c\xeb\xd2\xbc\x2c\xc8\xd2\xbc\x2c\x85\xd2\xbc\x2c\x34\xd2\xbc\x2c\x05\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x0c\xd2\xbc\x2c\x2e\xd2\xbc\x2c\x57\xd2\xbc\x2c\x77\xd2\xbc\x2c\x89\xd2\xbc\x2c\x8c\xd2\xbc\x2c\x7d\xd2\xbc\x2c\x60\xd2\xbc\x2c\x38\xd2\xbc\x2c\x12\xd2\xbc\x2c\x01\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0\x03\xff\xff\x00\x00\xff\xfe\x00\x00\x3f\xf8\x00\x00\x1f\xf0\x00\x00\x0f\xf0\x00\x00\x07\xe0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x01\xc0\x00\x00\x01\xc0\x00\x00\x03\xe0\x00\x00\x07\xf0\x00\x00\x07\xf0\x00\x00\x0f\xf8\x00\x00\x1f\xfe\x00\x00\x7f\xff\x00\x00\xff\xff\xe0\x03\xff" + +func lantern_connected_32IcoBytes() ([]byte, error) { + return bindataRead( + _lantern_connected_32Ico, + "lantern_connected_32.ico", + ) +} + +func lantern_connected_32Ico() (*asset, error) { + bytes, err := lantern_connected_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "lantern_connected_32.ico", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _lantern_connectedalert_32Ico = "\x00\x00\x01\x00\x01\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x11\xd2\xbc\x2c\x39\xd2\xbc\x2c\x65\xd2\xbc\x2c\x86\xd2\xbc\x2c\x97\xd2\xbc\x2c\x99\xd6\xc0\x28\x8c\xd2\xbc\x2c\x6e\x72\x66\x8d\x47\x00\x00\xff\x51\x00\x00\xff\x77\x00\x00\xff\x81\x00\x00\xff\x74\x00\x00\xff\x4d\x00\x00\xff\x1c\x00\x00\xff\x01\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x03\xd2\xbc\x2c\x2c\xd2\xbc\x2c\x7d\xd2\xbc\x2c\xc4\xd2\xbc\x2c\xec\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2a\xff\xb2\xa0\x4c\xff\x5f\x55\xa0\xfd\x17\x15\xe8\xf2\x00\x00\xff\xf6\x00\x00\xff\xfe\x00\x00\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xf4\x00\x00\xff\xd3\x00\x00\xff\x80\x00\x00\xff\x1f\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x1f\xd2\xbc\x2c\x89\xd2\xbc\x2c\xe4\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xd2\xbc\x2c\xff\x8d\x7e\x72\xff\x1f\x1c\xdf\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xcf\x00\x00\xff\x47\x00\x00\xff\x01\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x02\xd2\xbc\x2c\x48\xd2\xbc\x2c\xce\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xd1\xbd\x2e\xff\x85\x79\x7a\xff\x0f\x0e\xef\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x02\x02\xff\xff\x0a\x0a\xff\xff\x0b\x0b\xff\xff\x09\x09\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xe5\x00\x00\xff\x4c\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x03\xd2\xbc\x2c\x63\xd2\xbc\x2c\xe9\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2a\xff\xbe\xc3\x45\xff\x64\xa2\xa7\xff\x10\x17\xf1\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x22\x22\xff\xff\xb3\xb3\xff\xff\xc4\xc4\xff\xff\xaa\xaa\xff\xff\x17\x17\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xd6\x00\x00\xff\x29\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x61\xd2\xbc\x2c\xef\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbf\x38\xff\x5e\xce\xb5\xff\x0d\x4c\xfd\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xec\xec\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\x95\x00\x00\xff\x04\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x43\xd2\xbc\x2c\xe6\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\x91\xcd\x7a\xff\x24\xad\xf4\xff\x03\x0f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x25\x25\xff\xff\xc2\xc2\xff\xff\xd5\xd5\xff\xff\xb9\xb9\xff\xff\x19\x19\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xe2\x00\x00\xff\x30\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x19\xd2\xbc\x2c\xc5\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbe\x38\xff\x53\xda\xc5\xff\x15\x77\xfb\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x03\x03\xff\xff\x0e\x0e\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xfc\x00\x00\xff\x70\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x7b\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbb\x29\xff\xa4\xc6\x63\xff\x32\xdd\xec\xff\x10\x52\xfb\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x0f\x0f\xff\xff\x4f\x4f\xff\xff\x56\x56\xff\xff\x4b\x4b\xff\xff\x0a\x0a\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xa0\xd2\xbc\x2c\x00\xd2\xbc\x2c\x21\xd2\xbc\x2c\xd9\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x76\xd0\x9a\xff\x29\xdb\xf6\xff\x0d\x42\xfb\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xe9\xe9\xff\xff\xff\xff\xff\xff\xde\xde\xff\xff\x1e\x1e\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xb6\xd2\xbc\x2c\x00\xd2\xbc\x2c\x69\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc8\xbe\x38\xff\x50\xd8\xc8\xff\x29\xdc\xf6\xff\x0e\x47\xfb\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xae\xd2\xbc\x2c\x08\xd2\xbc\x2c\xb0\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\xb2\xc3\x53\xff\x38\xdd\xe5\xff\x2c\xe0\xf4\xff\x13\x61\xfa\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\x8b\xd2\xbc\x2c\x24\xd2\xbc\x2c\xdd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x93\xc9\x77\xff\x2d\xdf\xf2\xff\x2d\xe2\xf3\xff\x1d\x92\xf7\xff\x01\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x06\x06\xf9\xfb\x2d\x28\xd2\x65\xd2\xbc\x2c\x47\xd2\xbc\x2c\xf3\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x74\xd0\x9d\xff\x29\xe0\xf6\xff\x2c\xe1\xf3\xff\x27\xc7\xf4\xff\x07\x24\xfb\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x32\x2d\xcd\xff\xb2\xa0\x4c\x81\xd2\xbc\x2c\x64\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xcd\xbd\x32\xff\x59\xd6\xbe\xff\x29\xe0\xf6\xff\x2c\xdf\xf3\xff\x2b\xdb\xed\xff\x0d\x42\xb6\xff\x00\x00\xf7\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xec\xec\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x07\x06\xf8\xff\x88\x7a\x77\xff\xd6\xc0\x28\xa2\xd2\xbc\x2c\x73\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\xc1\xc0\x41\xff\x44\xda\xd6\xff\x2a\xdf\xf5\xff\x2c\xdf\xf3\xff\x2b\xd9\xec\xff\x0c\x3e\x52\xff\x00\x00\xa3\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x1f\x1f\xff\xff\xa2\xa2\xff\xff\xb2\xb2\xff\xff\x9a\x9a\xff\xff\x15\x15\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xfe\xff\x56\x4d\xa8\xff\xcc\xb6\x32\xff\xd3\xbd\x2b\xb0\xd2\xbc\x2c\x72\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbc\x2a\xff\xb0\xc3\x55\xff\x36\xdd\xe7\xff\x2b\xdf\xf4\xff\x2c\xdf\xf4\xff\x2a\xd7\xea\xff\x0b\x39\x3d\xff\x00\x00\x18\xff\x00\x00\xac\xff\x00\x00\xfd\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xff\xff\x04\x04\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x04\x03\xfb\xff\x50\x48\xae\xff\xc3\xaf\x3b\xff\xd3\xbd\x2b\xff\xd2\xbc\x2c\xb0\xd2\xbc\x2c\x63\xd2\xbc\x2c\xfb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x9d\xc7\x6c\xff\x2e\xde\xf0\xff\x2c\xdf\xf3\xff\x2c\xe0\xf4\xff\x2a\xd5\xe8\xff\x0a\x34\x39\xff\x00\x00\x00\xff\x00\x00\x13\xff\x00\x01\x7f\xff\x02\x0a\xee\xff\x00\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xfe\xff\x1c\x19\xe2\xff\x74\x68\x8a\xff\xc8\xb3\x36\xff\xd4\xbd\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xa1\xd2\xbc\x2c\x45\xd2\xbc\x2c\xf2\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd5\xbb\x29\xff\x88\xcb\x84\xff\x2b\xdf\xf5\xff\x2c\xdf\xf3\xff\x2c\xe0\xf4\xff\x2a\xd3\xe6\xff\x09\x2f\x34\xff\x00\x00\x00\xff\x00\x00\x00\xff\x01\x04\x06\xff\x18\x78\xad\xff\x18\x7c\xfc\xff\x0d\x44\xfb\xff\x08\x2a\xfd\xff\x0b\x22\xf8\xff\x26\x25\xd9\xff\x43\x3c\xbb\xff\x77\x6a\x88\xff\xb4\xa2\x4a\xff\xd3\xbd\x2b\xff\xd3\xbd\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x80\xd2\xbc\x2c\x22\xd2\xbc\x2c\xdb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbc\x2b\xff\x75\xd2\x9e\xff\x2a\xe2\xf8\xff\x2c\xe0\xf4\xff\x2c\xe0\xf4\xff\x29\xd1\xe3\xff\x08\x2b\x2f\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x02\x02\xff\x1d\x95\xa0\xff\x2d\xe6\xf7\xff\x2b\xdb\xf4\xff\x28\xd1\xf7\xff\x3b\xca\xe0\xff\xb2\xb4\x51\xff\xd0\xb9\x2e\xff\xd5\xbf\x29\xff\xd4\xbe\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf5\xd2\xbc\x2c\x51\xd2\xbc\x2c\x06\xd2\xbc\x2c\xad\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd0\xbb\x2c\xff\x5c\xad\x87\xff\x23\xbf\xd3\xff\x2a\xd3\xe6\xff\x2c\xdf\xf3\xff\x29\xd0\xe3\xff\x08\x28\x2b\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x1c\x8e\x9a\xff\x2d\xe4\xf8\xff\x2b\xd8\xeb\xff\x27\xc9\xdb\xff\x2f\xb2\xb6\xff\xb0\xb5\x42\xff\xd4\xbd\x2a\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xd7\xd2\xbc\x2c\x20\xd2\xbc\x2c\x00\xd2\xbc\x2c\x64\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xc8\xb3\x2a\xff\x32\x33\x12\xff\x02\x16\x1a\xff\x0a\x32\x36\xff\x10\x53\x5a\xff\x15\x6a\x73\xff\x04\x16\x18\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x0e\x47\x4d\xff\x12\x5e\x66\xff\x0c\x3b\x40\xff\x06\x20\x23\xff\x0a\x14\x10\xff\x9c\x8d\x22\xff\xd5\xbf\x2d\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\x99\xd2\xbc\x2c\x02\xd2\xbc\x2c\x00\xd2\xbc\x2c\x1e\xd2\xbc\x2c\xd5\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xbf\xab\x28\xff\x21\x1d\x07\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x04\x03\x01\xff\x93\x83\x1f\xff\xd5\xbf\x2d\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf1\xd2\xbc\x2c\x43\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x74\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd3\xbd\x2c\xff\xc4\xaf\x29\xff\x56\x4d\x12\xff\x1b\x18\x06\xff\x04\x03\x01\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x01\x01\x00\xff\x16\x14\x05\xff\x50\x48\x11\xff\xb4\xa1\x26\xff\xd4\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xa7\xd2\xbc\x2c\x08\xd2\xbc\x2c\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x16\xd2\xbc\x2c\xbf\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xcf\xba\x2b\xff\xb8\xa5\x27\xff\x8a\x7b\x1d\xff\x2e\x29\x0a\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x11\x10\x04\xff\x6f\x63\x17\xff\xb1\x9e\x25\xff\xd0\xba\x2c\xff\xd3\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xe1\xd2\xbc\x2c\x34\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x3c\xd2\xbc\x2c\xe2\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2c\xff\xd6\xc0\x2d\xff\x58\x4f\x13\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x2b\x26\x09\xff\xc8\xb3\x2a\xff\xd5\xbf\x2d\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf5\xd2\xbc\x2c\x67\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x58\xd2\xbc\x2c\xeb\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\x83\x75\x1b\xff\x1c\x19\x06\xff\x01\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x09\x08\x02\xff\x55\x4c\x12\xff\xca\xb5\x2a\xff\xd3\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf9\xd2\xbc\x2c\x83\xd2\xbc\x2c\x07\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x02\xd2\xbc\x2c\x59\xd2\xbc\x2c\xe4\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xb4\xa1\x26\xff\x63\x59\x15\xff\x17\x15\x05\xff\x09\x08\x02\xff\x41\x3a\x0e\xff\x96\x87\x20\xff\xcb\xb6\x2b\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xf4\xd2\xbc\x2c\x81\xd2\xbc\x2c\x0a\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x01\xd2\xbc\x2c\x3f\xd2\xbc\x2c\xc5\xd2\xbc\x2c\xfd\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2c\xff\xd2\xbc\x2c\xff\xac\x9a\x24\xff\x9b\x8a\x20\xff\xca\xb5\x2a\xff\xd5\xbf\x2d\xff\xd3\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xdd\xd2\xbc\x2c\x60\xd2\xbc\x2c\x06\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x18\xd2\xbc\x2c\x7d\xd2\xbc\x2c\xdd\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd4\xbe\x2c\xff\xd5\xbf\x2d\xff\xd3\xbd\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xeb\xd2\xbc\x2c\x99\xd2\xbc\x2c\x2b\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x01\xd2\xbc\x2c\x24\xd2\xbc\x2c\x71\xd2\xbc\x2c\xba\xd2\xbc\x2c\xe5\xd2\xbc\x2c\xf8\xd2\xbc\x2c\xfe\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xff\xd2\xbc\x2c\xfa\xd2\xbc\x2c\xeb\xd2\xbc\x2c\xc8\xd2\xbc\x2c\x85\xd2\xbc\x2c\x34\xd2\xbc\x2c\x05\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x00\xd2\xbc\x2c\x0c\xd2\xbc\x2c\x2e\xd2\xbc\x2c\x57\xd2\xbc\x2c\x77\xd2\xbc\x2c\x89\xd2\xbc\x2c\x8c\xd2\xbc\x2c\x7d\xd2\xbc\x2c\x60\xd2\xbc\x2c\x38\xd2\xbc\x2c\x12\xd2\xbc\x2c\x01\xd2\xbc\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0\x00\x1f\xff\x00\x00\x0f\xfe\x00\x00\x03\xf8\x00\x00\x03\xf0\x00\x00\x01\xf0\x00\x00\x00\xe0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x01\xc0\x00\x00\x01\xc0\x00\x00\x03\xe0\x00\x00\x07\xf0\x00\x00\x07\xf0\x00\x00\x0f\xf8\x00\x00\x1f\xfe\x00\x00\x7f\xff\x00\x00\xff\xff\xe0\x03\xff" + +func lantern_connectedalert_32IcoBytes() ([]byte, error) { + return bindataRead( + _lantern_connectedalert_32Ico, + "lantern_connectedalert_32.ico", + ) +} + +func lantern_connectedalert_32Ico() (*asset, error) { + bytes, err := lantern_connectedalert_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "lantern_connectedalert_32.ico", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _lantern_disconnected_32Ico = "\x00\x00\x01\x00\x01\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x11\xa8\xa8\xa8\x39\xa8\xa8\xa8\x65\xa8\xa8\xa8\x86\xa8\xa8\xa8\x97\xa8\xa8\xa8\x99\xa8\xa8\xa8\x8c\xa8\xa8\xa8\x6e\xa8\xa8\xa8\x44\xa8\xa8\xa8\x19\xa8\xa8\xa8\x02\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x03\xa8\xa8\xa8\x2c\xa8\xa8\xa8\x7d\xa8\xa8\xa8\xc4\xa8\xa8\xa8\xec\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xf1\xa8\xa8\xa8\xd1\xa8\xa8\xa8\x92\xa8\xa8\xa8\x3e\xa8\xa8\xa8\x08\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x1f\xa8\xa8\xa8\x89\xa8\xa8\xa8\xe4\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xaa\xaa\xaa\xff\xaa\xaa\xaa\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf0\xa8\xa8\xa8\xa5\xa8\xa8\xa8\x34\xa8\xa8\xa8\x01\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x02\xa8\xa8\xa8\x48\xa8\xa8\xa8\xce\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa4\xa4\xa4\xff\x86\x86\x86\xff\x7c\x7c\x7c\xff\x9e\x9e\x9e\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xe3\xa8\xa8\xa8\x6b\xa8\xa8\xa8\x08\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x03\xa8\xa8\xa8\x63\xa8\xa8\xa8\xe9\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb6\xb6\xb6\xff\x83\x83\x83\xff\x0c\x0c\x0c\xff\x04\x04\x04\xff\x55\x55\x55\xff\xc0\xc0\xc0\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf7\xa8\xa8\xa8\x8b\xa8\xa8\xa8\x0d\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x61\xa8\xa8\xa8\xef\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xad\xad\xad\xff\xe8\xe8\xe8\xff\x85\x85\x85\xff\x00\x00\x00\xff\x00\x00\x00\xff\x45\x45\x45\xff\xf0\xf0\xf0\xff\xbf\xbf\xbf\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xfb\xa8\xa8\xa8\x8d\xa8\xa8\xa8\x09\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x43\xa8\xa8\xa8\xe6\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xca\xca\xca\xff\xff\xff\xff\xff\x7e\x7e\x7e\xff\x00\x00\x00\xff\x00\x00\x00\xff\x3d\x3d\x3d\xff\xf5\xf5\xf5\xff\xe8\xe8\xe8\xff\xac\xac\xac\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf8\xa8\xa8\xa8\x6f\xa8\xa8\xa8\x01\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x19\xa8\xa8\xa8\xc5\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xad\xad\xad\xff\xeb\xeb\xeb\xff\xff\xff\xff\xff\x77\x77\x77\xff\x00\x00\x00\xff\x00\x00\x00\xff\x36\x36\x36\xff\xf1\xf1\xf1\xff\xfd\xfd\xfd\xff\xc2\xc2\xc2\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xe6\xa8\xa8\xa8\x3a\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x7b\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc0\xc0\xc0\xff\xfc\xfc\xfc\xff\xff\xff\xff\xff\x71\x71\x71\xff\x00\x00\x00\xff\x00\x00\x00\xff\x2f\x2f\x2f\xff\xed\xed\xed\xff\xff\xff\xff\xff\xde\xde\xde\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xad\xa8\xa8\xa8\x0a\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x21\xa8\xa8\xa8\xd9\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xd8\xd8\xd8\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6a\x6a\x6a\xff\x00\x00\x00\xff\x00\x00\x00\xff\x2a\x2a\x2a\xff\xe9\xe9\xe9\xff\xff\xff\xff\xff\xf3\xf3\xf3\xff\xb2\xb2\xb2\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf3\xa8\xa8\xa8\x48\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x69\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xad\xad\xad\xff\xec\xec\xec\xff\xff\xff\xff\xff\xff\xff\xff\xff\x64\x64\x64\xff\x00\x00\x00\xff\x00\x00\x00\xff\x24\x24\x24\xff\xe4\xe4\xe4\xff\xff\xff\xff\xff\xfd\xfd\xfd\xff\xc3\xc3\xc3\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x9d\xa8\xa8\xa8\x03\xa8\xa8\xa8\x08\xa8\xa8\xa8\xb0\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb9\xb9\xb9\xff\xf9\xf9\xf9\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x5e\x5e\x5e\xff\x00\x00\x00\xff\x00\x00\x00\xff\x1e\x1e\x1e\xff\xe0\xe0\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\xd6\xd6\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xda\xa8\xa8\xa8\x23\xa8\xa8\xa8\x24\xa8\xa8\xa8\xdd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xfd\xfd\xff\x58\x58\x58\xff\x00\x00\x00\xff\x00\x00\x00\xff\x19\x19\x19\xff\xda\xda\xda\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xe7\xe7\xff\xab\xab\xab\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf6\xa8\xa8\xa8\x54\xa8\xa8\xa8\x47\xa8\xa8\xa8\xf3\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xd9\xd9\xd9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xfb\xfb\xff\x51\x51\x51\xff\x00\x00\x00\xff\x00\x00\x00\xff\x15\x15\x15\xff\xd4\xd4\xd4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf4\xf4\xf4\xff\xb3\xb3\xb3\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x82\xa8\xa8\xa8\x64\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xab\xab\xab\xff\xe7\xe7\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\xff\x4b\x4b\x4b\xff\x00\x00\x00\xff\x00\x00\x00\xff\x10\x10\x10\xff\xce\xce\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xfb\xfb\xff\xbe\xbe\xbe\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xa2\xa8\xa8\xa8\x73\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb1\xb1\xb1\xff\xf2\xf2\xf2\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8\xff\x46\x46\x46\xff\x00\x00\x00\xff\x00\x00\x00\xff\x0d\x0d\x0d\xff\xc7\xc7\xc7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xca\xca\xca\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xb0\xa8\xa8\xa8\x72\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xba\xba\xba\xff\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\xff\x40\x40\x40\xff\x00\x00\x00\xff\x00\x00\x00\xff\x0a\x0a\x0a\xff\xc0\xc0\xc0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd7\xd7\xd7\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xb0\xa8\xa8\xa8\x63\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc4\xc4\xc4\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf3\xf3\xf3\xff\x3b\x3b\x3b\xff\x00\x00\x00\xff\x00\x00\x00\xff\x07\x07\x07\xff\xb9\xb9\xb9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe3\xe3\xe3\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xa1\xa8\xa8\xa8\x45\xa8\xa8\xa8\xf2\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xce\xce\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\xf1\xf1\xff\x35\x35\x35\xff\x00\x00\x00\xff\x00\x00\x00\xff\x04\x04\x04\xff\xb1\xb1\xb1\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\xff\xad\xad\xad\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x80\xa8\xa8\xa8\x22\xa8\xa8\xa8\xdb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xda\xda\xda\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xee\xee\xee\xff\x30\x30\x30\xff\x00\x00\x00\xff\x00\x00\x00\xff\x02\x02\x02\xff\xa9\xa9\xa9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf4\xf4\xf4\xff\xb3\xb3\xb3\xff\xa7\xa7\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf5\xa8\xa8\xa8\x51\xa8\xa8\xa8\x06\xa8\xa8\xa8\xad\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb7\xb7\xb7\xff\xdc\xdc\xdc\xff\xf2\xf2\xf2\xff\xff\xff\xff\xff\xeb\xeb\xeb\xff\x2c\x2c\x2c\xff\x00\x00\x00\xff\x00\x00\x00\xff\x01\x01\x01\xff\xa1\xa1\xa1\xff\xff\xff\xff\xff\xf6\xf6\xf6\xff\xe5\xe5\xe5\xff\xc7\xc7\xc7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xd7\xa8\xa8\xa8\x20\xa8\xa8\xa8\x00\xa8\xa8\xa8\x64\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa0\xa0\xa0\xff\x2f\x2f\x2f\xff\x1a\x1a\x1a\xff\x39\x39\x39\xff\x5f\x5f\x5f\xff\x79\x79\x79\xff\x18\x18\x18\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x52\x52\x52\xff\x6b\x6b\x6b\xff\x43\x43\x43\xff\x25\x25\x25\xff\x15\x15\x15\xff\x7f\x7f\x7f\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x99\xa8\xa8\xa8\x02\xa8\xa8\xa8\x00\xa8\xa8\xa8\x1e\xa8\xa8\xa8\xd5\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\x98\x98\x98\xff\x1a\x1a\x1a\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x03\x03\x03\xff\x76\x76\x76\xff\xab\xab\xab\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf1\xa8\xa8\xa8\x43\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x74\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\x9c\x9c\x9c\xff\x45\x45\x45\xff\x16\x16\x16\xff\x03\x03\x03\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x01\x01\x01\xff\x12\x12\x12\xff\x41\x41\x41\xff\x91\x91\x91\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xa7\xa8\xa8\xa8\x08\xa8\xa8\xa8\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x16\xa8\xa8\xa8\xbf\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa6\xa6\xa6\xff\x93\x93\x93\xff\x6e\x6e\x6e\xff\x24\x24\x24\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x0e\x0e\x0e\xff\x59\x59\x59\xff\x8d\x8d\x8d\xff\xa6\xa6\xa6\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xe1\xa8\xa8\xa8\x34\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x3c\xa8\xa8\xa8\xe2\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\xab\xab\xab\xff\x46\x46\x46\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x23\x23\x23\xff\xa0\xa0\xa0\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf5\xa8\xa8\xa8\x67\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x58\xa8\xa8\xa8\xeb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\x68\x68\x68\xff\x16\x16\x16\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x08\x08\x08\xff\x45\x45\x45\xff\xa2\xa2\xa2\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf9\xa8\xa8\xa8\x83\xa8\xa8\xa8\x07\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x02\xa8\xa8\xa8\x59\xa8\xa8\xa8\xe4\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\x90\x90\x90\xff\x4f\x4f\x4f\xff\x12\x12\x12\xff\x07\x07\x07\xff\x34\x34\x34\xff\x79\x79\x79\xff\xa3\xa3\xa3\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf4\xa8\xa8\xa8\x81\xa8\xa8\xa8\x0a\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x01\xa8\xa8\xa8\x3f\xa8\xa8\xa8\xc5\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\x8a\x8a\x8a\xff\x7c\x7c\x7c\xff\xa2\xa2\xa2\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xdd\xa8\xa8\xa8\x60\xa8\xa8\xa8\x06\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x18\xa8\xa8\xa8\x7d\xa8\xa8\xa8\xdd\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xaa\xaa\xaa\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xeb\xa8\xa8\xa8\x99\xa8\xa8\xa8\x2b\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x01\xa8\xa8\xa8\x24\xa8\xa8\xa8\x71\xa8\xa8\xa8\xba\xa8\xa8\xa8\xe5\xa8\xa8\xa8\xf8\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xfa\xa8\xa8\xa8\xeb\xa8\xa8\xa8\xc8\xa8\xa8\xa8\x85\xa8\xa8\xa8\x34\xa8\xa8\xa8\x05\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x0c\xa8\xa8\xa8\x2e\xa8\xa8\xa8\x57\xa8\xa8\xa8\x77\xa8\xa8\xa8\x89\xa8\xa8\xa8\x8c\xa8\xa8\xa8\x7d\xa8\xa8\xa8\x60\xa8\xa8\xa8\x38\xa8\xa8\xa8\x12\xa8\xa8\xa8\x01\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0\x03\xff\xff\x00\x00\xff\xfe\x00\x00\x3f\xf8\x00\x00\x1f\xf0\x00\x00\x0f\xf0\x00\x00\x07\xe0\x00\x00\x03\xc0\x00\x00\x03\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x01\xc0\x00\x00\x01\xc0\x00\x00\x03\xe0\x00\x00\x07\xf0\x00\x00\x07\xf0\x00\x00\x0f\xf8\x00\x00\x1f\xfe\x00\x00\x7f\xff\x00\x00\xff\xff\xe0\x03\xff" + +func lantern_disconnected_32IcoBytes() ([]byte, error) { + return bindataRead( + _lantern_disconnected_32Ico, + "lantern_disconnected_32.ico", + ) +} + +func lantern_disconnected_32Ico() (*asset, error) { + bytes, err := lantern_disconnected_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "lantern_disconnected_32.ico", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _lantern_disconnectedalert_32Ico = "\x00\x00\x01\x00\x01\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x11\xa8\xa8\xa8\x39\xa8\xa8\xa8\x65\xa8\xa8\xa8\x86\xa8\xa8\xa8\x97\xa8\xa8\xa8\x99\xab\xab\xa6\x8c\xa8\xa8\xa8\x6e\x5b\x5b\xd0\x47\x00\x00\xff\x51\x00\x00\xff\x77\x00\x00\xff\x81\x00\x00\xff\x74\x00\x00\xff\x4d\x00\x00\xff\x1c\x00\x00\xff\x01\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x03\xa8\xa8\xa8\x2c\xa8\xa8\xa8\x7d\xa8\xa8\xa8\xc4\xa8\xa8\xa8\xec\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa7\xff\x8f\x8f\xb5\xff\x4c\x4c\xd8\xfd\x12\x12\xf5\xf2\x00\x00\xff\xf6\x00\x00\xff\xfe\x00\x00\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xf4\x00\x00\xff\xd3\x00\x00\xff\x80\x00\x00\xff\x1f\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x1f\xa8\xa8\xa8\x89\xa8\xa8\xa8\xe4\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\x71\x71\xc5\xff\x19\x19\xf2\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xcf\x00\x00\xff\x47\x00\x00\xff\x01\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x02\xa8\xa8\xa8\x48\xa8\xa8\xa8\xce\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xaa\xaa\xa9\xff\x6d\x6d\xc8\xff\x0c\x0c\xf9\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x02\x02\xff\xff\x0a\x0a\xff\xff\x0b\x0b\xff\xff\x09\x09\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xe5\x00\x00\xff\x4c\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x03\xa8\xa8\xa8\x63\xa8\xa8\xa8\xe9\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb6\xb6\xb3\xff\xa7\xa7\xdd\xff\x18\x18\xf9\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x22\x22\xff\xff\xb3\xb3\xff\xff\xc4\xc4\xff\xff\xaa\xaa\xff\xff\x17\x17\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xd6\x00\x00\xff\x29\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x61\xa8\xa8\xa8\xef\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xae\xae\xad\xff\xdd\xdd\xe4\xff\x57\x57\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xec\xec\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\x95\x00\x00\xff\x04\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x43\xa8\xa8\xa8\xe6\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xcd\xcd\xca\xff\xc4\xc4\xfe\xff\x11\x11\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x25\x25\xff\xff\xc2\xc2\xff\xff\xd5\xd5\xff\xff\xb9\xb9\xff\xff\x19\x19\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xe2\x00\x00\xff\x30\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x19\xa8\xa8\xa8\xc5\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xad\xad\xad\xff\xee\xee\xeb\xff\x88\x88\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x03\x03\xff\xff\x0e\x0e\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xfc\x00\x00\xff\x70\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x7b\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc0\xc0\xc0\xff\xfa\xfa\xfc\xff\x5e\x5e\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x0f\x0f\xff\xff\x4f\x4f\xff\xff\x56\x56\xff\xff\x4b\x4b\xff\xff\x0a\x0a\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xa0\xa8\xa8\xa8\x00\xa8\xa8\xa8\x21\xa8\xa8\xa8\xd9\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xd8\xd8\xd8\xff\xfb\xfb\xff\xff\x4b\x4b\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xe9\xe9\xff\xff\xff\xff\xff\xff\xde\xde\xff\xff\x1e\x1e\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xb6\xa8\xa8\xa8\x00\xa8\xa8\xa8\x69\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xad\xad\xad\xff\xec\xec\xec\xff\xfd\xfd\xff\xff\x52\x52\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xae\xa8\xa8\xa8\x08\xa8\xa8\xa8\xb0\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb9\xb9\xb9\xff\xf9\xf9\xf9\xff\xff\xff\xff\xff\x6f\x6f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\x8b\xa8\xa8\xa8\x24\xa8\xa8\xa8\xdd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa6\xa6\xff\xff\x04\x04\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x05\x05\xfc\xfb\x24\x24\xec\x65\xa8\xa8\xa8\x47\xa8\xa8\xa8\xf3\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xd9\xd9\xd9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe3\xe3\xff\xff\x29\x29\xfd\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xeb\xeb\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x28\x28\xea\xff\x8f\x8f\xb5\x81\xa8\xa8\xa8\x64\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xab\xab\xab\xff\xe7\xe7\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xf8\xff\x4b\x4b\xba\xff\x00\x00\xf7\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x2d\x2d\xff\xff\xec\xec\xff\xff\xff\xff\xff\xff\xe0\xe0\xff\xff\x1f\x1f\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x06\x06\xfc\xff\x6d\x6d\xc7\xff\xac\xac\xa6\xa2\xa8\xa8\xa8\x73\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb1\xb1\xb1\xff\xf2\xf2\xf2\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf7\xff\x47\x47\x55\xff\x00\x00\xa3\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x1f\x1f\xff\xff\xa2\xa2\xff\xff\xb2\xb2\xff\xff\x9a\x9a\xff\xff\x15\x15\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xff\xff\x45\x45\xdb\xff\xa3\xa3\xab\xff\xa9\xa9\xa8\xb0\xa8\xa8\xa8\x72\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xba\xba\xba\xff\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\xff\x41\x41\x40\xff\x00\x00\x17\xff\x00\x00\xac\xff\x00\x00\xfd\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xff\xff\x04\x04\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x03\x03\xfe\xff\x40\x40\xde\xff\x9c\x9c\xae\xff\xa9\xa9\xa7\xff\xa8\xa8\xa8\xb0\xa8\xa8\xa8\x63\xa8\xa8\xa8\xfb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xc4\xc4\xc4\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf4\xf4\xf4\xff\x3c\x3c\x3c\xff\x00\x00\x00\xff\x00\x00\x13\xff\x01\x01\x7f\xff\x0b\x0b\xee\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x01\x01\xff\xff\x17\x17\xf3\xff\x5d\x5d\xcf\xff\xa0\xa0\xac\xff\xa9\xa9\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xa1\xa8\xa8\xa8\x45\xa8\xa8\xa8\xf2\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xce\xce\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\xf1\xf1\xff\x36\x36\x36\xff\x00\x00\x00\xff\x00\x00\x00\xff\x04\x04\x06\xff\x89\x89\xb3\xff\x8d\x8d\xff\xff\x4d\x4d\xff\xff\x30\x30\xff\xff\x26\x26\xfd\xff\x22\x22\xef\xff\x36\x36\xe3\xff\x5f\x5f\xce\xff\x90\x90\xb4\xff\xa9\xa9\xa8\xff\xa9\xa9\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x80\xa8\xa8\xa8\x22\xa8\xa8\xa8\xdb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xda\xda\xda\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\xef\xef\xff\x31\x31\x31\xff\x00\x00\x00\xff\x00\x00\x00\xff\x02\x02\x02\xff\xa8\xa8\xa8\xff\xff\xff\xff\xff\xfa\xfa\xff\xff\xef\xef\xff\xff\xe1\xe1\xf6\xff\xa7\xa7\xb8\xff\xa4\xa4\xa9\xff\xaa\xaa\xa7\xff\xa9\xa9\xa7\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf5\xa8\xa8\xa8\x51\xa8\xa8\xa8\x06\xa8\xa8\xa8\xad\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa7\xa7\xa7\xff\xb7\xb7\xb7\xff\xdd\xdd\xdd\xff\xf2\xf2\xf2\xff\xff\xff\xff\xff\xeb\xeb\xeb\xff\x2d\x2d\x2d\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\xa0\xa0\xa0\xff\xff\xff\xff\xff\xf7\xf7\xf7\xff\xe7\xe7\xe6\xff\xc9\xc9\xc8\xff\xa9\xa9\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xd7\xa8\xa8\xa8\x20\xa8\xa8\xa8\x00\xa8\xa8\xa8\x64\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa0\xa0\xa0\xff\x30\x30\x30\xff\x1a\x1a\x1a\xff\x3a\x3a\x3a\xff\x60\x60\x60\xff\x7a\x7a\x7a\xff\x19\x19\x19\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x52\x52\x52\xff\x6c\x6c\x6c\xff\x44\x44\x44\xff\x26\x26\x26\xff\x15\x15\x15\xff\x7e\x7e\x7e\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\x99\xa8\xa8\xa8\x02\xa8\xa8\xa8\x00\xa8\xa8\xa8\x1e\xa8\xa8\xa8\xd5\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\x98\x98\x98\xff\x1a\x1a\x1a\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x03\x03\x03\xff\x75\x75\x75\xff\xab\xab\xab\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf1\xa8\xa8\xa8\x43\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x74\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\x9c\x9c\x9c\xff\x45\x45\x45\xff\x15\x15\x15\xff\x03\x03\x03\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x01\x01\x01\xff\x11\x11\x11\xff\x3f\x3f\x3f\xff\x90\x90\x90\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xa7\xa8\xa8\xa8\x08\xa8\xa8\xa8\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x16\xa8\xa8\xa8\xbf\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa6\xa6\xa6\xff\x93\x93\x93\xff\x6e\x6e\x6e\xff\x24\x24\x24\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x0e\x0e\x0e\xff\x58\x58\x58\xff\x8d\x8d\x8d\xff\xa6\xa6\xa6\xff\xa9\xa9\xa9\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xe1\xa8\xa8\xa8\x34\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x3c\xa8\xa8\xa8\xe2\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa9\xa9\xa9\xff\xab\xab\xab\xff\x47\x47\x47\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x22\x22\x22\xff\xa0\xa0\xa0\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf5\xa8\xa8\xa8\x67\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x58\xa8\xa8\xa8\xeb\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\x68\x68\x68\xff\x16\x16\x16\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x07\x07\x07\xff\x44\x44\x44\xff\xa2\xa2\xa2\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf9\xa8\xa8\xa8\x83\xa8\xa8\xa8\x07\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x02\xa8\xa8\xa8\x59\xa8\xa8\xa8\xe4\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\x8f\x8f\x8f\xff\x4f\x4f\x4f\xff\x12\x12\x12\xff\x07\x07\x07\xff\x33\x33\x33\xff\x78\x78\x78\xff\xa2\xa2\xa2\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xf4\xa8\xa8\xa8\x81\xa8\xa8\xa8\x0a\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x01\xa8\xa8\xa8\x3f\xa8\xa8\xa8\xc5\xa8\xa8\xa8\xfd\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\x89\x89\x89\xff\x7b\x7b\x7b\xff\xa1\xa1\xa1\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xdd\xa8\xa8\xa8\x60\xa8\xa8\xa8\x06\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x18\xa8\xa8\xa8\x7d\xa8\xa8\xa8\xdd\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xaa\xaa\xaa\xff\xaa\xaa\xaa\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xeb\xa8\xa8\xa8\x99\xa8\xa8\xa8\x2b\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x01\xa8\xa8\xa8\x24\xa8\xa8\xa8\x71\xa8\xa8\xa8\xba\xa8\xa8\xa8\xe5\xa8\xa8\xa8\xf8\xa8\xa8\xa8\xfe\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xff\xa8\xa8\xa8\xfa\xa8\xa8\xa8\xeb\xa8\xa8\xa8\xc8\xa8\xa8\xa8\x85\xa8\xa8\xa8\x34\xa8\xa8\xa8\x05\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x00\xa8\xa8\xa8\x0c\xa8\xa8\xa8\x2e\xa8\xa8\xa8\x57\xa8\xa8\xa8\x77\xa8\xa8\xa8\x89\xa8\xa8\xa8\x8c\xa8\xa8\xa8\x7d\xa8\xa8\xa8\x60\xa8\xa8\xa8\x38\xa8\xa8\xa8\x12\xa8\xa8\xa8\x01\xa8\xa8\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0\x00\x1f\xff\x00\x00\x0f\xfe\x00\x00\x03\xf8\x00\x00\x03\xf0\x00\x00\x01\xf0\x00\x00\x00\xe0\x00\x00\x00\xc0\x00\x00\x00\xc0\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x01\xc0\x00\x00\x01\xc0\x00\x00\x03\xe0\x00\x00\x07\xf0\x00\x00\x07\xf0\x00\x00\x0f\xf8\x00\x00\x1f\xfe\x00\x00\x7f\xff\x00\x00\xff\xff\xe0\x03\xff" + +func lantern_disconnectedalert_32IcoBytes() ([]byte, error) { + return bindataRead( + _lantern_disconnectedalert_32Ico, + "lantern_disconnectedalert_32.ico", + ) +} + +func lantern_disconnectedalert_32Ico() (*asset, error) { + bytes, err := lantern_disconnectedalert_32IcoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "lantern_disconnectedalert_32.ico", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1602682821, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + ".DS_Store": Ds_store, + "beam_connected_32.ico": beam_connected_32Ico, + "beam_connected_32.png": beam_connected_32Png, + "beam_connectedalert_32.ico": beam_connectedalert_32Ico, + "beam_connectedalert_32.png": beam_connectedalert_32Png, + "beam_disconnected_32.ico": beam_disconnected_32Ico, + "beam_disconnected_32.png": beam_disconnected_32Png, + "beam_disconnectedalert_32.ico": beam_disconnectedalert_32Ico, + "beam_disconnectedalert_32.png": beam_disconnectedalert_32Png, + "lantern_connected_32.ico": lantern_connected_32Ico, + "lantern_connectedalert_32.ico": lantern_connectedalert_32Ico, + "lantern_disconnected_32.ico": lantern_disconnected_32Ico, + "lantern_disconnectedalert_32.ico": lantern_disconnectedalert_32Ico, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// +// data/ +// foo.txt +// img/ +// a.png +// b.png +// +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + ".DS_Store": &bintree{Ds_store, map[string]*bintree{}}, + "beam_connected_32.ico": &bintree{beam_connected_32Ico, map[string]*bintree{}}, + "beam_connected_32.png": &bintree{beam_connected_32Png, map[string]*bintree{}}, + "beam_connectedalert_32.ico": &bintree{beam_connectedalert_32Ico, map[string]*bintree{}}, + "beam_connectedalert_32.png": &bintree{beam_connectedalert_32Png, map[string]*bintree{}}, + "beam_disconnected_32.ico": &bintree{beam_disconnected_32Ico, map[string]*bintree{}}, + "beam_disconnected_32.png": &bintree{beam_disconnected_32Png, map[string]*bintree{}}, + "beam_disconnectedalert_32.ico": &bintree{beam_disconnectedalert_32Ico, map[string]*bintree{}}, + "beam_disconnectedalert_32.png": &bintree{beam_disconnectedalert_32Png, map[string]*bintree{}}, + "lantern_connected_32.ico": &bintree{lantern_connected_32Ico, map[string]*bintree{}}, + "lantern_connectedalert_32.ico": &bintree{lantern_connectedalert_32Ico, map[string]*bintree{}}, + "lantern_disconnected_32.ico": &bintree{lantern_disconnected_32Ico, map[string]*bintree{}}, + "lantern_disconnectedalert_32.ico": &bintree{lantern_disconnectedalert_32Ico, map[string]*bintree{}}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/desktop/icons/lantern_connected_32.ico b/desktop/icons/lantern_connected_32.ico new file mode 100644 index 000000000..62d7598ce Binary files /dev/null and b/desktop/icons/lantern_connected_32.ico differ diff --git a/desktop/icons/lantern_connectedalert_32.ico b/desktop/icons/lantern_connectedalert_32.ico new file mode 100644 index 000000000..011e59316 Binary files /dev/null and b/desktop/icons/lantern_connectedalert_32.ico differ diff --git a/desktop/icons/lantern_disconnected_32.ico b/desktop/icons/lantern_disconnected_32.ico new file mode 100644 index 000000000..bfaaf8f64 Binary files /dev/null and b/desktop/icons/lantern_disconnected_32.ico differ diff --git a/desktop/icons/lantern_disconnectedalert_32.ico b/desktop/icons/lantern_disconnectedalert_32.ico new file mode 100644 index 000000000..782558019 Binary files /dev/null and b/desktop/icons/lantern_disconnectedalert_32.ico differ diff --git a/desktop/lib.go b/desktop/lib.go new file mode 100644 index 000000000..8cd08eea9 --- /dev/null +++ b/desktop/lib.go @@ -0,0 +1,451 @@ +// filename: lib.go +package main + +import ( + "encoding/json" + "os" + "os/signal" + "path/filepath" + "runtime/debug" + "strconv" + "syscall" + + "github.com/shirou/gopsutil/v3/host" + + "github.com/getlantern/appdir" + "github.com/getlantern/errors" + "github.com/getlantern/flashlight/v7" + "github.com/getlantern/flashlight/v7/issue" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/ops" + "github.com/getlantern/flashlight/v7/logging" + "github.com/getlantern/flashlight/v7/pro" + "github.com/getlantern/flashlight/v7/pro/client" + "github.com/getlantern/osversion" + "github.com/getlantern/golog" + "github.com/getlantern/i18n" + "github.com/getlantern/lantern-client/desktop/app" + "github.com/getlantern/lantern-client/desktop/autoupdate" +) + +import "C" + +var ( + log = golog.LoggerFor("lantern-desktop.main") + a *app.App + proClient *client.Client +) + +//export Start +func Start() *C.char { + // Since Go 1.6, panic prints only the stack trace of current goroutine by + // default, which may not reveal the root cause. Switch to all goroutines. + debug.SetTraceback("all") + + cdir := configDir() + settings := loadSettings(cdir) + proClient = pro.NewClient() + + a = app.NewApp(flashlight.Flags{}, cdir, proClient, settings) + + go func() { + err := fetchOrCreate() + if err != nil { + log.Error(err) + } + }() + + logging.EnableFileLogging(common.DefaultAppName, appdir.Logs(common.DefaultAppName)) + + go func() { + i18nInit(a) + runApp(a) + + err := a.WaitForExit() + if err != nil { + log.Errorf("Lantern stopped with error %v", err) + os.Exit(-1) + } + log.Debug("Lantern stopped") + os.Exit(0) + }() + return C.CString("") +} + +func fetchOrCreate() error { + settings := a.Settings() + userID := settings.GetUserID() + if userID == 0 { + user, err := pro.NewUser(settings) + if err != nil { + return errors.New("Could not create new Pro user: %v", err) + } + settings.SetUserIDAndToken(user.Auth.ID, user.Auth.Token) + } + return nil +} + +//export SysProxyOn +func SysProxyOn() *C.char { + app.SysproxyOn() + return C.CString("on") +} + +//export SysProxyOff +func SysProxyOff() *C.char { + app.SysProxyOff() + return C.CString("off") +} + +func sendError(err error) *C.char { + if err == nil { + return C.CString("") + } + errors := map[string]interface{}{ + "error": err.Error(), + } + b, _ := json.Marshal(errors) + return C.CString(string(b)) +} + +//export SelectedTab +func SelectedTab() *C.char { + return C.CString(string(a.SelectedTab())) +} + +//export SetSelectTab +func SetSelectTab(ttab *C.char) { + tab, err := app.ParseTab(C.GoString(ttab)) + if err != nil { + log.Error(err) + return + } + a.SetSelectedTab(tab) +} + +//export Plans +func Plans() *C.char { + resp, err := proClient.Plans(userConfig()) + if err != nil { + return sendError(err) + } + b, _ := json.Marshal(resp.Plans) + return C.CString(string(b)) +} + +//export PaymentMethods +func PaymentMethods() *C.char { + resp, err := proClient.PaymentMethods(userConfig()) + if err != nil { + return sendError(err) + } + b, _ := json.Marshal(resp.Providers) + return C.CString(string(b)) +} + +//export UserData +func UserData() *C.char { + resp, err := proClient.UserData(userConfig()) + if err != nil { + return sendError(err) + } + b, _ := json.Marshal(resp) + return C.CString(string(b)) +} + +//export EmailAddress +func EmailAddress() *C.char { + return C.CString("") +} + +//export Referral +func Referral() *C.char { + referralCode, err := a.ReferralCode(userConfig()) + if err != nil { + return sendError(err) + } + return C.CString(referralCode) +} + +//export ChatEnabled +func ChatEnabled() *C.char { + return C.CString("false") +} + +//export PlayVersion +func PlayVersion() *C.char { + return C.CString("false") +} + +//export StoreVersion +func StoreVersion() *C.char { + return C.CString("false") +} + +//export Lang +func Lang() *C.char { + lang := a.Settings().GetLanguage() + return C.CString(lang) +} + +//export Country +func Country() *C.char { + country := a.Settings().GetCountry() + return C.CString(country) +} + +//export SdkVersion +func SdkVersion() *C.char { + return C.CString("1.0.0") +} + +//export VpnStatus +func VpnStatus() *C.char { + log.Debug("Another vpn status call") + if app.IsSysProxyOn() { + return C.CString("connected") + } + return C.CString("disconnected") +} + +//export HasSucceedingProxy +func HasSucceedingProxy() *C.char { + return C.CString("true") +} + +//export OnBoardingStatus +func OnBoardingStatus() *C.char { + return C.CString("true") +} + +//export AcceptedTermsVersion +func AcceptedTermsVersion() *C.char { + return C.CString("0") +} + +//export ProUser +func ProUser() *C.char { + if isProUser, ok := a.IsProUser(); isProUser && ok { + return C.CString("true") + } + return C.CString("false") +} + +//export DeviceLinkingCode +func DeviceLinkingCode() *C.char { + info, _ := host.Info() + resp, err := proClient.RequestDeviceLinkingCode(userConfig(), info.Hostname) + if err != nil { + return sendError(err) + } + return C.CString(resp.Code) +} + +//export PaymentRedirect +func PaymentRedirect(planID, provider, email, deviceName *C.char) *C.char { + country := a.Settings().GetCountry() + resp, err := proClient.PaymentRedirect(userConfig(), &client.PaymentRedirectRequest{ + Plan: C.GoString(planID), + Provider: C.GoString(provider), + Currency: "USD", + Email: C.GoString(email), + DeviceName: C.GoString(deviceName), + CountryCode: country, + }) + if err != nil { + return sendError(err) + } + return C.CString(resp.Redirect) +} + +//export DevelopmentMode +func DevelopmentMode() *C.char { + return C.CString("false") +} + +//export SplitTunneling +func SplitTunneling() *C.char { + return C.CString("false") +} + +//export ChatMe +func ChatMe() *C.char { + return C.CString("false") +} + +//export ReplicaAddr +func ReplicaAddr() *C.char { + return C.CString("") +} + +var issueMap = map[string]string{ + "Cannot access blocked sites": "3", + "Cannot complete purchase": "0", + "Cannot sign in": "1", + "Spinner loads endlessly": "2", + "Slow": "4", + "Chat not working": "7", + "Discover not working": "8", + "Cannot link device": "5", + "Application crashes": "6", + "Other": "9", +} + +func userConfig() *common.UserConfigData { + settings := a.Settings() + userID, deviceID, token := settings.GetUserID(), settings.GetDeviceID(), settings.GetToken() + return common.NewUserConfigData( + common.DefaultAppName, + deviceID, + userID, + token, + nil, + settings.GetLanguage(), + ) +} + +//export ReportIssue +func ReportIssue(email, issueType, description *C.char) *C.char { + deviceID := a.Settings().GetDeviceID() + issueTypeInt, err := strconv.Atoi(C.GoString(issueType)) + if err != nil { + return sendError(err) + } + + uc := userConfig() + + subscriptionLevel := "free" + if a.IsPro() { + subscriptionLevel = "pro" + } + + var osVersion string + osVersion, err = osversion.GetHumanReadable() + if err != nil { + log.Errorf("Unable to get version: %v", err) + } + log.Debug("Sending issue report") + err = issue.SendReport( + uc, + issueTypeInt, + C.GoString(description), + subscriptionLevel, + C.GoString(email), + app.ApplicationVersion, + deviceID, + osVersion, + "", + nil, + ) + if err != nil { + return sendError(err) + } + log.Debug("Successfully reported issue") + return C.CString("true") +} + +//export CheckUpdates +func CheckUpdates() *C.char { + log.Debug("Checking for updates") + settings := a.Settings() + userID := settings.GetUserID() + deviceID := settings.GetDeviceID() + op := ops.Begin("check_update"). + Set("user_id", userID). + Set("device_id", deviceID). + Set("current_version", app.ApplicationVersion) + defer op.End() + updateURL, err := autoupdate.CheckUpdates() + if err != nil { + log.Errorf("Error checking for update: %v", err) + return sendError(err) + } + log.Debugf("Auto-update URL is %s", updateURL) + return C.CString(updateURL) +} + + +//export Purchase +func Purchase(planID, email, cardNumber, expDate, cvc string) *C.char { + /*resp, err := proClient.Purchase(&proclient.PurchaseRequest{ + Provider: proclient.Provider_STRIPE, + Email: email, + Plan: planID, + CardNumber: cardNumber, + ExpDate: expDate, + Cvc: cvc, + }) + if err != nil { + return sendError(err) + } + b, _ := json.Marshal(resp)*/ + return C.CString("") +} + +// loadSettings loads the initial settings at startup, either from disk or using defaults. +func loadSettings(configDir string) *app.Settings { + path := filepath.Join(configDir, "settings.yaml") + if common.Staging { + path = filepath.Join(configDir, "settings-staging.yaml") + } + settings := app.LoadSettingsFrom(app.ApplicationVersion, app.RevisionDate, app.BuildDate, path) + if common.Staging { + settings.SetUserIDAndToken(9007199254740992, "OyzvkVvXk7OgOQcx-aZpK5uXx6gQl5i8BnOuUkc0fKpEZW6tc8uUvA") + } + return settings +} + +func configDir() string { + cdir := appdir.General(common.DefaultAppName) + log.Debugf("Using config dir %v", cdir) + if _, err := os.Stat(cdir); err != nil { + if os.IsNotExist(err) { + // Create config dir + if err := os.MkdirAll(cdir, 0750); err != nil { + log.Errorf("Unable to create configdir at %s: %s", configDir, err) + } + } + } + return cdir +} + +func runApp(a *app.App) { + // Schedule cleanup actions + handleSignals(a) + a.Run(true) +} + +func i18nInit(a *app.App) { + i18n.SetMessagesFunc(func(filename string) ([]byte, error) { + return a.GetTranslations(filename) + }) + locale := a.GetLanguage() + log.Debugf("Using locale: %v", locale) + if _, err := i18n.SetLocale(locale); err != nil { + log.Debugf("i18n.SetLocale(%s) failed, fallback to OS default: %q", locale, err) + + // On startup GetLanguage will return '', as the browser has not set the language yet. + // We use the OS locale instead and make sure the language is populated. + if locale, err := i18n.UseOSLocale(); err != nil { + log.Debugf("i18n.UseOSLocale: %q", err) + } else { + a.SetLanguage(locale) + } + } +} + +// Handle system signals for clean exit +func handleSignals(a *app.App) { + c := make(chan os.Signal, 1) + signal.Notify(c, + syscall.SIGHUP, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT) + go func() { + s := <-c + log.Debugf("Got signal \"%s\", exiting...", s) + }() +} + +func main() {} diff --git a/desktop/notifier/notifier.go b/desktop/notifier/notifier.go new file mode 100644 index 000000000..ba37babf6 --- /dev/null +++ b/desktop/notifier/notifier.go @@ -0,0 +1,101 @@ +package notifier + +import ( + "time" + + "github.com/getlantern/golog" + "github.com/getlantern/i18n" + notify "github.com/getlantern/notifier" + "github.com/getsentry/sentry-go" + + "github.com/getlantern/lantern-client/desktop/analytics" +) + +const ( + notificationTimeout = 15 * time.Second +) + +type notifierRequest struct { + note *notify.Notification + campaign string + chResult chan bool +} + +var ( + log = golog.LoggerFor("lantern-desktop.notifier") + ch = make(chan notifierRequest) +) + +// ShowNotification submits the notification to the notificationsLoop to show +// and waits for the result. +func ShowNotification(note *notify.Notification, campaign string) bool { + log.Debug("Showing notification") + err := normalizeClickURL(note, campaign) + if err != nil { + log.Errorf("Could not normalize click URL: %v", err) + return false + } + chResult := make(chan bool) + ch <- notifierRequest{ + note, + campaign, + chResult, + } + + return <-chResult +} + +func normalizeClickURL(note *notify.Notification, campaign string) error { + ga, err := analytics.AddCampaign(note.ClickURL, campaign, note.Title+"-"+note.Message, "notification") + if err != nil { + log.Errorf("Could not add campaign: %v", err) + return err + } + + note.ClickURL = ga + return nil +} + +// NotificationsLoop starts a goroutine to show the desktop notifications +// submitted by showNotification one by one with a minimum 10 seconds interval. +// +// Returns a function to stop the loop. +func NotificationsLoop(gaSession analytics.Session) (stop func()) { + return loopFor(notificationTimeout, gaSession) +} + +// NotificationsLoop starts a goroutine to show the desktop notifications +// submitted by showNotification one by one with a minimum 10 seconds interval. +// +// Returns a function to stop the loop. +func loopFor(delay time.Duration, gaSession analytics.Session) (stop func()) { + notifier := notify.NewNotificationsWithErrorCallback(func(err error) { + sentry.CaptureException(err) + }) + // buffered channel to avoid blocking stop() when goroutine is sleeping + chStop := make(chan bool, 1) + stop = func() { chStop <- true } + go func() { + for { + select { + case n := <-ch: + n.note.Sender = "com.getlantern.lantern" + n.note.AutoDismissAfter = notificationTimeout + if n.note.ClickLabel == "" { + n.note.ClickLabel = i18n.T("BACKEND_CLICK_LABEL_OPEN") + } + if err := notifier.Notify(n.note); err != nil { + log.Errorf("Could not notify? %v", err) + n.chResult <- false + } else { + n.chResult <- true + } + gaSession.Event("notification", n.campaign) + time.Sleep(delay) + case <-chStop: + return + } + } + }() + return +} diff --git a/desktop/notifier/notifier_test.go b/desktop/notifier/notifier_test.go new file mode 100644 index 000000000..db66d24a8 --- /dev/null +++ b/desktop/notifier/notifier_test.go @@ -0,0 +1,56 @@ +package notifier + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/getlantern/golog" + notify "github.com/getlantern/notifier" + + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/lantern-client/desktop/analytics" +) + +func TestNotify(t *testing.T) { + stop := loopFor(10*time.Millisecond, analytics.NullSession{}) + stop() + + stop = loopFor(10*time.Millisecond, analytics.NullSession{}) + note := ¬ify.Notification{ + Title: "test", + Message: "test", + ClickURL: "https://test.com", + IconURL: "https://test.com", + } + + shown := ShowNotification(note, "test-campaign") + + assert.True(t, shown) + stop() +} + +func TestNormalizeClickURL(t *testing.T) { + log := golog.LoggerFor("lantern-desktop.notifier-test") + note := ¬ify.Notification{ + Title: "test", + Message: "test", + ClickURL: "https://test.com", + IconURL: "https://test.com", + } + + err := normalizeClickURL(note, "test-campaign") + assert.NoError(t, err, "unexpected error") + log.Debugf("url: %v", note.ClickURL) + assert.Equal(t, "https://test.com?utm_campaign=test-campaign&utm_content=test-test&utm_medium=notification&utm_source="+common.Platform, note.ClickURL) + + note.ClickURL = ":" + log.Debugf("url: %v", note.ClickURL) + err = normalizeClickURL(note, "test-campaign") + assert.Error(t, err, "expected an error") + + stop := loopFor(10*time.Millisecond, analytics.NullSession{}) + defer stop() + assert.False(t, ShowNotification(note, "test-campaign")) +} diff --git a/desktop/server/server.go b/desktop/server/server.go new file mode 100644 index 000000000..f496cc851 --- /dev/null +++ b/desktop/server/server.go @@ -0,0 +1,12 @@ +package server + +import ( + "net/http" +) + +// PathHandler contains a request path pattern and an HTTP handler for that +// pattern. +type PathHandler struct { + Pattern string + Handler http.Handler +} \ No newline at end of file diff --git a/desktop/ws/service.go b/desktop/ws/service.go new file mode 100644 index 000000000..6642d8b20 --- /dev/null +++ b/desktop/ws/service.go @@ -0,0 +1,224 @@ +package ws + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "sync" +) + +type helloFnType func(func(interface{})) + +type newMsgFnType func() interface{} + +// UIChannel is a WebSocket server which can be attached to an HTTP server. +// Services can be registered with specific types so once the WebSocket +// clients are connected, they can exchange any JSON messages with the services. +type UIChannel interface { + // Handler exposes the UIChannel as an http.Handler + Handler() http.Handler + // Register registers a service with an optional helloFn to send initial + // message to connected clients. + Register(t string, helloFn helloFnType) (*Service, error) + // RegisterWithMsgInitializer is similar to Register, but with an additional + // newMsgFn to initialize the message data type to-be received from WebSocket + // client, instead of letting JSON unmarshaler to guess the data type. + RegisterWithMsgInitializer(t string, helloFn helloFnType, newMsgFn newMsgFnType) (*Service, error) + // Unregister stops the UIChannel from processing messages with the specific type. + Unregister(t string) +} + +// Service encapsulates a way to exchange JSON messages with a specific type +// with WebSocket clients. The messages are in the form of +// `{"type": , "message": }`. +type Service struct { + // Type must be unique in an UIChannel + Type string + // In is the channel to receive messages with the specific type from the + // clients. + In <-chan interface{} + // Out is the channel to send messages to the clients. + Out chan<- interface{} + in chan interface{} + out chan interface{} + stopCh chan bool + helloFn helloFnType + newMsgFn newMsgFnType + clients *clientChannels +} + +func (s *Service) writeAll() { + // Watch for new messages and send them to the combined output. + for { + select { + case <-s.stopCh: + log.Trace("Received message on stop channel") + return + case msg := <-s.out: + s.writeMsg(msg, s.clients.Out) + } + } +} + +// writeHelloMsg writes the message created by helloFn (if exists) to the +// specified channel. +func (s *Service) writeHelloMsg(out chan<- []byte) { + if s.helloFn != nil { + s.helloFn(func(msg interface{}) { + s.writeMsg(msg, out) + }) + } +} + +// writeMsg writes the specified message to the specified channel. The channel +// could fan out to all connected clients or could write to a single client, +// for example. +func (s *Service) writeMsg(msg interface{}, out chan<- []byte) { + log.Tracef("Creating new envelope for %v", s.Type) + b, err := newEnvelope(s.Type, msg) + if err != nil { + log.Error(err) + return + } + log.Tracef("Sending message to clients: %v", string(b)) + out <- b +} + +func NewUIChannel() UIChannel { + c := &uiChannel{services: make(map[string]*Service)} + c.clients = newClients(func(out chan<- []byte) { + // This method is the callback that gets called whenever there's a new + // incoming websocket connection. + c.muServices.RLock() + defer c.muServices.RUnlock() + for _, s := range c.services { + // Just queue the hello message for the given service for writing + // on the new incoming websocket. + // We put each call on a separate go routine to avoid any single hello + // function from blocking the others, which could result in the UI + // hanging. + go s.writeHelloMsg(out) + } + }) + go c.clients.writeAll() + go c.readLoop() + + log.Debugf("Accepting WebSocket connections") + return c +} + +type uiChannel struct { + clients *clientChannels + muServices sync.RWMutex + services map[string]*Service +} + +func (c *uiChannel) Handler() http.Handler { + return c.clients +} + +func (c *uiChannel) Register(t string, helloFn helloFnType) (*Service, error) { + return c.RegisterWithMsgInitializer(t, helloFn, nil) +} + +func (c *uiChannel) RegisterWithMsgInitializer(t string, helloFn helloFnType, newMsgFn newMsgFnType) (*Service, error) { + log.Tracef("Registering UI service %s", t) + + s := &Service{ + Type: t, + in: make(chan interface{}, 1000), + out: make(chan interface{}, 1000), + stopCh: make(chan bool, 1), // buffered to avoid blocking `Unregister()` + helloFn: helloFn, + newMsgFn: newMsgFn, + clients: c.clients, + } + s.In, s.Out = s.in, s.out + s.writeHelloMsg(c.clients.Out) + + c.muServices.Lock() + defer c.muServices.Unlock() + + if c.services[t] != nil { + // Using panic because this would be a developer error rather that + // something that could happen naturally. + panic("Service was already registered.") + } + + // Adding new service to service map. + c.services[t] = s + + log.Tracef("Registered UI service %s", t) + go s.writeAll() + return s, nil +} + +func (c *uiChannel) Unregister(t string) { + log.Tracef("Unregistering service: %v", t) + c.muServices.Lock() + defer c.muServices.Unlock() + if c.services[t] != nil { + c.services[t].stopCh <- true + delete(c.services, t) + } +} + +func (c *uiChannel) readLoop() { + for b := range c.clients.in { + // Determining message type. + var envType envelopeType + err := json.Unmarshal(b, &envType) + + if err != nil { + log.Errorf("Unable to parse JSON update from browser: %q", err) + continue + } + + // Delegating response to the service that registered with the given type. + c.muServices.RLock() + service := c.services[envType.Type] + c.muServices.RUnlock() + if service == nil { + log.Errorf("Message type %v belongs to an unknown service.", envType.Type) + continue + } + + env := &envelope{} + if service.newMsgFn != nil { + env.Message = service.newMsgFn() + } + d := json.NewDecoder(strings.NewReader(string(b))) + d.UseNumber() + err = d.Decode(env) + if err != nil { + log.Errorf("Unable to unmarshal message of type %v: %v", envType.Type, err) + continue + } + log.Tracef("Forwarding message: %v", env) + // Pass this message and continue reading another one. + service.in <- env.Message + } +} + +// envelopeType is the type of the message envelope. +type envelopeType struct { + Type string `json:"type,inline"` +} + +// envelope is a struct that wraps messages and associates them with a type. +type envelope struct { + envelopeType + Message interface{} `json:"message"` +} + +func newEnvelope(t string, msg interface{}) ([]byte, error) { + b, err := json.Marshal(&envelope{ + envelopeType: envelopeType{t}, + Message: msg, + }) + if err != nil { + return nil, fmt.Errorf("Unable to marshal message of type %v: %v", t, msg) + } + return b, nil +} diff --git a/desktop/ws/ws.go b/desktop/ws/ws.go new file mode 100644 index 000000000..e1dc782e0 --- /dev/null +++ b/desktop/ws/ws.go @@ -0,0 +1,221 @@ +package ws + +import ( + "io" + "net/http" + "sync" + + "github.com/getlantern/golog" + "github.com/gorilla/websocket" +) + +const ( + // MaxMessageSize determines the chunking size of messages used by gorilla + MaxMessageSize = 1024 +) + +var ( + log = golog.LoggerFor("lantern-desktop.ws") + upgrader = &websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: MaxMessageSize, + CheckOrigin: func(r *http.Request) bool { return true }, // I need this to test Lantern UI from a different host. + } +) + +type ConnectFunc func(out chan<- []byte) + +// clientChannels represents a data channel to/from the UI. UIChannel will have one +// underlying websocket connection for each connected browser window. All +// messages from any browser window are available via In and all messages sent +// to Out will be published to all browser windows. +type clientChannels struct { + In <-chan []byte + Out chan<- []byte + + in chan []byte + out chan []byte + + muConns sync.Mutex + nextId int + conns map[int]*wsconn + connsToRemove chan *wsconn + + onConnect ConnectFunc +} + +// newClients establishes a new channel acts as an http.Handler. When the UI +// connects to the handler, we will establish a websocket to the UI to carry +// messages for this UIChannel. The given onConnect function is called anytime +// that the UI connects. +func newClients(onConnect ConnectFunc) *clientChannels { + if onConnect == nil { + onConnect = func(chan<- []byte) {} + } + + in := make(chan []byte, 100) + out := make(chan []byte) + c := &clientChannels{ + In: in, + in: in, + Out: out, + out: out, + nextId: 0, + conns: make(map[int]*wsconn), + connsToRemove: make(chan *wsconn, 100), + onConnect: onConnect, + } + + return c +} + +func (c *clientChannels) ServeHTTP(resp http.ResponseWriter, req *http.Request) { + log.Debugf("Got connection to the UI channel") + var err error + + if req.Method != "GET" { + http.Error(resp, "Method not allowed", 405) + return + } + // Upgrade with a HTTP request returns a websocket connection + ws, err := upgrader.Upgrade(resp, req, nil) + if err != nil { + log.Errorf("Unable to upgrade to websocket: %v", err) + return + } + + log.Debugf("Upgraded to websocket") + defer func() { + if err := ws.Close(); err != nil { + log.Debugf("Error closing WebSockets connection: %s", err) + } + }() + + c.muConns.Lock() + c.nextId++ + conn := &wsconn{ + id: c.nextId, + c: c, + ws: ws, + connectOut: make(chan []byte, 1000), + out: make(chan []byte, 1000), + } + c.conns[conn.id] = conn + c.muConns.Unlock() + + c.onConnect(conn.connectOut) + go conn.write() + + log.Tracef("About to read from websocket connection") + conn.read() +} + +func (c *clientChannels) writeAll() { + defer func() { + log.Debugf("Closing all websockets") + c.muConns.Lock() + for _, conn := range c.conns { + c.doRemoveConn(conn) + } + c.muConns.Unlock() + }() + + for { + select { + case msg, ok := <-c.out: + if !ok { + // channel closed, we're done sending + return + } + for _, conn := range c.clonedConns() { + select { + case conn.out <- msg: + default: + log.Errorf("Failed to send message %v to websocket connection", msg) + } + } + case conn := <-c.connsToRemove: + log.Debugf("Removing single conn") + c.lockedRemoveConn(conn) + } + } +} + +func (c *clientChannels) clonedConns() map[int]*wsconn { + c.muConns.Lock() + defer c.muConns.Unlock() + clone := make(map[int]*wsconn) + for k, v := range c.conns { + clone[k] = v + } + return clone +} + +func (c *clientChannels) lockedRemoveConn(conn *wsconn) { + c.muConns.Lock() + defer c.muConns.Unlock() + conn = c.conns[conn.id] + if conn != nil { + c.doRemoveConn(conn) + } +} + +func (c *clientChannels) doRemoveConn(conn *wsconn) { + if err := conn.ws.Close(); err != nil { + log.Debugf("Error closing WebSockets connection: %v", err) + } + close(conn.out) + delete(c.conns, conn.id) +} + +// wsconn ties a websocket.Conn to a clientChannels +type wsconn struct { + id int + c *clientChannels + ws *websocket.Conn + connectOut chan []byte + out chan []byte +} + +func (c *wsconn) read() { + for { + _, b, err := c.ws.ReadMessage() + log.Tracef("Read message: %q", b) + if err != nil { + if err != io.EOF { + log.Debugf("Error reading from UI: %v", err) + } + return + } + log.Tracef("Sending to channel...") + c.c.in <- b + } +} + +func (c *wsconn) write() { + for { + select { + case msg := <-c.connectOut: + if !c.doWrite(msg) { + return + } + case msg, ok := <-c.out: + if !ok { + return + } + if !c.doWrite(msg) { + return + } + } + } +} + +func (c *wsconn) doWrite(msg []byte) bool { + err := c.ws.WriteMessage(websocket.TextMessage, msg) + if err != nil { + log.Debugf("Error writing to WebSocket, closing: %v", err) + c.c.connsToRemove <- c + return false + } + return true +} diff --git a/desktop/ws/ws_test.go b/desktop/ws/ws_test.go new file mode 100644 index 000000000..f2d608f5b --- /dev/null +++ b/desktop/ws/ws_test.go @@ -0,0 +1,78 @@ +package ws + +import ( + "net" + "net/http" + "net/url" + "strconv" + "strings" + "testing" + "time" + + "github.com/gorilla/websocket" + "github.com/stretchr/testify/assert" +) + +type locationData struct { + Code string `json:"code"` +} + +func TestStartServer(t *testing.T) { + + channel := NewUIChannel() + mux := http.NewServeMux() + mux.Handle("/data", channel.Handler()) + + server := &http.Server{ + Handler: mux, + ErrorLog: log.AsStdLogger(), + } + + l, _ := net.Listen("tcp", "127.0.0.1:0") + + port := l.Addr().(*net.TCPAddr).Port + go server.Serve(l) + + helloFn := func(write func(interface{})) { + log.Debugf("Sending message to new client") + write(locationData{ + Code: "US", + }) + } + service, _ := channel.Register("hello", helloFn) + defer channel.Unregister("hello") + + u := url.URL{Scheme: "ws", Host: "127.0.0.1:" + strconv.Itoa(port), Path: "/data"} + log.Debugf("connecting to %s", u.String()) + + time.Sleep(100 * time.Millisecond) + c, _, _ := websocket.DefaultDialer.Dial(u.String(), nil) + defer c.Close() + + done := make(chan struct{}) + + defer c.Close() + defer close(done) + _, message, err := c.ReadMessage() + if err != nil { + log.Debugf("read:", err) + return + } + log.Debugf("recv: %s", message) + + // Just make sure we get the expected message back in response to the + // connection. + assert.True(t, strings.Contains(string(message), "US")) + + msgBody := locationData{ + Code: "CN", + } + msg, _ := newEnvelope("hello", msgBody) + err = c.WriteMessage(websocket.TextMessage, msg) + assert.Nil(t, err) + + received := <-service.in + log.Debugf("recv: %s", received) + close(service.in) + close(service.out) +} diff --git a/go.mod b/go.mod index 5dcd65ba9..641cda5a9 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,11 @@ -module github.com/getlantern/android-lantern +module github.com/getlantern/lantern-client -go 1.19 +go 1.21 + +toolchain go1.21.4 // replace github.com/getlantern/flashlight/v7 => ../flashlight + // replace github.com/getlantern/fronted => ../fronted // replace github.com/getlantern/pathdb => ../pathDb/pathDb @@ -26,32 +29,49 @@ require ( github.com/getlantern/autoupdate v0.0.0-20231030193554-30131726a6d9 github.com/getlantern/dnsgrab v0.0.0-20230822102054-7ff232ec3148 github.com/getlantern/errors v1.0.3 + github.com/getlantern/eventual v1.0.0 github.com/getlantern/eventual/v2 v2.0.2 - github.com/getlantern/flashlight/v7 v7.6.19 + github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c + github.com/getlantern/flashlight/v7 v7.6.42-0.20240123172954-064414176dc4 github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 + github.com/getlantern/i18n v0.0.0-20181205222232-2afc4f49bb1c github.com/getlantern/idletiming v0.0.0-20231030193830-6767b09f86db github.com/getlantern/ipproxy v0.0.0-20230511223023-ee52513fd782 + github.com/getlantern/launcher v0.0.0-20230622120034-fe87f9bff286 + github.com/getlantern/memhelper v0.0.0-20220104170102-df557102babd github.com/getlantern/mtime v0.0.0-20200417132445-23682092d1f7 + github.com/getlantern/notifier v0.0.0-20220715102006-f432f7e83f94 + github.com/getlantern/osversion v0.0.0-20230401075644-c2a30e73c451 github.com/getlantern/pathdb v0.0.0-20231026090702-54ee1ddd99eb + github.com/getlantern/profiling v0.0.0-20160317154340-2a15afbadcff github.com/getlantern/replica v0.14.2 + github.com/getlantern/sysproxy v0.0.0-20231221104720-a50f1d2e3fe1 + github.com/getlantern/timezone v0.0.0-20210901200113-3f9de9d360c9 + github.com/getlantern/trafficlog v1.0.1 + github.com/getlantern/trafficlog-flashlight v1.0.1 + github.com/getlantern/yaml v0.0.0-20190801163808-0c9bb1ebf426 + github.com/getsentry/sentry-go v0.25.0 + github.com/google/uuid v1.5.0 github.com/gorilla/mux v1.8.0 + github.com/gorilla/websocket v1.5.0 + github.com/shirou/gopsutil/v3 v3.23.11 github.com/stretchr/testify v1.8.4 golang.org/x/mobile v0.0.0-20231006135142-2b44d11868fe - golang.org/x/net v0.17.0 + golang.org/x/net v0.19.0 + golang.org/x/sys v0.15.0 google.golang.org/protobuf v1.31.0 nhooyr.io/websocket v1.8.10 ) require ( crawshaw.io/sqlite v0.3.3-0.20220618202545-d1964889ea3c // indirect - filippo.io/edwards25519 v1.0.0 // indirect - git.torproject.org/pluggable-transports/goptlib.git v1.3.0 // indirect + github.com/Jigsaw-Code/outline-sdk v0.0.12 // indirect github.com/Jigsaw-Code/outline-ss-server v1.4.0 // indirect github.com/OperatorFoundation/Replicant-go/Replicant/v3 v3.0.23 // indirect github.com/OperatorFoundation/Starbridge-go/Starbridge/v3 v3.0.17 // indirect github.com/OperatorFoundation/ghostwriter-go v1.0.6 // indirect github.com/OperatorFoundation/go-bloom v1.0.1 // indirect - github.com/OperatorFoundation/go-shadowsocks2 v1.2.1 // indirect + github.com/OperatorFoundation/go-shadowsocks2 v1.2.8 // indirect github.com/PuerkitoBio/goquery v1.8.1 // indirect github.com/RoaringBitmap/roaring v1.2.3 // indirect github.com/Yawning/chacha20 v0.0.0-20170904085104-e3b1f968fc63 // indirect @@ -60,24 +80,24 @@ require ( github.com/alecthomas/atomic v0.1.0-alpha2 // indirect github.com/anacrolix/chansync v0.3.0 // indirect github.com/anacrolix/confluence v1.12.0 // indirect - github.com/anacrolix/dht/v2 v2.20.0 // indirect - github.com/anacrolix/envpprof v1.2.1 // indirect - github.com/anacrolix/generics v0.0.0-20230816103846-fe11fdc0e0e3 // indirect + github.com/anacrolix/dht/v2 v2.21.0 // indirect + github.com/anacrolix/envpprof v1.3.0 // indirect + github.com/anacrolix/generics v0.0.0-20230816105729-c755655aee45 // indirect github.com/anacrolix/go-libutp v1.3.1 // indirect - github.com/anacrolix/log v0.14.0 // indirect + github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4 // indirect github.com/anacrolix/missinggo v1.3.0 // indirect github.com/anacrolix/missinggo/perf v1.0.0 // indirect - github.com/anacrolix/missinggo/v2 v2.7.2-0.20230527121029-a582b4f397b9 // indirect + github.com/anacrolix/missinggo/v2 v2.7.3 // indirect github.com/anacrolix/mmsg v1.0.0 // indirect github.com/anacrolix/multiless v0.3.1-0.20221221005021-2d12701f83f7 // indirect github.com/anacrolix/squirrel v0.4.1 // indirect github.com/anacrolix/stm v0.4.1-0.20221221005312-96d17df0e496 // indirect - github.com/anacrolix/sync v0.4.0 // indirect + github.com/anacrolix/sync v0.5.1 // indirect github.com/anacrolix/torrent v1.52.6 // indirect github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 // indirect github.com/anacrolix/utp v0.1.0 // indirect - github.com/andybalholm/brotli v1.0.5 // indirect - github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/andybalholm/brotli v1.0.6 // indirect + github.com/andybalholm/cascadia v1.3.2 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/immutable v0.4.1-0.20221220213129-8932b999621d // indirect @@ -88,7 +108,6 @@ require ( github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dchest/siphash v1.2.3 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4 // indirect @@ -96,18 +115,18 @@ require ( github.com/dsoprea/go-png-image-structure v0.0.0-20200615034826-4cfc78940228 // indirect github.com/dsoprea/go-utility v0.0.0-20200512094054-1abbbc781176 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72 // indirect + github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/enobufs/go-nats v0.0.1 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/frankban/quicktest v1.14.6 // indirect github.com/gaukas/godicttls v0.0.4 // indirect - github.com/getlantern/borda v0.0.0-20230421223744-4e208135f082 // indirect - github.com/getlantern/broflake v0.0.0-20231016221059-9c3632502cae // indirect + github.com/getlantern/broflake v0.0.0-20231201020558-0a58dceeb5ab // indirect github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493 // indirect github.com/getlantern/byteexec v0.0.0-20220903142956-e6ed20032cfd // indirect github.com/getlantern/cmux v0.0.0-20230301223233-dac79088a4c0 // indirect github.com/getlantern/cmux/v2 v2.0.0-20230301223233-dac79088a4c0 // indirect - github.com/getlantern/cmuxprivate v0.0.0-20211216020409-d29d0d38be54 // indirect + github.com/getlantern/cmuxprivate v0.0.0-20231025143958-503c5330c30b // indirect github.com/getlantern/common v1.2.1-0.20230427204521-6ac18c21db39 // indirect github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 // indirect github.com/getlantern/detour v0.0.0-20230503144615-d3106a68f79e // indirect @@ -117,11 +136,8 @@ require ( github.com/getlantern/elevate v0.0.0-20220903142053-479ab992b264 // indirect github.com/getlantern/ema v0.0.0-20190620044903-5943d28f40e4 // indirect github.com/getlantern/enhttp v0.0.0-20210901195634-6f89d45ee033 // indirect - github.com/getlantern/enproxy v0.0.0-20180913191734-002212d417a4 // indirect github.com/getlantern/event v0.0.0-20210901195647-a7e3145142e6 // indirect - github.com/getlantern/eventual v1.0.0 // indirect github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731 // indirect - github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c // indirect github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede // indirect github.com/getlantern/fronted v0.0.0-20230601004823-7fec719639d8 // indirect github.com/getlantern/geo v0.0.0-20230612145351-d1374c8f8dec // indirect @@ -130,13 +146,13 @@ require ( github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 // indirect github.com/getlantern/go-update v0.0.0-20230221120840-8d795213a8bc // indirect github.com/getlantern/gonat v0.0.0-20201001145726-634575ba87fb // indirect + github.com/getlantern/gowin v0.0.0-20160824205538-88fa116ddffc // indirect github.com/getlantern/grtrack v0.0.0-20231025115619-bfbfadb228f3 // indirect github.com/getlantern/hellosplitter v0.1.1 // indirect github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc // indirect github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770 // indirect - github.com/getlantern/http-proxy-lantern/v2 v2.10.0 // indirect + github.com/getlantern/http-proxy-lantern/v2 v2.10.1-0.20231118011407-9f16767b92eb // indirect github.com/getlantern/httpseverywhere v0.0.0-20201210200013-19ae11fc4eca // indirect - github.com/getlantern/i18n v0.0.0-20181205222232-2afc4f49bb1c // indirect github.com/getlantern/iptool v0.0.0-20230112135223-c00e863b2696 // indirect github.com/getlantern/jibber_jabber v0.0.0-20210901195950-68955124cc42 // indirect github.com/getlantern/kcp-go/v5 v5.0.0-20220503142114-f0c1cd6e1b54 // indirect @@ -148,24 +164,20 @@ require ( github.com/getlantern/meta-scrubber v0.0.1 // indirect github.com/getlantern/mitm v0.0.0-20231025115752-54d3e43899b7 // indirect github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848 // indirect - github.com/getlantern/msgpack v3.1.4+incompatible // indirect github.com/getlantern/multipath v0.0.0-20230510135141-717ed305ef50 // indirect github.com/getlantern/netx v0.0.0-20211206143627-7ccfeb739cbd // indirect - github.com/getlantern/ops v0.0.0-20230519221840-1283e026181c // indirect - github.com/getlantern/osversion v0.0.0-20230401075644-c2a30e73c451 // indirect + github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534 // indirect github.com/getlantern/packetforward v0.0.0-20201001150407-c68a447b0360 // indirect github.com/getlantern/preconn v1.0.0 // indirect github.com/getlantern/proxy/v3 v3.0.0-20231031142453-252ab678e6b7 // indirect - github.com/getlantern/proxybench v0.0.0-20220404140110-f49055cb86de // indirect github.com/getlantern/psmux v1.5.15 // indirect - github.com/getlantern/quicwrapper v0.0.0-20230523101504-1ec066b7f869 // indirect + github.com/getlantern/quicwrapper v0.0.0-20231117185542-d951689c4970 // indirect github.com/getlantern/ratelimit v0.0.0-20220926192648-933ab81a6fc7 // indirect github.com/getlantern/reconn v0.0.0-20161128113912-7053d017511c // indirect github.com/getlantern/rot13 v0.0.0-20220822172233-370767b2f782 // indirect github.com/getlantern/rotator v0.0.0-20160829164113-013d4f8e36a2 // indirect github.com/getlantern/shortcut v0.0.0-20211026183428-bf59a137fdec // indirect github.com/getlantern/telemetry v0.0.0-20230523155019-be7c1d8cd8cb // indirect - github.com/getlantern/timezone v0.0.0-20210901200113-3f9de9d360c9 // indirect github.com/getlantern/tinywss v0.0.0-20211216020538-c10008a7d461 // indirect github.com/getlantern/tlsdefaults v0.0.0-20171004213447-cf35cfd0b1b4 // indirect github.com/getlantern/tlsdialer/v3 v3.0.3 // indirect @@ -174,38 +186,42 @@ require ( github.com/getlantern/tlsutil v0.5.3 // indirect github.com/getlantern/uuid v1.2.0 // indirect github.com/getlantern/waitforserver v1.0.1 // indirect - github.com/getlantern/withtimeout v0.0.0-20160829163843-511f017cd913 // indirect - github.com/getlantern/yaml v0.0.0-20190801163808-0c9bb1ebf426 // indirect - github.com/getsentry/sentry-go v0.20.0 // indirect + github.com/getlantern/winsvc v0.0.0-20160824205134-8bb3a5dbcc1d // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 // indirect + github.com/go-llsqlite/crawshaw v0.4.0 // indirect + github.com/go-logr/logr v1.4.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 // indirect + github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f // indirect github.com/golang/geo v0.0.0-20200319012246-673a6f80352d // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gopacket v1.1.19 // indirect github.com/google/netstack v0.0.0-00010101000000-000000000000 // indirect - github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/huandu/xstrings v1.3.2 // indirect + github.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/huandu/xstrings v1.4.0 // indirect github.com/jaffee/commandeer v0.6.0 // indirect github.com/keighl/mandrill v0.0.0-20170605120353-1775dd4b3b41 // indirect github.com/kennygrant/sanitize v1.2.4 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid v1.3.1 // indirect + github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/pgzip v1.2.5 // indirect - github.com/klauspost/reedsolomon v1.9.9 // indirect + github.com/klauspost/reedsolomon v1.12.0 // indirect github.com/kr/binarydist v0.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mdlayher/netlink v1.1.0 // indirect github.com/mholt/archiver/v3 v3.5.1 // indirect @@ -213,92 +229,100 @@ require ( github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/go-server-timing v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 // indirect github.com/mschoch/smat v0.2.0 // indirect github.com/nwaples/rardecode v1.1.2 // indirect - github.com/onsi/ginkgo/v2 v2.12.0 // indirect + github.com/onsi/ginkgo/v2 v2.13.2 // indirect github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect github.com/oschwald/geoip2-golang v1.8.0 // indirect github.com/oschwald/maxminddb-golang v1.10.0 // indirect github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect - github.com/pborman/uuid v1.2.1 // indirect github.com/pierrec/lz4/v4 v4.1.12 // indirect github.com/pion/datachannel v1.5.5 // indirect - github.com/pion/dtls/v2 v2.2.7 // indirect - github.com/pion/ice/v2 v2.3.5 // indirect - github.com/pion/interceptor v0.1.17 // indirect + github.com/pion/dtls/v2 v2.2.8 // indirect + github.com/pion/ice/v2 v2.3.11 // indirect + github.com/pion/interceptor v0.1.25 // indirect github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.7 // indirect + github.com/pion/mdns v0.0.9 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.10 // indirect - github.com/pion/rtp v1.7.13 // indirect - github.com/pion/sctp v1.8.7 // indirect + github.com/pion/rtcp v1.2.13 // indirect + github.com/pion/rtp v1.8.3 // indirect + github.com/pion/sctp v1.8.9 // indirect github.com/pion/sdp/v3 v3.0.6 // indirect - github.com/pion/srtp/v2 v2.0.15 // indirect - github.com/pion/stun v0.6.0 // indirect + github.com/pion/srtp/v2 v2.0.18 // indirect + github.com/pion/stun v0.6.1 // indirect github.com/pion/transport v0.14.1 // indirect - github.com/pion/transport/v2 v2.2.1 // indirect - github.com/pion/turn v1.3.7 // indirect - github.com/pion/turn/v2 v2.1.0 // indirect - github.com/pion/webrtc/v3 v3.2.6 // indirect + github.com/pion/transport/v2 v2.2.4 // indirect + github.com/pion/turn v1.4.0 // indirect + github.com/pion/turn/v2 v2.1.4 // indirect + github.com/pion/webrtc/v3 v3.2.23 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_golang v1.15.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect - github.com/quic-go/quic-go v0.34.0 // indirect + github.com/quic-go/qtls-go1-20 v0.4.1 // indirect + github.com/quic-go/quic-go v0.40.0 // indirect github.com/refraction-networking/utls v1.3.3 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 // indirect github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect - github.com/samber/lo v1.38.1 // indirect + github.com/samber/lo v1.39.0 // indirect github.com/shadowsocks/go-shadowsocks2 v0.1.5 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect + github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect - github.com/templexxx/cpu v0.0.8 // indirect - github.com/templexxx/xorsimd v0.4.1 // indirect + github.com/templexxx/cpu v0.1.0 // indirect + github.com/templexxx/xorsimd v0.4.2 // indirect github.com/ti-mo/conntrack v0.3.0 // indirect github.com/ti-mo/netfilter v0.3.1 // indirect github.com/tidwall/btree v1.6.0 // indirect github.com/tjfoc/gmsm v1.3.2 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tkuchiki/go-timezone v0.2.0 // indirect github.com/ulikunitz/xz v0.5.10 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xtaci/smux v1.5.24 // indirect - gitlab.com/yawning/edwards25519-extra.git v0.0.0-20211229043746-2f91fcc9fbdb // indirect - gitlab.com/yawning/obfs4.git v0.0.0-20220904064028-336a71d6e4cf // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/mock v0.3.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect - google.golang.org/grpc v1.58.3 // indirect + golang.org/x/tools v0.16.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect + google.golang.org/grpc v1.60.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - howett.net/plist v1.0.0 // indirect + howett.net/plist v1.0.1 // indirect + modernc.org/libc v1.22.3 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.21.1 // indirect + zombiezen.com/go/sqlite v0.13.1 // indirect ) diff --git a/go.sum b/go.sum index 776141241..f689d5d62 100644 --- a/go.sum +++ b/go.sum @@ -1,45 +1,15 @@ +cloud.google.com/go v0.16.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797 h1:yDf7ARQc637HoxDho7xjqdvO5ZA2Yb+xzv/fOnnvZzw= crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797/go.mod h1:sXBiorCo8c46JlQV3oXPKINnZ8mcqnye1EkVkqsectk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1.0.20210721174708-390f27c3be20/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.torproject.org/pluggable-transports/goptlib.git v1.0.0/go.mod h1:YT4XMSkuEXbtqlydr9+OxqFAyspUv0Gr9qhM3B++o/Q= -git.torproject.org/pluggable-transports/goptlib.git v1.3.0 h1:G+iuRUblCCC2xnO+0ag1/4+aaM98D5mjWP1M0v9s8a0= -git.torproject.org/pluggable-transports/goptlib.git v1.3.0/go.mod h1:4PBMl1dg7/3vMWSoWb46eGWlrxkUyn/CAJmxhDLAlDs= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/FZambia/sentinel v1.0.0/go.mod h1:ytL1Am/RLlAoAXG6Kj5LNuw/TRRQrv2rt2FT26vP5gI= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Jigsaw-Code/outline-sdk v0.0.12 h1:6s4OK26M0M70KHGGm++eapP/fNauJRQ8KNFbS+MuMTA= +github.com/Jigsaw-Code/outline-sdk v0.0.12/go.mod h1:9cEaF6sWWMzY8orcUI9pV5D0oFp2FZArTSyJiYtMQQs= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OperatorFoundation/Replicant-go/Replicant/v3 v3.0.23 h1:g0kC1BDonLwNse78HRsudElKEDfXHusLQ9Nfekl/l0o= github.com/OperatorFoundation/Replicant-go/Replicant/v3 v3.0.23/go.mod h1:QVlygHzbNc/fX+OHurCRC0AFwISJAUQbPaqdEfAkUio= @@ -49,8 +19,8 @@ github.com/OperatorFoundation/ghostwriter-go v1.0.6 h1:2E5D4qDKwsV+LQoKGtgIyjq5J github.com/OperatorFoundation/ghostwriter-go v1.0.6/go.mod h1:+uejzC1RRxZwngnCArqZX3d7i6ZX4Si8jNG8G6oCIKQ= github.com/OperatorFoundation/go-bloom v1.0.1 h1:8q/rfgfG7OvwGkmzusIuV8PlS8MvA/T0kQ2MXm9371g= github.com/OperatorFoundation/go-bloom v1.0.1/go.mod h1:b6bJWAnYIhwDgFIIolHyeuTYbPWAYj1Lnnwvcoa7P38= -github.com/OperatorFoundation/go-shadowsocks2 v1.2.1 h1:hyf+kZq2rb/Kjw440hZUuedV0UG4DeB4irW6c0cPpOE= -github.com/OperatorFoundation/go-shadowsocks2 v1.2.1/go.mod h1:lH6+PiEc2/aDpMqZrLzMz+o2dlE1rPME6GYZN1j4Bsg= +github.com/OperatorFoundation/go-shadowsocks2 v1.2.8 h1:tp1+fr25pdTxgyKt1VVqqZDRTB/jZBQdRktdKzAP5dk= +github.com/OperatorFoundation/go-shadowsocks2 v1.2.8/go.mod h1:lH6+PiEc2/aDpMqZrLzMz+o2dlE1rPME6GYZN1j4Bsg= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= @@ -60,49 +30,45 @@ github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVO github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Yawning/chacha20 v0.0.0-20170904085104-e3b1f968fc63 h1:I6/SJSN9wJMJ+ZyQaCHUlzoTA4ypU5Bb44YWR1wTY/0= github.com/Yawning/chacha20 v0.0.0-20170904085104-e3b1f968fc63/go.mod h1:nf+Komq6fVP4SwmKEaVGxHTyQGKREVlwjQKpvOV39yE= github.com/aead/ecdh v0.2.0 h1:pYop54xVaq/CEREFEcukHRZfTdjiWvYIsZDXXrBapQQ= github.com/aead/ecdh v0.2.0/go.mod h1:a9HHtXuSo8J1Js1MwLQx2mBhkXMT6YwUmVVEY4tTB8U= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0 h1:byYvvbfSo3+9efR4IeReh77gVs4PnNDR3AMOE9NJ7a0= github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0/go.mod h1:q37NoqncT41qKc048STsifIt69LfUJ8SrWWcz/yam5k= github.com/alecthomas/assert/v2 v2.0.0-alpha3 h1:pcHeMvQ3OMstAWgaeaXIAL8uzB9xMm2zlxt+/4ml8lk= +github.com/alecthomas/assert/v2 v2.0.0-alpha3/go.mod h1:+zD0lmDXTeQj7TgDgCt0ePWxb0hMC1G+PGTsTCv1B9o= github.com/alecthomas/atomic v0.1.0-alpha2 h1:dqwXmax66gXvHhsOS4pGPZKqYOlTkapELkLb3MNdlH8= github.com/alecthomas/atomic v0.1.0-alpha2/go.mod h1:zD6QGEyw49HIq19caJDc2NMXAy8rNi9ROrxtMXATfyI= github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142 h1:8Uy0oSf5co/NZXje7U1z8Mpep++QJOldL2hs/sBQf48= +github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= -github.com/alicebob/miniredis/v2 v2.15.1/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= github.com/anacrolix/chansync v0.3.0 h1:lRu9tbeuw3wl+PhMu/r+JJCRu5ArFXIluOgdF0ao6/U= github.com/anacrolix/chansync v0.3.0/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k= github.com/anacrolix/confluence v1.12.0 h1:NgrsfhebrJUiZgFfFCqPvV3L23k3kOJdkLXhNhlrnAs= github.com/anacrolix/confluence v1.12.0/go.mod h1:u0JTZ8Et0hC6MwSySOeYy11cUC0qGA7ntKvlIjOkfYI= -github.com/anacrolix/dht/v2 v2.20.0 h1:eDx9lfE9iCSf5sPK0290GToHURNhEFuUGN8iyvhvJDk= -github.com/anacrolix/dht/v2 v2.20.0/go.mod h1:SDGC+sEs1pnO2sJGYuhvIis7T8749dDHNfcjtdH4e3g= +github.com/anacrolix/dht/v2 v2.21.0 h1:8nzI+faaynY9jOKmVgdmBZVrTo8B7ZE/LKEgN3Vl/Bs= +github.com/anacrolix/dht/v2 v2.21.0/go.mod h1:SDGC+sEs1pnO2sJGYuhvIis7T8749dDHNfcjtdH4e3g= github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= github.com/anacrolix/envpprof v1.0.0/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= github.com/anacrolix/envpprof v1.1.0/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= -github.com/anacrolix/envpprof v1.2.1 h1:25TJe6t/i0AfzzldiGFKCpD+s+dk8lONBcacJZB2rdE= -github.com/anacrolix/envpprof v1.2.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= -github.com/anacrolix/generics v0.0.0-20230816103846-fe11fdc0e0e3 h1:O5xBrk97JnkTZdTsxsnQOBfD22/4L5rJXrBZrKUhJOY= -github.com/anacrolix/generics v0.0.0-20230816103846-fe11fdc0e0e3/go.mod h1:ff2rHB/joTV03aMSSn/AZNnaIpUw0h3njetGsaXcMy8= +github.com/anacrolix/envpprof v1.3.0 h1:WJt9bpuT7A/CDCxPOv/eeZqHWlle/Y0keJUvc6tcJDk= +github.com/anacrolix/envpprof v1.3.0/go.mod h1:7QIG4CaX1uexQ3tqd5+BRa/9e2D02Wcertl6Yh0jCB0= +github.com/anacrolix/generics v0.0.0-20230816105729-c755655aee45 h1:Kmcl3I9K2+5AdnnR7hvrnVT0TLeFWWMa9bxnm55aVIg= +github.com/anacrolix/generics v0.0.0-20230816105729-c755655aee45/go.mod h1:ff2rHB/joTV03aMSSn/AZNnaIpUw0h3njetGsaXcMy8= github.com/anacrolix/go-libutp v1.3.1 h1:idJzreNLl+hNjGC3ZnUOjujEaryeOGgkwHLqSGoige0= github.com/anacrolix/go-libutp v1.3.1/go.mod h1:heF41EC8kN0qCLMokLBVkB8NXiLwx3t8R8810MTNI5o= github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= github.com/anacrolix/log v0.6.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= github.com/anacrolix/log v0.10.1-0.20220123034749-3920702c17f8/go.mod h1:GmnE2c0nvz8pOIPUSC9Rawgefy1sDXqposC2wgtBZE4= github.com/anacrolix/log v0.13.1/go.mod h1:D4+CvN8SnruK6zIFS/xPoRJmtvtnxs+CSfDQ+BFxZ68= -github.com/anacrolix/log v0.14.0 h1:mYhTSemILe/Z8tIxbGdTIWWpPspI8W/fhZHpoFbDaL0= -github.com/anacrolix/log v0.14.0/go.mod h1:1OmJESOtxQGNMlUO5rcv96Vpp9mfMqXXbe2RdinFLdY= +github.com/anacrolix/log v0.14.3-0.20230823030427-4b296d71a6b4 h1:01OE3pdiBGIZGyQb6cIAu+QfaNhBR9k5MVmLsl+DVbE= +github.com/anacrolix/log v0.14.3-0.20230823030427-4b296d71a6b4/go.mod h1:1OmJESOtxQGNMlUO5rcv96Vpp9mfMqXXbe2RdinFLdY= +github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4 h1:CdVK9IoqoqklXQQ4+L2aew64xsz14KdOD+rnKdTQajg= +github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4/go.mod h1:1OmJESOtxQGNMlUO5rcv96Vpp9mfMqXXbe2RdinFLdY= github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62 h1:P04VG6Td13FHMgS5ZBcJX23NPC/fiC4cp9bXwYujdYM= github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62/go.mod h1:66cFKPCO7Sl4vbFnAaSq7e4OXtdMhRSBagJGWgmpJbM= github.com/anacrolix/missinggo v0.0.0-20180725070939-60ef2fbf63df/go.mod h1:kwGiTUTZ0+p4vAz3VbAI5a30t2YbvemcmspjKwrAz5s= @@ -116,8 +82,8 @@ github.com/anacrolix/missinggo/perf v1.0.0/go.mod h1:ljAFWkBuzkO12MQclXzZrosP5ur github.com/anacrolix/missinggo/v2 v2.2.0/go.mod h1:o0jgJoYOyaoYQ4E2ZMISVa9c88BbUBVQQW4QeRkNCGY= github.com/anacrolix/missinggo/v2 v2.5.1/go.mod h1:WEjqh2rmKECd0t1VhQkLGTdIWXO6f6NLjp5GlMZ+6FA= github.com/anacrolix/missinggo/v2 v2.5.2/go.mod h1:yNvsLrtZYRYCOI+KRH/JM8TodHjtIE/bjOGhQaLOWIE= -github.com/anacrolix/missinggo/v2 v2.7.2-0.20230527121029-a582b4f397b9 h1:W/oGeHhYwxueeiDjQfmK9G+X9M2xJgfTtow62v0TWAs= -github.com/anacrolix/missinggo/v2 v2.7.2-0.20230527121029-a582b4f397b9/go.mod h1:mIEtp9pgaXqt8VQ3NQxFOod/eQ1H0D1XsZzKUQfwtac= +github.com/anacrolix/missinggo/v2 v2.7.3 h1:Ee//CmZBMadeNiYB/hHo9ly2PFOEZ4Fhsbnug3rDAIE= +github.com/anacrolix/missinggo/v2 v2.7.3/go.mod h1:mIEtp9pgaXqt8VQ3NQxFOod/eQ1H0D1XsZzKUQfwtac= github.com/anacrolix/mmsg v0.0.0-20180515031531-a4a3ba1fc8bb/go.mod h1:x2/ErsYUmT77kezS63+wzZp8E3byYB0gzirM/WMBLfw= github.com/anacrolix/mmsg v1.0.0 h1:btC7YLjOn29aTUAExJiVUhQOuf/8rhm+/nWCMAnL3Hg= github.com/anacrolix/mmsg v1.0.0/go.mod h1:x8kRaJY/dCrY9Al0PEcj1mb/uFHwP6GCJ9fLl4thEPc= @@ -125,55 +91,44 @@ github.com/anacrolix/multiless v0.3.1-0.20221221005021-2d12701f83f7 h1:lOtCD+Lzo github.com/anacrolix/multiless v0.3.1-0.20221221005021-2d12701f83f7/go.mod h1:zJv1JF9AqdZiHwxqPgjuOZDGWER6nyE48WBCi/OOrMM= github.com/anacrolix/squirrel v0.4.1 h1:AmyXOEADG24keqgzutp+ioxJInpWHvVqeWOiHTbkeXk= github.com/anacrolix/squirrel v0.4.1/go.mod h1:YzgVvikMdFD441oTWlNG189bpKabO9Sbf3uCSVgca04= +github.com/anacrolix/squirrel v0.6.0 h1:ovfWW42wcGzrVYYI9s56pEYzfeTwtXxCCvSd+KwvUEA= +github.com/anacrolix/squirrel v0.6.0/go.mod h1:60vdNPUbK1jYWePp39Wqn9whHm12Yb9JEuwOXzLMDuY= github.com/anacrolix/stm v0.2.0/go.mod h1:zoVQRvSiGjGoTmbM0vSLIiaKjWtNPeTvXUSdJQA4hsg= github.com/anacrolix/stm v0.4.1-0.20221221005312-96d17df0e496 h1:aMiRi2kOOd+nG64suAmFMVnNK2E6GsnLif7ia9tI3cA= github.com/anacrolix/stm v0.4.1-0.20221221005312-96d17df0e496/go.mod h1:DBm8/1OXm4A4RZ6Xa9u/eOsjeAXCaoRYvd2JzlskXeM= github.com/anacrolix/sync v0.0.0-20180808010631-44578de4e778/go.mod h1:s735Etp3joe/voe2sdaXLcqDdJSay1O0OPnM0ystjqk= github.com/anacrolix/sync v0.3.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= -github.com/anacrolix/sync v0.4.0 h1:T+MdO/u87ir/ijWsTFsPYw5jVm0SMm4kVpg8t4KF38o= -github.com/anacrolix/sync v0.4.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= +github.com/anacrolix/sync v0.5.1 h1:FbGju6GqSjzVoTgcXTUKkF041lnZkG5P0C3T5RL3SGc= +github.com/anacrolix/sync v0.5.1/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= github.com/anacrolix/tagflag v0.0.0-20180109131632-2146c8d41bf0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= github.com/anacrolix/tagflag v1.0.0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= github.com/anacrolix/tagflag v1.1.0/go.mod h1:Scxs9CV10NQatSmbyjqmqmeQNwGzlNe0CMUMIxqHIG8= +github.com/anacrolix/tagflag v1.3.0/go.mod h1:Scxs9CV10NQatSmbyjqmqmeQNwGzlNe0CMUMIxqHIG8= github.com/anacrolix/torrent v1.52.6 h1:QRLte7x68cXvAmG6WpBqInl0ayCxBYaG1bOP5busnaI= github.com/anacrolix/torrent v1.52.6/go.mod h1:dA7tlQGWx1oCogZcnvjTCU2pQaNOyY2YgyG2kumC1H0= +github.com/anacrolix/torrent v1.53.2 h1:dW+ficSC8sJaGrUvZJizORPBLTP7XR8idl2oGlrUutQ= +github.com/anacrolix/torrent v1.53.2/go.mod h1:d1NANCFAd9/nv9vmHnYUobLdyBSAoFYohojHjGmcAsw= +github.com/anacrolix/torrent v1.53.3 h1:Abb3J8p/JWUjOzHaii8kixuDOGMXz+Oh8+hwc/zA2lA= +github.com/anacrolix/torrent v1.53.3/go.mod h1:is8GNob5qDeZ5Kq+pKPiE2xqYUi1ms7IgSB+CftZETk= github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 h1:QAVZ3pN/J4/UziniAhJR2OZ9Ox5kOY2053tBbbqUPYA= github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96/go.mod h1:Wa6n8cYIdaG35x15aH3Zy6d03f7P728QfdcDeD/IEOs= github.com/anacrolix/utp v0.1.0 h1:FOpQOmIwYsnENnz7tAGohA+r6iXpRjrq8ssKSre2Cp4= github.com/anacrolix/utp v0.1.0/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= +github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/goarista v0.0.0-20190429220743-799535f6f364/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/aristanetworks/goarista v0.0.0-20190628000427-15fc8b0bfcde/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= -github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= -github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.3.2/go.mod h1:qaqQiHSrOUVOfKe6fhgQ6UzhxjwqVW8aHNegd6Ws4w4= -github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.1/go.mod h1:v33JQ57i2nekYTA70Mb+O18KeH4KqhdqxTJZNK1zdRE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.1/go.mod h1:6EQZIwNNvHpq/2/QSJnp4+ECvqIy55w95Ofs0ze+nGQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.11.1/go.mod h1:XLAGFrEjbvMCLvAtWLLP32yTv8GpBquCApZEycDLunI= -github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= -github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= -github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/immutable v0.2.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/immutable v0.4.1-0.20221220213129-8932b999621d h1:2qVb9bsAMtmAfnxXltm+6eBzrrS7SZ52c3SedsulaMI= github.com/benbjohnson/immutable v0.4.1-0.20221220213129-8932b999621d/go.mod h1:iAr8OjJGLnLmVUr9MZ/rz4PWUy6Ouc2JLYuMArmvAJM= @@ -186,39 +141,27 @@ github.com/bits-and-blooms/bitset v1.3.0 h1:h7mv5q31cthBTd7V4kLAZaIThj1e8vPGcSqp github.com/bits-and-blooms/bitset v1.3.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/gosigar v1.1.0/go.mod h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= -github.com/cloudfoundry/gosigar v1.2.0/go.mod h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= -github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= -github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= @@ -241,58 +184,55 @@ github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72 h1:XiR1YwcWcRFzxjAhWK29HQL4nocj0QWJjpeRi/YASV0= github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f h1:WDoxHudni5ZFV/s5ioYukovIRKYwYjXDy2GY2L3fhhA= +github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/elliotchance/orderedmap v1.4.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= github.com/enobufs/go-nats v0.0.1 h1:uzC0mxan4hyGzUFG7cShFmk6c+XYgfoT8yTBgF5CJYw= github.com/enobufs/go-nats v0.0.1/go.mod h1:ZF0vpSk02ALIMFsHkIO4MHXUN1v3nLZssTaG+fgX/io= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.0/go.mod h1:3+D9sFq0ahK/JeJPhCBUV1xlf4/eIYrUQaxulT0VzX8= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.9.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= -github.com/getlantern/appdir v0.0.0-20180320102544-7c0f9d241ea7/go.mod h1:3vR6+jQdWfWojZ77w+htCqEF5MO/Y2twJOpAvFuM9po= github.com/getlantern/appdir v0.0.0-20200615192800-a0ef1968f4da h1:T/pxF37Z9SIQCHhMMUITZ3rhKRL0Noi9XxNwxKdBNw0= github.com/getlantern/appdir v0.0.0-20200615192800-a0ef1968f4da/go.mod h1:3vR6+jQdWfWojZ77w+htCqEF5MO/Y2twJOpAvFuM9po= +github.com/getlantern/authipc v0.2.0/go.mod h1:nDXd7xyGPMbPwEi4QAL3PPMzvwSFYbQxzk4ipANL25M= github.com/getlantern/autoupdate v0.0.0-20231030193554-30131726a6d9 h1:ZPiaHwoOv3V7aEB9Ia+2deqHJCdrjs773YWYG2CVKZ8= github.com/getlantern/autoupdate v0.0.0-20231030193554-30131726a6d9/go.mod h1:ohIVs2H6Wb58ZaCw/OAP+z6RPFVaRokAnldy+ATGwdQ= -github.com/getlantern/borda v0.0.0-20230421223744-4e208135f082 h1:Ka9rIAgef8zYhBr/VgLrt5+Qs7zE33g0OButzpIGcSs= -github.com/getlantern/borda v0.0.0-20230421223744-4e208135f082/go.mod h1:oCpQojhSaK0F/6rWMrDvN8/QFHQhTC9Gb3uf7GcqPQQ= -github.com/getlantern/broflake v0.0.0-20231016221059-9c3632502cae h1:8kLpvusHkHGjuW4f2y/OIF+vIbbpp1wM/UE4pOu9694= -github.com/getlantern/broflake v0.0.0-20231016221059-9c3632502cae/go.mod h1:Ehdl8IASN5rJi9brldVuCjTDcSU25nvaGRlzNprgeQo= +github.com/getlantern/broflake v0.0.0-20231201020558-0a58dceeb5ab h1:0fjL7dqKS7j0Cu/uCjNcELH4BgOu0S3c2+Qg/VWc/vg= +github.com/getlantern/broflake v0.0.0-20231201020558-0a58dceeb5ab/go.mod h1:brzUHh6XfkSMv+K72nrfCbrPbumeHJFlZZLIUG/UMjI= github.com/getlantern/bufconn v0.0.0-20190625204133-a08544339f8d/go.mod h1:d6O4RY+V87kIt4o9wru4SaNo7C2NAkD3YnmJFXEpODo= github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493 h1:8WjDNmpDLFVsAfcnHxqF4pfVKkdAQxyJ9iCHB4LxSfc= github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493/go.mod h1:d6O4RY+V87kIt4o9wru4SaNo7C2NAkD3YnmJFXEpODo= github.com/getlantern/bytecounting v0.0.0-20190530140808-3b3f10d3b9ab h1:bKsTXN1XgjiWuciuEChVIPFXWD8sTASsvjkMAGMEb/4= github.com/getlantern/bytecounting v0.0.0-20190530140808-3b3f10d3b9ab/go.mod h1:O/UvKlcgUd/tsplTbFesvYtqGENHVE/yO8DJ1sd+x+g= github.com/getlantern/byteexec v0.0.0-20170405023437-4cfb26ec74f4/go.mod h1:4WCQkaCIwta0KlF9bQZA1jYqp8bzIS2PeCqjnef8nZ8= +github.com/getlantern/byteexec v0.0.0-20200509011419-2f5ed5531ada/go.mod h1:4WCQkaCIwta0KlF9bQZA1jYqp8bzIS2PeCqjnef8nZ8= github.com/getlantern/byteexec v0.0.0-20220903142956-e6ed20032cfd h1:0xt9OTbV50a/+ZarMcr86ybWiN1v+bbwzdnVuXHzR/o= github.com/getlantern/byteexec v0.0.0-20220903142956-e6ed20032cfd/go.mod h1:oD9q9NB1LNBLHk3WAwza4tivxV7tm7jKFlCNCAv3+M8= -github.com/getlantern/bytemap v0.0.0-20210122162547-b07440a617f0/go.mod h1:o01y9zxAVkFLqhZjC+mFXsN4NdxQG44Ff/nH1W4SuvI= github.com/getlantern/cmux v0.0.0-20230301223233-dac79088a4c0 h1:JlVdpDQThkcqlMoqpn89ZfNUpxNTUNqUrTFacBJvIqU= github.com/getlantern/cmux v0.0.0-20230301223233-dac79088a4c0/go.mod h1:48COjs7jITfhkdw82LeMDQtrISx0CQG3/W0Ycr2UafM= github.com/getlantern/cmux/v2 v2.0.0-20200905031936-c55b16ee8462/go.mod h1:oJz1ghfzM796DpGP0et6Gbc3si2Zn3/7l7KxxK/KXQ0= github.com/getlantern/cmux/v2 v2.0.0-20230301223233-dac79088a4c0 h1:Yn5u/vwIC0iIKyI7OqhD4R74vzhaMCEaFHei9AJXS3c= github.com/getlantern/cmux/v2 v2.0.0-20230301223233-dac79088a4c0/go.mod h1:oJz1ghfzM796DpGP0et6Gbc3si2Zn3/7l7KxxK/KXQ0= -github.com/getlantern/cmuxprivate v0.0.0-20211216020409-d29d0d38be54 h1:aqzgkWfjRLDSIpTKU3x4a8MtqpRi5Jr2pt81Ga0moJQ= -github.com/getlantern/cmuxprivate v0.0.0-20211216020409-d29d0d38be54/go.mod h1:WIunQ/nFvkQAP89tY2CX4R5kj9A1OJhjA3KmP6nj4o4= +github.com/getlantern/cmuxprivate v0.0.0-20231025143958-503c5330c30b h1:QBjkczmb3tWbgQN4g4VUCBTK2jw/1ex+DCqdPlraGGc= +github.com/getlantern/cmuxprivate v0.0.0-20231025143958-503c5330c30b/go.mod h1:WIunQ/nFvkQAP89tY2CX4R5kj9A1OJhjA3KmP6nj4o4= github.com/getlantern/common v1.2.1-0.20230427204521-6ac18c21db39 h1:jMVok8jOJRTz13GbCcemOry0CGmFA/xFvkcMNXaHxkY= github.com/getlantern/common v1.2.1-0.20230427204521-6ac18c21db39/go.mod h1:0SEJgqSudY1N0PP012aNY2raInQVUeXOp08VGrjtuOU= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= @@ -316,8 +256,6 @@ github.com/getlantern/ema v0.0.0-20190620044903-5943d28f40e4 h1:PMK8QQn9GLTQXdHn github.com/getlantern/ema v0.0.0-20190620044903-5943d28f40e4/go.mod h1:tzRwT19aDrWSr6yRDs8iOvaXXCau96EgWsgGT9wIpoQ= github.com/getlantern/enhttp v0.0.0-20210901195634-6f89d45ee033 h1:HbjEpFFiRYcySVkFMdn3kl3OUU0UZwMdcXzY5gXUEQo= github.com/getlantern/enhttp v0.0.0-20210901195634-6f89d45ee033/go.mod h1:kHP/nfmHj9HJVN5Cb+1RFNRLR0O0nx40YENc4wKIe6s= -github.com/getlantern/enproxy v0.0.0-20180913191734-002212d417a4 h1:PNbh29DNRJF7KTZi1h85KDR0x4vYiRrXq7lews4xe6o= -github.com/getlantern/enproxy v0.0.0-20180913191734-002212d417a4/go.mod h1:Gg8JT6crCL+8vd1+KPtLIC2+KHGiaB0l+Q8bDbj7B30= github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= github.com/getlantern/errors v1.0.1/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= github.com/getlantern/errors v1.0.3 h1:Ne4Ycj7NI1BtSyAfVeAT/DNoxz7/S2BUc3L2Ht1YSHE= @@ -336,8 +274,26 @@ github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731/go.mod h1:XZwE+ github.com/getlantern/filepersist v0.0.0-20160317154340-c5f0cd24e799/go.mod h1:8DGAx0LNUfXNnEH+fXI0s3OCBA/351kZCiz/8YSK3i8= github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c h1:mcz27xtAkb1OuOLBct/uFfL1p3XxAIcFct82GbT+UZM= github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c/go.mod h1:8DGAx0LNUfXNnEH+fXI0s3OCBA/351kZCiz/8YSK3i8= -github.com/getlantern/flashlight/v7 v7.6.19 h1:yGNp6NnabhHjLnZkhOwfVFMJzsbKjo8BVqo8iKUXEO4= -github.com/getlantern/flashlight/v7 v7.6.19/go.mod h1:Aui1+XJ8wUkihKv1MDrLJQwzK5C4kxHjte4YX8Jx5a0= +github.com/getlantern/flashlight/v7 v7.6.32-0.20231214053628-47e242406c56 h1:xsXQawwouuxXF9oTNVFHra8zlWZCFmNFD6ESfB3lILQ= +github.com/getlantern/flashlight/v7 v7.6.32-0.20231214053628-47e242406c56/go.mod h1:fX68JW5XYV6tgYipzZQXGVkZQzm9SIFNXiW6X7fE94U= +github.com/getlantern/flashlight/v7 v7.6.33 h1:76ueRQ/m1/IShdN7ozqZKd1CPJmyqlLrFaLYVq6apE8= +github.com/getlantern/flashlight/v7 v7.6.33/go.mod h1:fCr2HH3A16Y9qzAq9OumAapFnO+Elt7rvFHrVfHTah8= +github.com/getlantern/flashlight/v7 v7.6.34-0.20231221105103-c697d28bb0ed h1:mHnzpFdYj9zvxzLcncBlqhkv89yqgZnN9KEIVUof+Gk= +github.com/getlantern/flashlight/v7 v7.6.34-0.20231221105103-c697d28bb0ed/go.mod h1:fX68JW5XYV6tgYipzZQXGVkZQzm9SIFNXiW6X7fE94U= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240101090023-369fcd3c7744 h1:SVSSh5ekfgNb1GvV1Ey0pCj8/3lJIt3qJ6PwY1vHEYI= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240101090023-369fcd3c7744/go.mod h1:fX68JW5XYV6tgYipzZQXGVkZQzm9SIFNXiW6X7fE94U= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240101094715-9538dba48ce1 h1:OBQuDm6ehAu5SRjzyXJv2sVfF/nrIN8oatG+nP0ymsY= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240101094715-9538dba48ce1/go.mod h1:fX68JW5XYV6tgYipzZQXGVkZQzm9SIFNXiW6X7fE94U= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240105043417-f8432e94b48d h1:CnCkhGZ4Ta/BnWWY3c5jjLT0+YHcgjqmpXoHukEyW20= +github.com/getlantern/flashlight/v7 v7.6.34-0.20240105043417-f8432e94b48d/go.mod h1:fX68JW5XYV6tgYipzZQXGVkZQzm9SIFNXiW6X7fE94U= +github.com/getlantern/flashlight/v7 v7.6.41-0.20240122044933-ebae7babf652 h1:RGwZVE2nnCIHNNzbi93Q2rpD5d4IhDofOhNOo65EZG4= +github.com/getlantern/flashlight/v7 v7.6.41-0.20240122044933-ebae7babf652/go.mod h1:9/+NBm6O8LHoy72vrocnBPKblJU4yhojPOSguYuPDOc= +github.com/getlantern/flashlight/v7 v7.6.41 h1:qq9gCDOzUbVUZAhP0qEyePI1sLA/1B1dz/KdSmXkBL4= +github.com/getlantern/flashlight/v7 v7.6.41/go.mod h1:9/+NBm6O8LHoy72vrocnBPKblJU4yhojPOSguYuPDOc= +github.com/getlantern/flashlight/v7 v7.6.42-0.20240123171853-2f8483828e99 h1:x+XWWpPxpgbE6cxa3+KmVqsrYjY8bklf4X9S6o3MQzA= +github.com/getlantern/flashlight/v7 v7.6.42-0.20240123171853-2f8483828e99/go.mod h1:9/+NBm6O8LHoy72vrocnBPKblJU4yhojPOSguYuPDOc= +github.com/getlantern/flashlight/v7 v7.6.42-0.20240123172954-064414176dc4 h1:FfFJqR2QX9fZ/YrDCBT8PnyIOMmF8qo5S3v1i8BBQYg= +github.com/getlantern/flashlight/v7 v7.6.42-0.20240123172954-064414176dc4/go.mod h1:9/+NBm6O8LHoy72vrocnBPKblJU4yhojPOSguYuPDOc= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede h1:yrU6Px3ZkvCsDLPryPGi6FN+2iqFPq+JeCb7EFoDBhw= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede/go.mod h1:nhnoiS6DE6zfe+BaCMU4YI01UpsuiXnDqM5S8jxHuuI= github.com/getlantern/fronted v0.0.0-20230601004823-7fec719639d8 h1:r/Z/SPPIfLXDI3QA7/tE6nOfPncrqeUPDjiFjnNGP50= @@ -352,7 +308,6 @@ github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 h1:RBKofGGMt2 github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5/go.mod h1:kGHRXch95rnGLHjER/GhhFiHvfnqNz7KqWD9kGfATHY= github.com/getlantern/go-update v0.0.0-20230221120840-8d795213a8bc h1:qZ/HlURAOgGRKtqDGimPwL2w5PkvW7Ap+c1bGRK0pzU= github.com/getlantern/go-update v0.0.0-20230221120840-8d795213a8bc/go.mod h1:DQAFBxfQlSru9Loud3pLM+rF//qf0FQBtB//grF89IA= -github.com/getlantern/goexpr v0.0.0-20211215215226-4cdd4fd2847b/go.mod h1:ZaY9C4jtM37dI+XfwuKqKIdVQAdeQPIiFtwBMN/TSY4= github.com/getlantern/golog v0.0.0-20190809085441-26e09e6dd330/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= github.com/getlantern/golog v0.0.0-20200929154820-62107891371a/go.mod h1:ZyIjgH/1wTCl+B+7yH1DqrWp6MPJqESmwmEQ89ZfhvA= @@ -363,6 +318,8 @@ github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65/go.mod h1:+ZU1h+i github.com/getlantern/gonat v0.0.0-20201001145726-634575ba87fb h1:tDQA66mL1vTHKSMu3Ras/9Tk884ipPAhcdQHXpnDhxg= github.com/getlantern/gonat v0.0.0-20201001145726-634575ba87fb/go.mod h1:ysiamkJHyOrnlNmtDCCccH1NbFdgEBSJRg44DWiOxcY= github.com/getlantern/gotun v0.0.0-20190809092752-6d35bb1397ee/go.mod h1:zvsZQrsl7Yrmi+ENk5WZFT7dQaYtihAcI0H/9+LacqQ= +github.com/getlantern/gowin v0.0.0-20160824205538-88fa116ddffc h1:4PgzRiHOP7qfq6kBzcj7dSbE6QmAoD5P87+rJvOH0Gs= +github.com/getlantern/gowin v0.0.0-20160824205538-88fa116ddffc/go.mod h1:UX71eBZilSY+UR7rfdMh0rA/IY0HS7tXRoMO9EiKXKE= github.com/getlantern/grtrack v0.0.0-20160824195228-cbf67d3fa0fd/go.mod h1:RkQEgBdrJCH5tYJP2D+a/aJ216V3c9q8w/tCJtEiDoY= github.com/getlantern/grtrack v0.0.0-20231025115619-bfbfadb228f3 h1:3eOqQA2WKd5tvepSwHXcN1IteDBnWcrs4dAoKVpGZ9k= github.com/getlantern/grtrack v0.0.0-20231025115619-bfbfadb228f3/go.mod h1:esUcij+yiXH9mSlzZChtoSClQ9vr8cjNgEbcDHVqJfI= @@ -372,11 +329,10 @@ github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwl github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc h1:sue+aeVx7JF5v36H1HfvcGFImLpSD5goj8d+MitovDU= github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc/go.mod h1:D9RWpXy/EFPYxiKUURo2TB8UBosbqkiLhttRrZYtvqM= github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= -github.com/getlantern/hidden v0.0.0-20201229170000-e66e7f878730/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770 h1:cSrD9ryDfTV2yaur9Qk3rHYD414j3Q1rl7+L0AylxrE= github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770/go.mod h1:GOQsoDnEHl6ZmNIL+5uVo+JWRFWozMEp18Izcb++H+A= -github.com/getlantern/http-proxy-lantern/v2 v2.10.0 h1:cnKPteRz1xE1iAZMCuTpQX5cQXUPMOoLq+FdhFAfIyQ= -github.com/getlantern/http-proxy-lantern/v2 v2.10.0/go.mod h1:bY0Uxqvojq1Uj6R7DwyqGh+YxNeZ4vF/N+TtwXVjALg= +github.com/getlantern/http-proxy-lantern/v2 v2.10.1-0.20231118011407-9f16767b92eb h1:pR+bEMoHwZPzIrJp/Q8O/00Mbi09s7cH3FxhykNGAbw= +github.com/getlantern/http-proxy-lantern/v2 v2.10.1-0.20231118011407-9f16767b92eb/go.mod h1:UkN8RlXXnSSmLIupSmXB06gdcm9rbsz7IGT15D/D1MQ= github.com/getlantern/httpseverywhere v0.0.0-20201210200013-19ae11fc4eca h1:Of3VwFEfKbVnK5/VGy05XUbi6QvTs5Y2eLDfPv3O50E= github.com/getlantern/httpseverywhere v0.0.0-20201210200013-19ae11fc4eca/go.mod h1:TNC/xJFmctsSGyXqcnVWwCRCPD/4zGQP7yBVnLDRa/U= github.com/getlantern/i18n v0.0.0-20181205222232-2afc4f49bb1c h1:+JnT+Rwa/3rksc4Zi0u6fJ/WX+tPK58GtsrcXWVUU2U= @@ -400,17 +356,20 @@ github.com/getlantern/keepcurrent v0.0.0-20221014183517-fcee77376b89 h1:gjlTAADW github.com/getlantern/keepcurrent v0.0.0-20221014183517-fcee77376b89/go.mod h1:EtJEobtQH/HiQsZLyRjlrnq/fu7vfgnTMzhbmUqkZ3M= github.com/getlantern/keyman v0.0.0-20180207174507-f55e7280e93a/go.mod h1:FMf0g72BHs14jVcD8i8ubEk4sMB6JdidBn67d44i3ws= github.com/getlantern/keyman v0.0.0-20200819205636-76fef27c39f1/go.mod h1:FMf0g72BHs14jVcD8i8ubEk4sMB6JdidBn67d44i3ws= -github.com/getlantern/keyman v0.0.0-20210622061955-aa0d47d4932c/go.mod h1:lzCwzxjE8ciu+2bZku7kcCKfOYAXUs4stPn3elouYNI= github.com/getlantern/keyman v0.0.0-20230503155501-4e864ca2175b h1:iyEuk8ARQC9HfraqC4r3leBhU55R1TV7bAiyPYE54kA= github.com/getlantern/keyman v0.0.0-20230503155501-4e864ca2175b/go.mod h1:ZJ+yDaZkJ/JU9j7EQa3UUh6ouedrNDDLA5OiowS1Iuk= github.com/getlantern/lampshade v0.0.0-20201109225444-b06082e15f3a h1:z7G1v79GB1qRrkcbzF0nrLzV/+dwdGmamEZAp0ff+z0= github.com/getlantern/lampshade v0.0.0-20201109225444-b06082e15f3a/go.mod h1:cGOfTjvllC9bcwS7cVW6tGT6fXc8Dki384uFjm7XBnw= github.com/getlantern/lantern-shadowsocks v1.3.6-0.20230301223223-150b18ac427d h1:YwH3hgY1qtp1J1V8iBx58wB+mAY6L7N1s+qYqNJgDjM= github.com/getlantern/lantern-shadowsocks v1.3.6-0.20230301223223-150b18ac427d/go.mod h1:Wwa1uDdu6LxVRANcN2dQ+aNI0rY+km+dqHW2G9Qm34k= +github.com/getlantern/launcher v0.0.0-20230622120034-fe87f9bff286 h1:b8XesQLtoq58M8FcYxxfWDUcBOzbGfBJGDOZDQ4PjYs= +github.com/getlantern/launcher v0.0.0-20230622120034-fe87f9bff286/go.mod h1:pEDM+G+PFz616x02zkWcmhjaeZ9rHDKZL8stK3uE9J8= github.com/getlantern/mandrill v0.0.0-20221004112352-e7c04248adcb h1:oyEMOT9jn4bzKyivF2sVBogsXyL8fBCK7HIT/P6h64Y= github.com/getlantern/mandrill v0.0.0-20221004112352-e7c04248adcb/go.mod h1:gz4iIB+vPk8hWxkAnnZSudQuIpBMnW7i89eHl9Fl+I8= github.com/getlantern/measured v0.0.0-20230919230611-3d9e3776a6cd h1:pDfqh9yd58OW9vQzv4U+q6G+LfbNXVhbWcBWmC5Dkm4= github.com/getlantern/measured v0.0.0-20230919230611-3d9e3776a6cd/go.mod h1:QG6d9+nAxD1PjVjgGLUUHPZBQUp20/h7j8a3kxd/8Rc= +github.com/getlantern/memhelper v0.0.0-20220104170102-df557102babd h1:qAbpkftDdMOaNF6NXNovpNhJrghIzIOMHGABu6zJgns= +github.com/getlantern/memhelper v0.0.0-20220104170102-df557102babd/go.mod h1:Ehpz4e44lXNZ0dPcvMedNR04P9ccngpp1B4Vk+0AQP0= github.com/getlantern/meta-scrubber v0.0.1 h1:WknyffbSpb5kEwDQ6lrN9+KohCGnqhs5zQfGk4sFRGo= github.com/getlantern/meta-scrubber v0.0.1/go.mod h1:nYmOMQXbex3emWMNbt/iDKTXE1q53x1dDxCspxjwxyY= github.com/getlantern/mitm v0.0.0-20231025115752-54d3e43899b7 h1:l9/yc7C0eaF4UQWgxAdtOnYKNfS74NMaInZ9vrlNKWI= @@ -419,8 +378,6 @@ github.com/getlantern/mockconn v0.0.0-20190708122800-637bd46d8034/go.mod h1:+F5G github.com/getlantern/mockconn v0.0.0-20191023022503-481dbcceeb58/go.mod h1:+F5GJ7qGpQ03DBtcOEyQpM30ix4BLswdaojecFtsdy8= github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848 h1:2MhMMVBTnaHrst6HyWFDhwQCaJ05PZuOv1bE2gN8WFY= github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848/go.mod h1:+F5GJ7qGpQ03DBtcOEyQpM30ix4BLswdaojecFtsdy8= -github.com/getlantern/msgpack v3.1.4+incompatible h1:/XyJ9HTt8W31F6DjgOv+Nk+qKeKcv9kxp6hOww4pj1k= -github.com/getlantern/msgpack v3.1.4+incompatible/go.mod h1:mUNR5C/x5E/8Jb8gU/lQd/ytwpKDhUvmGUj0STqInhc= github.com/getlantern/mtime v0.0.0-20170117193331-ba114e4a82b0/go.mod h1:u537FS7ld4Whf7h7/0ql/myAudWWBNgeRhgE9XXH4Pk= github.com/getlantern/mtime v0.0.0-20200228202836-084e1d8282b0/go.mod h1:GfzwugvtH7YcmNIrHHizeyImsgEdyL88YkdnK28B14c= github.com/getlantern/mtime v0.0.0-20200417132445-23682092d1f7 h1:03J6Cb42EG06lHgpOFGm5BOax4qFqlSbSeKO2RGrj2g= @@ -434,11 +391,13 @@ github.com/getlantern/nettest v1.0.0/go.mod h1:8wY0QwrdpkayCBQXjhZoJuwu2IHfp4UEr github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd/go.mod h1:wKdY0ikOgzrWSeB9UyBVKPRhjXQ+vTb+BPeJuypUuNE= github.com/getlantern/netx v0.0.0-20211206143627-7ccfeb739cbd h1:z5IehLDMqMwJ0oeFIaMHhySRU8r1lRMh7WQ0Wn0LioA= github.com/getlantern/netx v0.0.0-20211206143627-7ccfeb739cbd/go.mod h1:WEXF4pfIfnHBUAKwLa4DW7kcEINtG6wjUkbL2btwXZQ= +github.com/getlantern/notifier v0.0.0-20220715102006-f432f7e83f94 h1:cFjb6KVuCqSlyhj8uRfIcrbnKdP2uUpSjHZ9NCb4zHc= +github.com/getlantern/notifier v0.0.0-20220715102006-f432f7e83f94/go.mod h1:ohU+3pliOCY7Kirkbdzbe6mhBJj/gjx8nKHCD6l9GOo= github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= github.com/getlantern/ops v0.0.0-20220713155959-1315d978fff7/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= -github.com/getlantern/ops v0.0.0-20230519221840-1283e026181c h1:qcPAzA1ZDnwx618jAgQmxo6UvJkw2SkM1L4ofncmEhI= -github.com/getlantern/ops v0.0.0-20230519221840-1283e026181c/go.mod h1:g2ueCncOwWenlAr56Fh90FwsACkelqqtFUDLAHg1mng= +github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534 h1:3BwvWj0JZzFEvNNiMhCu4bf60nqcIuQpTYb00Ezm1ag= +github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534/go.mod h1:ZsLfOY6gKQOTyEcPYNA9ws5/XHZQFroxqCOhHjGcs9Y= github.com/getlantern/osversion v0.0.0-20230401075644-c2a30e73c451 h1:3Nn0AqIlImbb0TE4oFhr4BETBZhRUPo9GuebHvMzWB4= github.com/getlantern/osversion v0.0.0-20230401075644-c2a30e73c451/go.mod h1:kaUdXyKE1Y8bwPnlN7ChFXWnkADpL0zZrk8F0XbpKcc= github.com/getlantern/packetforward v0.0.0-20201001150407-c68a447b0360 h1:pijUoofaQcAM/8zbDzZM2LQ90kGVbKfnSAkFnQwLZZU= @@ -449,22 +408,23 @@ github.com/getlantern/preconn v1.0.0 h1:DsY3l/y/BJUj86WyaxXylbJnCC9QbKcc3D6js6rF github.com/getlantern/preconn v1.0.0/go.mod h1:i/AnXvx715Fq7HgZLlmQlw3sGfEkku8BQT5hLHMK4+k= github.com/getlantern/probe v0.0.0-20191107230642-ed284e08029a/go.mod h1:EPE0nd9YNS2FTIz+2EOkqojCuqaQlJ+fTiLPklsqe/E= github.com/getlantern/probe v0.0.0-20211216020459-69afa01c1c5c h1:bWusw8SYvl/iq+nHzSIe4oC7HdwaCN0KQEZkIHimamM= +github.com/getlantern/probe v0.0.0-20211216020459-69afa01c1c5c/go.mod h1:ditYj5obTW66F7c2nOTFUONMADmbzkzOsnkWfFWH3jk= github.com/getlantern/probednet v0.0.0-20190725133252-1cfdb2354b4d/go.mod h1:7sl7hPjPDAqXyxVx7mhrKfvb4oCX/ROhcs16w2EhWX8= github.com/getlantern/probednet v0.0.0-20211216020507-22fd9c1d3bf6 h1:8jg6OehdQr90Ybmyc68raXEqM/1hk8E7F2YAUfmcvzE= +github.com/getlantern/probednet v0.0.0-20211216020507-22fd9c1d3bf6/go.mod h1:noglym51kFdkZEV/WjiIzRKV6qwwTI9/vSAjeOI/zCU= +github.com/getlantern/profiling v0.0.0-20160317154340-2a15afbadcff h1:q5GcvgoGNRJ5yVCr5p0vUcXyYOGvTb+Lq/g4TW2HbfA= +github.com/getlantern/profiling v0.0.0-20160317154340-2a15afbadcff/go.mod h1:eHf4vTrd0oaXLtbz+zM28cfsX4ylva7hbM2zt4+axZo= github.com/getlantern/proxy/v3 v3.0.0-20231031142453-252ab678e6b7 h1:r6lDJ9gea/mIvI5QGQm6rzp/iEV/IpqdH+lSL3r0fgk= github.com/getlantern/proxy/v3 v3.0.0-20231031142453-252ab678e6b7/go.mod h1:SUQ8fQ0ImT7N7taLLU21HI7i9VR8j/bSxG/OiwSZM4s= -github.com/getlantern/proxybench v0.0.0-20220404140110-f49055cb86de h1:328hcuyQi8KGZr4GV2EtWllwBmS10oVGevwZEOk2dDE= -github.com/getlantern/proxybench v0.0.0-20220404140110-f49055cb86de/go.mod h1:kF5QcNhyCA0tpZ+MLVdeJb0bZpgXyMjR/CnPtaltlFU= github.com/getlantern/psmux v1.5.15-0.20200903210100-947ca5d91683/go.mod h1:GtXRvtMItoflWGLPE7GNq+AdL7BnmpaaNLtDQVD1XHU= github.com/getlantern/psmux v1.5.15 h1:VUCEk8MIsvAj90wNYRyY2fE9ZL4LIRhi1W5V9aycA9A= github.com/getlantern/psmux v1.5.15/go.mod h1:nyp/sr4uTbWpUh7Q2WovRb07LeLNUxDg8kAdS726FIw= -github.com/getlantern/quicwrapper v0.0.0-20230523101504-1ec066b7f869 h1:nx0sr8jXoEBbI0jHDOHIkM0z5dXotQRUSsE/e7lUGXw= -github.com/getlantern/quicwrapper v0.0.0-20230523101504-1ec066b7f869/go.mod h1:0k08ZBlQon93TrW6KmBLhLSz89qHQFR2LstGlIRgYo8= +github.com/getlantern/quicwrapper v0.0.0-20231117185542-d951689c4970 h1:ekTCi+m1TvUceBCT/6qz3/7fnljyytGW8waUW7dGQD4= +github.com/getlantern/quicwrapper v0.0.0-20231117185542-d951689c4970/go.mod h1:PEDykM1SIU8PTVRrShJ9/WVb/uBpGyl4XBgT+LKw+X4= github.com/getlantern/ratelimit v0.0.0-20220926192648-933ab81a6fc7 h1:47FJ5kTeXc3I1VPpi2hWW9I16/Y3K0cpUq/B7oWJGF8= github.com/getlantern/ratelimit v0.0.0-20220926192648-933ab81a6fc7/go.mod h1:OOqKCIkspqXtIWEex4uhH1H9l7NGekT9i3Hs591ZDk4= github.com/getlantern/reconn v0.0.0-20161128113912-7053d017511c h1:IkjF+RwRs8B/RsuD638eUFO2K/227OO2B1FLXGp17Ro= github.com/getlantern/reconn v0.0.0-20161128113912-7053d017511c/go.mod h1:kExwbqTx1krUnT9ohmXG3jayDTEBfxUKeoRzU6XucLw= -github.com/getlantern/redis-utils v0.0.0-20210823133122-d4f0e525e095/go.mod h1:1X9DhzvePQ89WjJRzY2DA5Xpgi7jI0i5E0rFjYxgPWI= github.com/getlantern/replica v0.14.2 h1:Ajnpvr4n5QUwudqYbZaf3GamONmr6L44bVxVomoGbtU= github.com/getlantern/replica v0.14.2/go.mod h1:nl+185Mu8FGrTosLNZ/9S1IDAxHdPDXnJQUJ7mAV37k= github.com/getlantern/rot13 v0.0.0-20220822172233-370767b2f782 h1:A1+qM0Dqm0no8A5qvWoTCFKME9Sa67xsJ1fcV13PvEY= @@ -475,12 +435,18 @@ github.com/getlantern/shortcut v0.0.0-20211026183428-bf59a137fdec h1:8TfjIMydnhB github.com/getlantern/shortcut v0.0.0-20211026183428-bf59a137fdec/go.mod h1:3VQ6qvEBehqDBNbEKfNtSjK6MR5ydOdjMPgKjKay7vo= github.com/getlantern/sqlite v0.0.0-20220301112206-cb2f8bc7cb56 h1:sAXnWKv8c28+G9fTitNopAYbIUswIWnOIOPXY+c/kGA= github.com/getlantern/sqlite v0.0.0-20220301112206-cb2f8bc7cb56/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4= -github.com/getlantern/sqlparser v0.0.0-20171012210704-a879d8035f3c/go.mod h1:wGjYYh1vSkRes1bNy+zio7cmmI9cLbST+H8eqnt5Mg4= +github.com/getlantern/sysproxy v0.0.0-20230319110552-63a8cacb7b9b h1:sn68kKTXZ6k7vyhPfYvjtoDSMufTlvvkAZ6Y+VJ25ZA= +github.com/getlantern/sysproxy v0.0.0-20230319110552-63a8cacb7b9b/go.mod h1:qjD2ty3qu7E12mJ2gVU/I2wCuebaLR5ePSQLY3eXrDQ= +github.com/getlantern/sysproxy v0.0.0-20231221104158-28ef14387f46 h1:HWGRjEa4hrpCIaGQEVoxdzN8bS9n/t4r5a3BQbx6wFQ= +github.com/getlantern/sysproxy v0.0.0-20231221104158-28ef14387f46/go.mod h1:sIaf1EQGv8d+l71iPiFYiLJtBp9fRy5wgO3mTFXSPzM= +github.com/getlantern/sysproxy v0.0.0-20231221104556-50cd1cf0478c h1:8CK4Y/RRnv+o2PHVh3/AHj9QtbwOEqtAleJpH2hOahQ= +github.com/getlantern/sysproxy v0.0.0-20231221104556-50cd1cf0478c/go.mod h1:sIaf1EQGv8d+l71iPiFYiLJtBp9fRy5wgO3mTFXSPzM= +github.com/getlantern/sysproxy v0.0.0-20231221104720-a50f1d2e3fe1 h1:llc0pmFRUoqhnkxauKNjA1t7VDpc3o2SXcxGjEK9L74= +github.com/getlantern/sysproxy v0.0.0-20231221104720-a50f1d2e3fe1/go.mod h1:sIaf1EQGv8d+l71iPiFYiLJtBp9fRy5wgO3mTFXSPzM= github.com/getlantern/telemetry v0.0.0-20230523155019-be7c1d8cd8cb h1:6XZ3Q4oD6A1Tjq6QLgzzQrdQ8FvulzW16HhNQOSECAM= github.com/getlantern/telemetry v0.0.0-20230523155019-be7c1d8cd8cb/go.mod h1:nGOdDc0aD/LRTaY2SGKQ7nsYcWFXrhgkrhIhJuYN614= github.com/getlantern/testify v0.0.0-20160317154340-2eeb3906e78f h1:R6iv+VzCrbxlBm2TcgyJi9c7tQguNXi9JmIvuUJKrdc= github.com/getlantern/testify v0.0.0-20160317154340-2eeb3906e78f/go.mod h1:uKKI9HSwZ4C8tx1vV+ovbG32Lw9LixtzPLNiS8U/ddA= -github.com/getlantern/testredis v0.0.0-20210610142259-c0995d455766/go.mod h1:f57SFFLkB+WLz10IoqovqksV6fTK91SuweVS21OEkdc= github.com/getlantern/timezone v0.0.0-20210901200113-3f9de9d360c9 h1:VTNjZxSuAHUzu13lYpEVB8gc3xz5hZePGNHG5enHYLY= github.com/getlantern/timezone v0.0.0-20210901200113-3f9de9d360c9/go.mod h1:7uvbzuoOr3uYGHZx5QWlI8/C52XEf/aTb/tJFEe41Ak= github.com/getlantern/tinywss v0.0.0-20211216020538-c10008a7d461 h1:3HOWV/uUGde6whvG7aoxIQlL43jHkmPupJsDCA569u0= @@ -496,22 +462,27 @@ github.com/getlantern/tlsresumption v0.0.0-20211216020551-6a3f901d86b9/go.mod h1 github.com/getlantern/tlsutil v0.2.0/go.mod h1:Vxsyr9DVnYwsqHaEzMYkg9fT8aBrnO2eI+gdICMQbQU= github.com/getlantern/tlsutil v0.5.3 h1:g1FjuG4/OTZe8kkbEmpSxvT9rXzYOG9jO4jHiDeQIxM= github.com/getlantern/tlsutil v0.5.3/go.mod h1:lVgvr4nxuQ1ocOho90UB6LnHFlpP16TXAGpHR8Z0QnI= +github.com/getlantern/trafficlog v1.0.0/go.mod h1:oaj53OJ67FEPsiKbQBz2dpYCnh8Yq4bBbww3C6vMgAQ= +github.com/getlantern/trafficlog v1.0.1 h1:eh8XzV4x2z+r7RHKFXJQrhrLtvnidlm83MAPRgrz+/I= +github.com/getlantern/trafficlog v1.0.1/go.mod h1:tGZtzBjGPecw/t+z+K9CQsCrFfHBh4aOCt70crGL6AI= +github.com/getlantern/trafficlog-flashlight v1.0.1 h1:X46WCXEsqR6PtexP6DKsdwr2mo8aiS/ltXkYtzj1S30= +github.com/getlantern/trafficlog-flashlight v1.0.1/go.mod h1:fMn3LcwRfIlD4COXKwZAhvsxgo+qIrbhvhHRff+dxxg= +github.com/getlantern/trafficlog-flashlight v1.0.4 h1:3qTJhpi4OoSq9Hsx35bikZjdAwy51FKt5/R2fxRxyiw= +github.com/getlantern/trafficlog-flashlight v1.0.4/go.mod h1:DRAWJE17ViFLQ3RSKmtAo+ga3xZnHJV0N49hPyJpzN8= github.com/getlantern/uuid v1.1.2-0.20190507182000-5c9436b8c718/go.mod h1:uX10hOzZUUDR+oYNSIks+RcozOEiwTNC/K2rw9SUi1k= github.com/getlantern/uuid v1.2.0 h1:pGrGaCV7XEaG6lvjWkwf8Y92BjB/9yFmkKsNFpRQ7rc= github.com/getlantern/uuid v1.2.0/go.mod h1:uX10hOzZUUDR+oYNSIks+RcozOEiwTNC/K2rw9SUi1k= -github.com/getlantern/vtime v0.0.0-20160810174823-dc1e573cf991/go.mod h1:Sfa815JjnYX/fxcE/nHKxyanK/2Iy+6FbMO4/ou3gWw= github.com/getlantern/waitforserver v1.0.1 h1:xBjqJ3GgEk9JMWnDgRSiNHXINi6Lv2tGNjJR0hCkHFY= github.com/getlantern/waitforserver v1.0.1/go.mod h1:K1oSA8lNKgQ9iC00OFpMfMNm4UMrsxoGCdHf0NT9LGs= -github.com/getlantern/wal v0.0.0-20220217194315-e4eac848dbd1/go.mod h1:emAPVd2NRdPkbqAInyWVD6s/AltbTRvKdHXlEhDXX4M= +github.com/getlantern/winsvc v0.0.0-20160824205134-8bb3a5dbcc1d h1:ptkLncSALmQuD24bNB6TIBvWQ2q1XpUs0HzqE9f+RJs= +github.com/getlantern/winsvc v0.0.0-20160824205134-8bb3a5dbcc1d/go.mod h1:bbt0iMT4LOQxNCEtmxJmPtNZk+mRp0CXkqK9kab/0r4= github.com/getlantern/withtimeout v0.0.0-20160829163843-511f017cd913 h1:YK3YNyTsa+1BPWOoN0F79rrjHyfNx4MAoFEvzwQU+dY= github.com/getlantern/withtimeout v0.0.0-20160829163843-511f017cd913/go.mod h1:bwttrA0oacoHdL476F60prypY1oC++WLtVexumgZozY= github.com/getlantern/yaml v0.0.0-20190801163808-0c9bb1ebf426 h1:lb2OElfhZzfgvNQym79ONvv4yvDh/gShHkLQI6qzriA= github.com/getlantern/yaml v0.0.0-20190801163808-0c9bb1ebf426/go.mod h1:SoTXbOvaDC1bH3QrlkU5kz/h12tU/hN54wSMUCdgEXs= -github.com/getlantern/zenodb v0.0.0-20220217194355-df46cc148a8c/go.mod h1:711qYcNux6PYvLgAG/YxKSlaTgASfgXkAhaSgvOKbW8= -github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= -github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= +github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= @@ -522,26 +493,28 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 h1:OyQmpAN302wAopDgwVjgs2HkFawP9ahIEqkUYz7V7CA= +github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916/go.mod h1:DADrR88ONKPPeSGjFp5iEN55Arx3fi2qXZeKCYDpbmU= +github.com/go-llsqlite/crawshaw v0.4.0 h1:L02s2jZBBJj80xm1VkkdyB/JlQ/Fi0kLbNHfXA8yrec= +github.com/go-llsqlite/crawshaw v0.4.0/go.mod h1:/YJdV7uBQaYDE0fwe4z3wwJIZBJxdYzd38ICggWqtaE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.0 h1:wx+BduGRXjIL6VPeeb7DRX+ii7sR/ch8DlRifHR589o= +github.com/go-logr/logr v1.4.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-redis/redis/v8 v8.10.0/go.mod h1:vXLTvigok0VtUX0znvbcEW1SOt4OA9CU1ZfnOtKOaiM= -github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= @@ -551,40 +524,30 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/gddo v0.0.0-20180823221919-9d8ff1c67be5/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= -github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 h1:KRMr9A3qfbVM7iV/WcLY/rL5LICqwMHLhwRXKu99fXw= -github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= +github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f h1:16RtHeWGkJMc80Etb8RPCcKevXGldr57+LOyZt8zOlg= +github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f/go.mod h1:ijRvpgDJDI262hYq/IQVYgf8hd8IHUs93Ol0kvMBAx4= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/geo v0.0.0-20200319012246-673a6f80352d h1:C/hKUcHT483btRbeGkrRjJz+Zbcj8audldIi9tRJDCc= github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20170918230701-e5d664eb928e/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -594,146 +557,129 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f h1:pDhu5sgp8yJlEF/g6osliIIpF9K4F5jvkULXa4daRDQ= -github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU= +github.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190309154008-847fc94819f9/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jaffee/commandeer v0.6.0 h1:YI44XLWcJN21euhh32sZW8vM/tljPYxhsXIfEPkQKcs= github.com/jaffee/commandeer v0.6.0/go.mod h1:kCwfuSvZ2T0NVEr3LDSo6fDUgi0xSBnAVDdkOKTtpLQ= github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmcvetta/randutil v0.0.0-20150817122601-2bb1b664bcff/go.mod h1:ddfPX8Z28YMjiqoaJhNBzWHapTHXejnB5cDCUWDwriw= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4 h1:nwOc1YaOrYJ37sEBrtWZrdqzK22hiJs3GpDmP3sR2Yw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= +github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= +github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.4/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= -github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/reedsolomon v1.9.9 h1:qCL7LZlv17xMixl55nq2/Oa1Y86nfO8EqDfv2GHND54= -github.com/klauspost/reedsolomon v1.9.9/go.mod h1:O7yFFHiQwDR6b2t63KPUpccPtNdp5ADgh1gg4fd12wo= +github.com/klauspost/reedsolomon v1.12.0 h1:I5FEp3xSwVCcEh3F5A7dofEfhXdF/bWhQWPH+XwBFno= +github.com/klauspost/reedsolomon v1.12.0/go.mod h1:EPLZJeh4l27pUGC3aXOjheaoh1I9yut7xTURiW3LQ9Y= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo= github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-sqlite3 v1.14.11 h1:gt+cp9c0XGqe9S/wAHTL3n/7MqY+siPWgWJgqdsFrzQ= +github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -745,29 +691,29 @@ github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Cl github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-server-timing v1.0.1 h1:f00/aIe8T3MrnLhQHu3tSWvnwc5GV/p5eutuu3hF/tE= github.com/mitchellh/go-server-timing v1.0.1/go.mod h1:Mo6GKi9FSLwWFAMn3bqVPWe20y5ri5QGQuO9D9MCOxk= +github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA= -github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/montanaflynn/stats v0.5.0 h1:2EkzeTSqBB4V4bJwWrt5gIIrZmpJBcoIRGS2kWLgzmk= github.com/montanaflynn/stats v0.5.0/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.3 h1:F8446DrvIF5V5smZfZ8K9nrmmix0AFgevPdLruGOmzk= +github.com/montanaflynn/stats v0.6.3/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= @@ -777,100 +723,97 @@ github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= +github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/oschwald/geoip2-golang v1.5.0/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s= github.com/oschwald/geoip2-golang v1.8.0 h1:KfjYB8ojCEn/QLqsDU0AzrJ3R5Qa9vFlx3z6SLNcKTs= github.com/oschwald/geoip2-golang v1.8.0/go.mod h1:R7bRvYjOeaoenAp9sKRS8GX5bJWcZ0laWO5+DauEktw= -github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= -github.com/oxtoacart/emsort v0.0.0-20160911032127-e467347e3354/go.mod h1:IQ2AliaPIeFz7bCSZl4NkBSh+JKdYqrjoSkE+tTH7P4= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.2/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.12 h1:44l88ehTZAUGW4VlO1QC4zkilL99M6Y9MXNwEs0uzP8= github.com/pierrec/lz4/v4 v4.1.12/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= -github.com/pion/dtls/v2 v2.2.6/go.mod h1:t8fWJCIquY5rlQZwA2yWxUS1+OCrAdXrhVKXB5oD/wY= -github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= -github.com/pion/ice/v2 v2.3.5 h1:Y8D/ZT+H4mo2DOl3YbCz5+FoXlYSYnziSJWWcvy4oOU= -github.com/pion/ice/v2 v2.3.5/go.mod h1:MloU1ypbcE3WBbETCkGw6rx9RcfeHdaBqsaB08R2tlI= -github.com/pion/interceptor v0.1.17 h1:prJtgwFh/gB8zMqGZoOgJPHivOwVAp61i2aG61Du/1w= -github.com/pion/interceptor v0.1.17/go.mod h1:SY8kpmfVBvrbUzvj2bsXz7OJt5JvmVNZ+4Kjq7FcwrI= +github.com/pion/dtls/v2 v2.2.8 h1:BUroldfiIbV9jSnC6cKOMnyiORRWrWWpV11JUyEu5OA= +github.com/pion/dtls/v2 v2.2.8/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw= +github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E= +github.com/pion/interceptor v0.1.25 h1:pwY9r7P6ToQ3+IF0bajN0xmk/fNw/suTgaTdlwTDmhc= +github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= github.com/pion/logging v0.2.1/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/mdns v0.0.7 h1:P0UB4Sr6xDWEox0kTVxF0LmQihtCbSAdW0H2nEgkA3U= -github.com/pion/mdns v0.0.7/go.mod h1:4iP2UbeFhLI/vWju/bw6ZfwjJzk0z8DNValjGxR/dD8= +github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= +github.com/pion/mdns v0.0.9 h1:7Ue5KZsqq8EuqStnpPWV33vYYEH0+skdDN5L7EiEsI4= +github.com/pion/mdns v0.0.9/go.mod h1:2JA5exfxwzXiCihmxpTKgFUpiQws2MnipoPK09vecIc= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.10 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc= github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= -github.com/pion/rtp v1.7.13 h1:qcHwlmtiI50t1XivvoawdCGTP4Uiypzfrsap+bijcoA= -github.com/pion/rtp v1.7.13/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.13 h1:+EQijuisKwm/8VBs8nWllr0bIndR7Lf7cZG200mpbNo= +github.com/pion/rtcp v1.2.13/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.3 h1:VEHxqzSVQxCkKDSHro5/4IUUG1ea+MFdqR2R3xSpNU8= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= -github.com/pion/sctp v1.8.7 h1:JnABvFakZueGAn4KU/4PSKg+GWbF6QWbKTWZOSGJjXw= -github.com/pion/sctp v1.8.7/go.mod h1:g1Ul+ARqZq5JEmoFy87Q/4CePtKnTJ1QCL9dBBdN6AU= +github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= +github.com/pion/sctp v1.8.9 h1:TP5ZVxV5J7rz7uZmbyvnUvsn7EJ2x/5q9uhsTtXbI3g= +github.com/pion/sctp v1.8.9/go.mod h1:cMLT45jqw3+jiJCrtHVwfQLnfR0MGZ4rgOJwUOIqLkI= github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= -github.com/pion/srtp/v2 v2.0.15 h1:+tqRtXGsGwHC0G0IUIAzRmdkHvriF79IHVfZGfHrQoA= -github.com/pion/srtp/v2 v2.0.15/go.mod h1:b/pQOlDrbB0HEH5EUAQXzSYxikFbNcNuKmF8tM0hCtw= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.3.1/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= github.com/pion/stun v0.3.2/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= -github.com/pion/stun v0.4.0/go.mod h1:QPsh1/SbXASntw3zkkrIk3ZJVKz4saBY2G7S10P3wCw= -github.com/pion/stun v0.5.2/go.mod h1:TNo1HjyjaFVpMZsvowqPeV8TfwRytympQC0//neaksA= -github.com/pion/stun v0.6.0 h1:JHT/2iyGDPrFWE8NNC15wnddBN8KifsEDw8swQmrEmU= -github.com/pion/stun v0.6.0/go.mod h1:HPqcfoeqQn9cuaet7AOmB5e5xkObu9DwBdurwLKO9oA= +github.com/pion/stun v0.3.3/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/transport v0.8.6/go.mod h1:nAmRRnn+ArVtsoNuwktvAD+jrjSD7pA+H3iRmZwdUno= github.com/pion/transport v0.8.8/go.mod h1:lpeSM6KJFejVtZf8k0fgeN7zE73APQpTF83WvA1FVP8= +github.com/pion/transport v0.8.9/go.mod h1:lpeSM6KJFejVtZf8k0fgeN7zE73APQpTF83WvA1FVP8= github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40= github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= -github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= -github.com/pion/transport/v2 v2.0.2/go.mod h1:vrz6bUbFr/cjdwbnxq8OdDDzHf7JJfGsIRkxfpZoTA0= -github.com/pion/transport/v2 v2.1.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlDuQdctTThQ= -github.com/pion/transport/v2 v2.2.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlDuQdctTThQ= -github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/turn v1.3.5/go.mod h1:zGPB7YYB/HTE9MWn0Sbznz8NtyfeVeanZ834cG/MXu0= -github.com/pion/turn v1.3.7 h1:/nyM2XrlZILD7KKfnh0oYEBTRG5JlbH21ibjluRoCeo= -github.com/pion/turn v1.3.7/go.mod h1:js0LBFqMcKAlaWAXoYqNjefGI7kfJCrkCBfHGuTToXE= -github.com/pion/turn/v2 v2.1.0 h1:5wGHSgGhJhP/RpabkUb/T9PdsAjkGLS6toYz5HNzoSI= -github.com/pion/turn/v2 v2.1.0/go.mod h1:yrT5XbXSGX1VFSF31A3c1kCNB5bBZgk/uu5LET162qs= -github.com/pion/udp/v2 v2.0.1/go.mod h1:B7uvTMP00lzWdyMr/1PVZXtV3wpPIxBRd4Wl6AksXn8= -github.com/pion/webrtc/v3 v3.2.6 h1:6pHQacytdvCbWSJT1IHMi6d67FuAEu9jEQ98GqKNgJU= -github.com/pion/webrtc/v3 v3.2.6/go.mod h1:+//AwYJLlhHRyoNyuRUBs7Pw1jyZHCxQCuu2ZUNSBaw= +github.com/pion/turn v1.4.0 h1:7NUMRehQz4fIo53Qv9ui1kJ0Kr1CA82I81RHKHCeM80= +github.com/pion/turn v1.4.0/go.mod h1:aDSi6hWX/hd1+gKia9cExZOR0MU95O7zX9p3Gw/P2aU= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.4 h1:2xn8rduI5W6sCZQkEnIUDAkrBQNl2eYIBCHMZ3QMmP8= +github.com/pion/turn/v2 v2.1.4/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.2.23 h1:GbqEuxBbVLFhXk0GwxKAoaIJYiEa9TyoZPEZC+2HZxM= +github.com/pion/webrtc/v3 v3.2.23/go.mod h1:1CaT2fcZzZ6VZA+O1i9yK2DU4EOcXVvSbWG9pr5jefs= github.com/pivotal-cf-experimental/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:AbOpFa7UXCGaV+aq9tvFdSHEhmcb8uO6nKZdYhKsT1I= +github.com/pivotal-cf-experimental/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:4+wzrM70C+Ky5iZiA6lNV5J48jnGmu8YcbmuVWdlt5s= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -878,6 +821,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -888,7 +833,6 @@ github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= @@ -908,48 +852,51 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.34.0 h1:OvOJ9LFjTySgwOTYUZmNoq0FzVicP8YujpV0kB7m2lU= -github.com/quic-go/quic-go v0.34.0/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= +github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= +github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.40.0 h1:GYd1iznlKm7dpHD7pOVpUvItgMPo/jrMgDWZhMCecqw= +github.com/quic-go/quic-go v0.40.0/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/reflog/minisentinel v0.0.0-20210817104530-e0dd88cb8bc6/go.mod h1:UdPuN3+X0Rvf3yJ++7j0zj4P8EaI6YwQJS+JbBk2o8k= github.com/refraction-networking/utls v0.0.0-20190415193640-32987941ebd3/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0= github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0= github.com/refraction-networking/utls v1.3.3 h1:f/TBLX7KBciRyFH3bwupp+CE4fzoYKCirhdRcC490sw= github.com/refraction-networking/utls v1.3.3/go.mod h1:DlecWW1LMlMJu+9qpzzQqdHDT/C2LAe03EdpLUz/RL8= -github.com/retailnext/hllpp v1.0.0/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rickar/props v0.0.0-20170718221555-0b06aeb2f037/go.mod h1:F1p8BNM4IXv2UcptwSp8HJOapKurodd/PYu1D6Gtn9Y= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/shadowsocks/go-shadowsocks2 v0.1.5 h1:PDSQv9y2S85Fl7VBeOMF9StzeXZyK1HakRm86CUbr28= github.com/shadowsocks/go-shadowsocks2 v0.1.5/go.mod h1:AGGpIoek4HRno4xzyFiAtLHkOpcoznZEkAccaI/rplM= -github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= -github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= -github.com/siddontang/goredis v0.0.0-20180423163523-0b4019cbd7b7/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= -github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= @@ -961,20 +908,24 @@ github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8/go.mod h1:P5HUIBuIWK github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -985,19 +936,15 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= -github.com/templexxx/cpu v0.0.1/go.mod h1:w7Tb+7qgcAlIyX4NhLuDKt78AHA5SzPmq0Wj6HiEnnk= -github.com/templexxx/cpu v0.0.8 h1:va6GebSxedVdR5XEyPJD49t94p5ZsjWO6Wh/PfbmZnc= -github.com/templexxx/cpu v0.0.8/go.mod h1:w7Tb+7qgcAlIyX4NhLuDKt78AHA5SzPmq0Wj6HiEnnk= -github.com/templexxx/xorsimd v0.4.1 h1:iUZcywbOYDRAZUasAs2eSCUW8eobuZDy0I9FJiORkVg= -github.com/templexxx/xorsimd v0.4.1/go.mod h1:W+ffZz8jJMH2SXwuKu9WhygqBMbFnp14G2fqEr8qaNo= +github.com/templexxx/cpu v0.1.0 h1:wVM+WIJP2nYaxVxqgHPD4wGA2aJ9rvrQRV8CvFzNb40= +github.com/templexxx/cpu v0.1.0/go.mod h1:w7Tb+7qgcAlIyX4NhLuDKt78AHA5SzPmq0Wj6HiEnnk= +github.com/templexxx/xorsimd v0.4.2 h1:ocZZ+Nvu65LGHmCLZ7OoCtg8Fx8jnHKK37SjvngUoVI= +github.com/templexxx/xorsimd v0.4.2/go.mod h1:HgwaPoDREdi6OnULpSfxhzaiiSUY4Fi3JPn1wpt28NI= github.com/ti-mo/conntrack v0.3.0 h1:572/72R9la2FVvO6CbsLiCmR48U3pgCvIlLKoUrExDU= github.com/ti-mo/conntrack v0.3.0/go.mod h1:tPSYNx21TnjxGz99pLD/lAN4fuEViaJZz+pliMqnovk= github.com/ti-mo/netfilter v0.3.1 h1:+ZTmeTx+64Jw2N/1gmqm42kruDWjQ90SMjWEB1e6VDs= @@ -1007,174 +954,127 @@ github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EU github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tkuchiki/go-timezone v0.2.0 h1:yyZVHtQRVZ+wvlte5HXvSpBkR0dPYnPEIgq9qqAqltk= github.com/tkuchiki/go-timezone v0.2.0/go.mod h1:b1Ean9v2UXtxSq4TZF0i/TU9NuoWa9hOzOKoGCV2zqY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= -github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/vharitonsky/iniflags v0.0.0-20180513140207-a33cd0b5f3de/go.mod h1:irMhzlTz8+fVFj6CH2AN2i+WI5S6wWFtK3MBCIxIpyI= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc h1:R83G5ikgLMxrBvLh22JhdfI8K6YXEPHx5P03Uu3DRs4= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vulcand/oxy v1.4.2 h1:KibUVdKrwy7eXR3uHS2pYoZ9dCzKVcgDNHD2jkPZmxU= +github.com/vulcand/oxy v1.4.2/go.mod h1:Yq8OBb0XWU/7nPSglwUH5LS2Pcp4yvad8SVayobZbSo= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20211228015320-b4f792c43cd0/go.mod h1:qLb2Itmdcp7KPa5KZKvhE9U1q5bYSOmgeOckF/H2rQA= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= +github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/xtaci/smux v1.5.10/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= github.com/xtaci/smux v1.5.24 h1:77emW9dtnOxxOQ5ltR+8BbsX1kzcOxQ5gB+aaV9hXOY= github.com/xtaci/smux v1.5.24/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= -github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= -github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= -github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= -gitlab.com/yawning/edwards25519-extra.git v0.0.0-20211229043746-2f91fcc9fbdb h1:qRSZHsODmAP5qDvb3YsO7Qnf3TRiVbGxNG/WYnlM4/o= -gitlab.com/yawning/edwards25519-extra.git v0.0.0-20211229043746-2f91fcc9fbdb/go.mod h1:gvdJuZuO/tPZyhEV8K3Hmoxv/DWud5L4qEQxfYjEUTo= -gitlab.com/yawning/obfs4.git v0.0.0-20220904064028-336a71d6e4cf h1:k9czJST0Jvc6fnz4Jp1sxRmA4dSuiWFq+DVpxLZP5yM= -gitlab.com/yawning/obfs4.git v0.0.0-20220904064028-336a71d6e4cf/go.mod h1:9GcM8QNU9/wXtEEH2q8bVOnPI7FtIF6VVLzZ1l6Hgf8= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k= go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= +go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/arch v0.0.0-20190909030613-46d78d1859ac/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20231006135142-2b44d11868fe h1:lrXv4yHeD9FA8PSJATWowP1QvexpyAPWmPia+Kbzql8= golang.org/x/mobile v0.0.0-20231006135142-2b44d11868fe/go.mod h1:BrnXpEObnFxpaT75Jo9hsCazwOWcp7nVIa8NNuH5cuA= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1185,52 +1085,45 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1241,15 +1134,14 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1257,204 +1149,127 @@ golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190516110030-61b9204099cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200427175716-29b57079015a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200929083018-4d22bbb62b3c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210608053332-aa57babbf139/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.0.0-20170921000349-586095a6e407/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170918111702-1e559d0a00ee/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a h1:a2MQQVoTo96JC9PMGtGBymLp7+/RzpFc2yX/9WfFg1c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= +google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -1463,22 +1278,14 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/vmihailenco/msgpack.v2 v2.9.1 h1:kb0VV7NuIojvRfzwslQeP3yArBqJHW9tOl4t38VS1jM= -gopkg.in/vmihailenco/msgpack.v2 v2.9.1/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1496,16 +1303,17 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= +howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= +modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= +modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +zombiezen.com/go/sqlite v0.13.1 h1:qDzxyWWmMtSSEH5qxamqBFmqA2BLSSbtODi3ojaE02o= +zombiezen.com/go/sqlite v0.13.1/go.mod h1:Ht/5Rg3Ae2hoyh1I7gbWtWAl89CNocfqeb/aAMTkJr4= diff --git a/installer-resources-lantern/.packaged-lantern.yaml b/installer-resources-lantern/.packaged-lantern.yaml new file mode 100644 index 000000000..dab396ad3 --- /dev/null +++ b/installer-resources-lantern/.packaged-lantern.yaml @@ -0,0 +1 @@ +startupurl: diff --git a/installer-resources-lantern/darwin/Lantern.app_template/Contents/Info.plist b/installer-resources-lantern/darwin/Lantern.app_template/Contents/Info.plist new file mode 100644 index 000000000..aefb1adc0 --- /dev/null +++ b/installer-resources-lantern/darwin/Lantern.app_template/Contents/Info.plist @@ -0,0 +1,27 @@ + + + + + CFBundleExecutable + Lantern + CFBundleIconFile + app.icns + CFBundleIdentifier + com.getlantern.lantern + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Lantern + CFBundlePackageType + APPL + CFBundleSignature + WRUN + + LSUIElement + 1 + NSHighResolutionCapable + True + + diff --git a/installer-resources-lantern/darwin/Lantern.app_template/Contents/PkgInfo b/installer-resources-lantern/darwin/Lantern.app_template/Contents/PkgInfo new file mode 100644 index 000000000..3e3578b93 --- /dev/null +++ b/installer-resources-lantern/darwin/Lantern.app_template/Contents/PkgInfo @@ -0,0 +1 @@ +APPLLANTERN \ No newline at end of file diff --git a/installer-resources-lantern/darwin/Lantern.app_template/Contents/Resources/app.icns b/installer-resources-lantern/darwin/Lantern.app_template/Contents/Resources/app.icns new file mode 100644 index 000000000..3934730dc Binary files /dev/null and b/installer-resources-lantern/darwin/Lantern.app_template/Contents/Resources/app.icns differ diff --git a/installer-resources-lantern/darwin/dmgbackground.png b/installer-resources-lantern/darwin/dmgbackground.png new file mode 100644 index 000000000..c58d361d2 Binary files /dev/null and b/installer-resources-lantern/darwin/dmgbackground.png differ diff --git a/installer-resources-lantern/darwin/dmgbackground.svg b/installer-resources-lantern/darwin/dmgbackground.svg new file mode 100644 index 000000000..8fb0ad6e4 --- /dev/null +++ b/installer-resources-lantern/darwin/dmgbackground.svg @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer-resources-lantern/darwin/dmgbackground_versioned.svg b/installer-resources-lantern/darwin/dmgbackground_versioned.svg new file mode 100644 index 000000000..8fb0ad6e4 --- /dev/null +++ b/installer-resources-lantern/darwin/dmgbackground_versioned.svg @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer-resources-lantern/darwin/lantern.dmg.json b/installer-resources-lantern/darwin/lantern.dmg.json new file mode 100644 index 000000000..56ec6dac9 --- /dev/null +++ b/installer-resources-lantern/darwin/lantern.dmg.json @@ -0,0 +1,10 @@ +{ + "title": "Lantern __VERSION__", + "icon": "../../Lantern.app/Contents/Resources/app.icns", + "background": "dmgbackground.png", + "icon-size": 100, + "contents": [ + { "x": 143, "y": 192, "type": "file", "path": "../../Lantern.app" }, + { "x": 467, "y": 192, "type": "link", "path": "/Applications" } + ] +} diff --git a/installer-resources-lantern/darwin/lantern_versioned.dmg.json b/installer-resources-lantern/darwin/lantern_versioned.dmg.json new file mode 100644 index 000000000..1c1a3428a --- /dev/null +++ b/installer-resources-lantern/darwin/lantern_versioned.dmg.json @@ -0,0 +1,10 @@ +{ + "title": "Lantern ", + "icon": "../../Lantern.app/Contents/Resources/app.icns", + "background": "dmgbackground.png", + "icon-size": 100, + "contents": [ + { "x": 143, "y": 192, "type": "file", "path": "../../Lantern.app" }, + { "x": 467, "y": 192, "type": "link", "path": "/Applications" } + ] +} diff --git a/installer-resources-lantern/lantern.yaml b/installer-resources-lantern/lantern.yaml new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/installer-resources-lantern/lantern.yaml @@ -0,0 +1 @@ + diff --git a/installer-resources-lantern/linux/deb-copyright b/installer-resources-lantern/linux/deb-copyright new file mode 100644 index 000000000..fd93d6a1d --- /dev/null +++ b/installer-resources-lantern/linux/deb-copyright @@ -0,0 +1,9 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Lantern +Upstream-Contact: Lantern Team +Source: https://github.com/getlantern/lantern +Disclaimer: This package is not part of Debian or Ubuntu. + +Files: * +Copyright: 2010-2015 Brave New Software Project, Inc. +License: /usr/share/common-licenses/Apache-2.0 diff --git a/installer-resources-lantern/linux/icon128x128on.png b/installer-resources-lantern/linux/icon128x128on.png new file mode 100644 index 000000000..79a57de2c Binary files /dev/null and b/installer-resources-lantern/linux/icon128x128on.png differ diff --git a/installer-resources-lantern/linux/lantern.desktop b/installer-resources-lantern/linux/lantern.desktop new file mode 100644 index 000000000..0fc6bd315 --- /dev/null +++ b/installer-resources-lantern/linux/lantern.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=lantern +Exec=lantern +Icon=lantern + diff --git a/installer-resources-lantern/linux/lantern.sh b/installer-resources-lantern/linux/lantern.sh new file mode 100755 index 000000000..e02edf110 --- /dev/null +++ b/installer-resources-lantern/linux/lantern.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Lantern wrapper. +# Copyright (c) 2015. Lantern Team . + +# Lantern could probably use this LANTERN_WRAPPER env var in the future. +export LANTERN_WRAPPER=$(readlink -f "$0") + +echo "Running installation script..." +LANTERN_WRAPPER_DIR=$(dirname "$LANTERN_WRAPPER") + +# This is the original Lantern binary that came with the installer, it's +# probably out of date. +LANTERN_SOURCE_BINARY=$LANTERN_WRAPPER_DIR/lantern-binary + +# This is a packaged yaml config file allowing us to include configuration +# in the package outside of the binary itself to enable configuration +# that is still compatible with auto-updates. +LANTERN_SOURCE_YAML=$LANTERN_WRAPPER_DIR/.packaged-lantern.yaml + +# This is the file containing bootstrap chained servers at first run +LANTERN_YAML=$LANTERN_WRAPPER_DIR/lantern.yaml + +LANTERN_USER_DIRECTORY=$HOME/.lantern +LANTERN_SOURCE_BINARY_HASH=$LANTERN_USER_DIRECTORY/bin/lantern.sha1 +LANTERN_USER_BINARY=$LANTERN_USER_DIRECTORY/bin/lantern + +# Checking if the source Lantern binary had any change. +if [ -f $LANTERN_SOURCE_BINARY_HASH ]; then + # If the checksum does not match then it probably means that the source + # binary got updated. See https://github.com/getlantern/lantern/issues/2670. + sha1sum -c $LANTERN_SOURCE_BINARY_HASH || rm -f $LANTERN_USER_BINARY; +else + # This was an old version that didn't saved verification sums. + rm -f $LANTERN_USER_BINARY; +fi + +# A local copy of the Lantern binary is preferred since it has the current +# user's writing permissions and it can be updated. +if [ ! -f $LANTERN_USER_BINARY ]; then + # If there is no local copy, we use the original Lantern binary. + mkdir -p $LANTERN_USER_DIRECTORY/bin + echo "Copying files" + cp $LANTERN_SOURCE_BINARY $LANTERN_USER_BINARY + echo "Copying packaged yaml" + cp $LANTERN_SOURCE_YAML $LANTERN_USER_DIRECTORY + echo "Copying lantern.yaml" + cp $LANTERN_YAML $LANTERN_USER_DIRECTORY + sha1sum $LANTERN_SOURCE_BINARY > $LANTERN_SOURCE_BINARY_HASH + chmod +x $LANTERN_USER_BINARY +fi + +# Running Lantern with the given arguments. +exec "$LANTERN_USER_BINARY" "$@" diff --git a/installer-resources-lantern/tools/av-whitelist/kaspersky.sh b/installer-resources-lantern/tools/av-whitelist/kaspersky.sh new file mode 100755 index 000000000..f9c46e9a6 --- /dev/null +++ b/installer-resources-lantern/tools/av-whitelist/kaspersky.sh @@ -0,0 +1,32 @@ +#! /usr/bin/env sh + +if [[ "$#" -ne 1 ]]; then + echo "kaspersky.sh " + exit 1 +fi + +set -e + +URL=ftp://wl-GetLantern:EJaI3vVe9@whitelist1.kaspersky-labs.com +VERSION=$1 +XML=lantern-$VERSION.xml +PATTERN=$XML* + +out=$(echo ls $PATTERN | ftp $URL) +if [[ $out =~ $PATTERN.[[:digit:]]+.processed ]]; then + echo "******$XML was processed by Kaspersky, force submitting" +elif [[ $out =~ $XML$ ]]; then + echo "******$XML was submitted to Kaspersky, force submitting" +elif [[ -z $out ]]; then + echo "Submitting $XML" +else + echo "******WARNING: Abnormal state on Kaspersky FTP server, force submitting: \n$out" +fi + +SCRIPT=$(greadlink -f "$0") +SCRIPTPATH=$(dirname "$SCRIPT") +FULLXMLPATH=$SCRIPTPATH/$XML +sed s/""/$VERSION/g $SCRIPTPATH/kaspersky.xml.tmpl > $FULLXMLPATH +ftp -u $URL/$XML $FULLXMLPATH +rm $FULLXMLPATH +exit $? diff --git a/installer-resources-lantern/tools/av-whitelist/kaspersky.xml.tmpl b/installer-resources-lantern/tools/av-whitelist/kaspersky.xml.tmpl new file mode 100644 index 000000000..222783006 --- /dev/null +++ b/installer-resources-lantern/tools/av-whitelist/kaspersky.xml.tmpl @@ -0,0 +1,9 @@ + + + + https://s3.amazonaws.com/lantern/lantern-installer-.exe + + + https://s3.amazonaws.com/lantern/lantern-installer--manoto.exe + + diff --git a/installer-resources-lantern/tools/create_or_update_release.rb b/installer-resources-lantern/tools/create_or_update_release.rb new file mode 100755 index 000000000..c76bc371c --- /dev/null +++ b/installer-resources-lantern/tools/create_or_update_release.rb @@ -0,0 +1,75 @@ +#!/usr/bin/env ruby + +if ARGV.length < 4 + abort "\nUsage create_or_update_release.rb $user $GH_repo $TAG $FILE_NAME\n\n" +end + +require 'net/https' +require "json" +require 'octokit' +require 'mime/types' + +user=ARGV[0] +repo=ARGV[1] +tag=ARGV[2] +filenames=ARGV.slice(3, 1000) + +gh_token=ENV['GH_TOKEN'] + +@client = Octokit::Client.new(:access_token => gh_token) + +# First create the release if necessary +uri = URI("https://api.github.com") +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Post.new("/repos/#{user}/#{repo}/releases") +request["Accept"] = "application/vnd.github.v3+json" +request["Authorization"] = "token #{gh_token}" +request.body = { + "tag_name" => tag, + "target_commitish" => "", + "name" => tag, + "body" => "", + "draft" => false, + "prerelease" => false, +}.to_json + +response = http.request(request) + +puts filenames +if response.body.include? "already_exists" + puts "* Release already exists. No worries, we'll just delete existing assets..." + releases = @client.releases "#{user}/#{repo}" + target_release = releases.select { |r| r.tag_name == tag }[0] + + if not target_release.empty? + assets = @client.release_assets(target_release.url) + assets_to_delete = assets.select { |a| filenames.include?(a.name) } + assets_to_delete.each do |asset| + $stderr.puts "* Removing #{asset.name} (#{asset.content_type})..." + @client.delete_release_asset(asset.url) + end + end +else + abort response.body unless response.is_a?(Net::HTTPSuccess) + puts "Created release" + # Wait for release to actually appear + sleep(5) + releases = @client.releases "#{user}/#{repo}" + target_release = releases.select { |r| r.tag_name == tag }[0] +end + +if target_release.empty? + abort "Target release didn't exist, please try again" +end + +# Then upload the assets +filenames.each do |filename| + begin + ct = MIME::Types.of(filename).first.to_str || "application/octet-stream" + @client.upload_asset(target_release.url, filename, {content_type: ct}) + rescue Octokit::UnprocessableEntity + abort "\nAsset already exists? Should never happen\n" + end +end diff --git a/installer-resources-lantern/tools/notarize-darwin.py b/installer-resources-lantern/tools/notarize-darwin.py new file mode 100755 index 000000000..d402e5ba4 --- /dev/null +++ b/installer-resources-lantern/tools/notarize-darwin.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 + +import argparse +import json +import os +import subprocess +import sys +import time + + +description = """ +Notarizes a dmg file and staples the resulting notarization ticket to the file. The arguments are +passed to the xcrun notarytool utility, so more info can be obtained through 'xcrun notarytool --help'. + +Requires Python 3. +""" + +epilog = """ +Note that if the password is provided through the keychain, you may be prompted to enter your login +password on every request to Apple's servers. A workaround is to pass the password in via something +like: + --password `security find-generic-password -s -w` +""" + + +# Time between calls to Apple's servers, polling for results of notarization. +POLL_WAIT_SECONDS = 30 + +# Max consecutive failures allowed. +POLL_MAX_RETRIES = 3 + +DEV_NULL = open(os.devnull, 'w') + +def print_stderr(*objects): + print("%s:" % os.path.basename(__file__), *objects, file=sys.stderr) + + +def get_notary_call(command, param_list): + + cmd = ["xcrun", "notarytool", command] + param_list + ["--output-format", "json"] + com_process = subprocess.run(cmd, text=True, capture_output=True) + + com_result = com_process.returncode + com_stdout = com_process.stdout + + if com_result != 0: + print_stderr(f"Error results: {com_process.stderr}") + print_stderr(f"{command} results: {com_stdout}") + + try: + output_json = json.loads(com_stdout) + return com_result, output_json + except json.decoder.JSONDecodeError as e: + print(com_stdout, file=sys.stderr) + print_stderr(f"Error running {command}, please check your credentials and inputs") + print(e) + raise e + + +def get_info(credentials, request_id): + try: + return get_notary_call("info",[ request_id, + "--apple-id", credentials["username"], + "--password", credentials["password"], + "--team-id", credentials["team-id"] + ] + ) + except json.decoder.JSONDecodeError as e: + print_stderr(f"Error fetching request info for {request_id}") + exit(1) + + +def upload_file(credentials, filepath): + try: + return get_notary_call("submit",[ + "--apple-id", credentials["username"], + "--password", credentials["password"], + "--team-id", credentials["team-id"], filepath] + ) + except json.decoder.JSONDecodeError as e: + print_stderr(f"Error uploading {filepath}") + exit(1) + + +def get_log(credentials, request_id): + try: + return get_notary_call("log",[ request_id, + "--apple-id", credentials["username"], + "--password", credentials["password"], + "--team-id", credentials["team-id"] + ] + ) + except json.decoder.JSONDecodeError as e: + print_stderr(f"Error fetching log for {request_id}") + exit(1) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description=description, + epilog=epilog, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("dmgfile") + parser.add_argument("-u", "--username", dest="username", required=True, + help="Apple ID used for the Apple Developer Program.") + parser.add_argument("-a", "--team-id ", dest="team_id", required=True, + help="Developer Team ID used for the Apple Developer Program.") + parser.add_argument("-p", "--password", dest="password", required=True, + help="May be provided through keychain or env var; see 'xcrun notarytool --help'.") + parser.add_argument("-t", "--max-wait-time", dest="max_wait_time", type=int, default=120, + help="The maximum amount of time (in minutes) to wait for a notarization result.") + args = parser.parse_args() + + validate_result = subprocess.call( + ["xcrun", "stapler", "validate", args.dmgfile], stdout=DEV_NULL, stderr=DEV_NULL) + if validate_result == 0: + print_stderr("file already has notarization ticket attached - nothing to do") + exit(0) + + print_stderr("uploading to notary servers...") + + credentials = { "username": args.username, + "password": args.password, + "team-id": args.team_id} + + upload_result, upload_json = upload_file(credentials, args.dmgfile) + message = upload_json.get("message") + + print_stderr(f"Upload process complete, message: {message}") + + if upload_result == 0: + print_stderr("upload complete") + request_id = upload_json.get("id") + if not request_id: + print_stderr("Request id not found in upload output, aborting") + exit(1) + + else: + + if "already been uploaded" in message: + print_stderr("already uploaded") + exit(1) + else: + print(upload_json, file=sys.stderr) + print_stderr("upload failed") + exit(upload_result) + + print_stderr("polling servers for result (this may take some time)...") + last_poll = time.time() + poll_end = time.time() + args.max_wait_time * 60 + consecutive_retries = 0 + processing_complete = False + while not processing_complete and time.time() < poll_end: + + print_stderr("polling results: ") + info_result, info_json = get_info(credentials, request_id) + + if info_result != 0: + consecutive_retries += 1 + if consecutive_retries >= POLL_MAX_RETRIES: + print(info_json, file=sys.stderr) + print_stderr("%d consecutive failures polling for status; giving up" % POLL_MAX_RETRIES) + exit(1) + time.sleep(POLL_WAIT_SECONDS) + continue + consecutive_retries = 0 + + status = info_json.get("status").lower() + if not status: + print(info_json, file=sys.stderr) + print_stderr("Status not present, malformed info response") + exit(1) + + if status == "success" or status == "accepted": + print_stderr("notarization succeeded") + processing_complete = True + + elif status == "invalid": + print_stderr("notarization failed") + + log_result, log_json = get_log(credentials, request_id) + issues = log_json.get("issues") + if not issues: + print_stderr("found no issues in log file") + print_stderr("request_id:", request_id) + print_stderr("issues:") + for issue in issues: + print(issue, file=sys.stderr) + exit(1) + + elif status == "in progress": + time.sleep(POLL_WAIT_SECONDS) + else: + print_stderr("Unknown Status in log") + print_stderr(info_json) + exit(1) + + print_stderr("pulling log file...") + + try: + log_result, log_json = get_log(credentials, request_id) + issues = info_json.get("issues") + + if issues is None or len(issues) == 0: + print_stderr("found no issues in log file") + else: + print_stderr("found issues in log file:") + for issue in issues: + print(issue, file=sys.stderr) + except Exception as e: + print(info_json, file=sys.stderr) + print_stderr("failed to retrieve log file", e) + + print_stderr("stapling notarization ticket to file") + staple_result = subprocess.call(["xcrun", "stapler", "staple", args.dmgfile]) + if staple_result != 0: + print_stderr("failed to staple notarization ticket") + exit(1) diff --git a/installer-resources-lantern/windows/.packaged-lantern.yaml b/installer-resources-lantern/windows/.packaged-lantern.yaml new file mode 100644 index 000000000..dab396ad3 --- /dev/null +++ b/installer-resources-lantern/windows/.packaged-lantern.yaml @@ -0,0 +1 @@ +startupurl: diff --git a/installer-resources-lantern/windows/lantern.ico b/installer-resources-lantern/windows/lantern.ico new file mode 100644 index 000000000..8bc3de85e Binary files /dev/null and b/installer-resources-lantern/windows/lantern.ico differ diff --git a/installer-resources-lantern/windows/lantern.nsi b/installer-resources-lantern/windows/lantern.nsi new file mode 100755 index 000000000..8dcc03d50 --- /dev/null +++ b/installer-resources-lantern/windows/lantern.nsi @@ -0,0 +1,195 @@ +Unicode true +Name "Lantern" + +# Installs Lantern and launches it +# See http://nsis.sourceforge.net/Run_an_application_shortcut_after_an_install + +AutoCloseWindow true + +!addplugindir nsis_plugins +!include "nsis_includes/nsProcess.nsh" + +# Use the modern ui +!include MUI.nsh +!include LogicLib.nsh +!include FileFunc.nsh + +!define MUI_ICON lantern.ico + +;Pages +!insertmacro MUI_PAGE_INSTFILES + + !define MUI_FINISHPAGE_RUN + !define MUI_FINISHPAGE_RUN_FUNCTION "RunLantern" +!insertmacro MUI_PAGE_FINISH + +;Languages +!insertmacro MUI_LANGUAGE "Farsi" +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "Czech" +!insertmacro MUI_LANGUAGE "Dutch" +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "German" +!insertmacro MUI_LANGUAGE "Korean" +!insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "Spanish" +!insertmacro MUI_LANGUAGE "Swedish" +!insertmacro MUI_LANGUAGE "TradChinese" +!insertmacro MUI_LANGUAGE "SimpChinese" +!insertmacro MUI_LANGUAGE "Slovak" + +# define name of installer +OutFile ${OUT_FILE} + +# define installation directory +InstallDir $APPDATA\Lantern + +# Request user permissions so that auto-updates will work with no prompt +RequestExecutionLevel user + +# start default section +Section + # Uninstall the previous version. This will also kill the process. + Call UninstallPrevious + ClearErrors + IfErrors 0 +2 + Abort "Error stopping previous Lantern version. Please stop it from the system tray and install again." + + # set the installation directory as the destination for the following actions + SetOutPath $INSTDIR + SetOverwrite on + + File ${APP_NAME} + File lantern.ico + File .packaged-lantern.yaml + File lantern.yaml + File /r data + File *.dll + + # Store installation folder + WriteRegStr HKCU "Software\Lantern" "" $INSTDIR + + WriteUninstaller "$INSTDIR\uninstall.exe" + + # Support uninstalling via Add/Remove programs + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "DisplayName" "Lantern" + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "DisplayIcon" "$INSTDIR\lantern.ico" + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "Publisher" "Brave New Software Project, Inc." + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "URLInfoAbout" "http://lantern.io" + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "DisplayVersion" "${VERSION}" + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + + CreateDirectory "$SMPROGRAMS\Lantern" + CreateShortCut "$SMPROGRAMS\Lantern\Lantern.lnk" "$INSTDIR\${APP_NAME}" "" "$INSTDIR\lantern.ico" 0 + CreateShortCut "$SMPROGRAMS\Lantern\Uninstall Lantern.lnk" "$INSTDIR\uninstall.exe" + CreateShortCut "$DESKTOP\Lantern.lnk" "$INSTDIR\${APP_NAME}" "" "$INSTDIR\lantern.ico" 0 + + # This is a bad registry entry created by old Lantern versions. + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "value" + + # Add a registry key to set -clear-proxy-settings. See https://github.com/getlantern/lantern/issues/2776 + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" \ + "Lantern" "$\"$INSTDIR\${APP_NAME}$\" -clear-proxy-settings" + + # Initialize Lantern to a point of having at lease one working proxy. + ExecWait '"$INSTDIR\${APP_NAME}" "-initialize" "-timeout" "30s"' $0 + + ${If} $0 != 0 + DetailPrint "Timed out initialize Lantern, continue anyway" + ${EndIf} + +SectionEnd +# end default section + +Function RunLantern + # Launch Lantern and initialize + ShellExecAsUser::ShellExecAsUser "" "$INSTDIR\${APP_NAME}" +FunctionEnd + +# Uninstall previous versions before installing the new one +Function UninstallPrevious + DetailPrint "Uninstalling previous version" + ReadRegStr $R0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" \ + "UninstallString" + StrCmp $R0 "" noprevious + + DetailPrint "Uninstalling $R0" + ClearErrors + ExecWait '$R0 /S -from-installer=true _?=$INSTDIR' ;Do not copy the uninstaller to a temp file + + IfErrors erroruninstalling done +noprevious: + DetailPrint "No previous version to uninstall" + Goto end +erroruninstalling: + DetailPrint "Error uninstalling previous at $R0" + Goto end +done: + DetailPrint "Successfully uninstalled $R0" +end: +FunctionEnd + +# start uninstaller section +Section "uninstall" + ${GetParameters} $R0 + ${GetOptions} $R0 "-from-installer=" $R1 + ${If} $R1 == "true" + DetailPrint "Not showing survey in call from installer" + ${Else} + DetailPrint "Showing uninstall survey -- not called from installer" + DetailPrint "Looking for uninstall survey in $INSTDIR\uninstall_url.txt" + ${If} ${FileExists} "$INSTDIR\uninstall_url.txt" + FileOpen $4 "$INSTDIR\uninstall_url.txt" r + FileRead $4 $5 + FileClose $4 + + ${If} $5 == "" + DetailPrint "No uninstall survey URL?" + ${Else} + DetailPrint "Found uninstall survey URL $5" + ExecShell "open" $5 + ${EndIf} + ${Else} + DetailPrint "No uninstall survey URL file - opening default" + ExecShell "open" "https://www.surveymonkey.com/r/chinese-unopened-uninstall" + ${EndIf} + + ${EndIf} + + # We need to kill the existing process because otherwise it will own the files we try to write to. + DetailPrint "Closing existing Lantern" + ${nsProcess::CloseProcess} "${APP_NAME}" $R0 + # Sleep for 1 second to process a chance to die and file to become writable + Sleep 1000 + + DetailPrint "Killed existing Lantern tasks" + + RMDir /r "$SMPROGRAMS\Lantern" + + Delete "$DESKTOP\Lantern.lnk" + + Delete "$INSTDIR\${APP_NAME}" + Delete "$INSTDIR\uninstall.exe" + Delete "$INSTDIR\lantern.ico" + Delete "$INSTDIR\.packaged-lantern.yaml" + Delete "$INSTDIR\lantern.yaml" + + # Remove uninstaller from Add/Remove programs + DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Lantern" + + # Don't run Lantern on startup. + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "Lantern" + ${nsProcess::Unload} +SectionEnd +# end uninstaller section diff --git a/installer-resources-lantern/windows/nsis_includes/nsProcess.nsh b/installer-resources-lantern/windows/nsis_includes/nsProcess.nsh new file mode 100644 index 000000000..9ef6098d2 --- /dev/null +++ b/installer-resources-lantern/windows/nsis_includes/nsProcess.nsh @@ -0,0 +1,28 @@ +!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess` + +!macro nsProcess::FindProcess _FILE _ERR + nsProcess::_FindProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + + +!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess` + +!macro nsProcess::KillProcess _FILE _ERR + nsProcess::_KillProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + +!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess` + +!macro nsProcess::CloseProcess _FILE _ERR + nsProcess::_CloseProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + + +!define nsProcess::Unload `!insertmacro nsProcess::Unload` + +!macro nsProcess::Unload + nsProcess::_Unload +!macroend diff --git a/installer-resources-lantern/windows/nsis_plugins/ShellExecAsUser.dll b/installer-resources-lantern/windows/nsis_plugins/ShellExecAsUser.dll new file mode 100644 index 000000000..2bf1d0c3d Binary files /dev/null and b/installer-resources-lantern/windows/nsis_plugins/ShellExecAsUser.dll differ diff --git a/installer-resources-lantern/windows/nsis_plugins/nsProcess.dll b/installer-resources-lantern/windows/nsis_plugins/nsProcess.dll new file mode 100644 index 000000000..2478624ee Binary files /dev/null and b/installer-resources-lantern/windows/nsis_plugins/nsProcess.dll differ diff --git a/internalsdk/android.go b/internalsdk/android.go index 9a50b656e..0286dd35c 100644 --- a/internalsdk/android.go +++ b/internalsdk/android.go @@ -11,7 +11,6 @@ import ( "sync" "time" - "github.com/getlantern/android-lantern/internalsdk/analytics" "github.com/getlantern/appdir" "github.com/getlantern/autoupdate" "github.com/getlantern/dnsgrab" @@ -28,6 +27,7 @@ import ( "github.com/getlantern/flashlight/v7/logging" "github.com/getlantern/flashlight/v7/ops" "github.com/getlantern/golog" + "github.com/getlantern/lantern-client/internalsdk/analytics" "github.com/getlantern/mtime" // import gomobile just to make sure it stays in go.mod diff --git a/internalsdk/replica.go b/internalsdk/replica.go index ad7abc696..184eb466b 100644 --- a/internalsdk/replica.go +++ b/internalsdk/replica.go @@ -15,14 +15,13 @@ import ( "github.com/getlantern/flashlight/v7/common" "github.com/getlantern/flashlight/v7/config" "github.com/getlantern/flashlight/v7/geolookup" - "github.com/getlantern/flashlight/v7/ops" "github.com/getlantern/flashlight/v7/proxied" replicaConfig "github.com/getlantern/replica/config" replicaServer "github.com/getlantern/replica/server" replicaService "github.com/getlantern/replica/service" - "github.com/getlantern/android-lantern/internalsdk/analytics" - "github.com/getlantern/android-lantern/internalsdk/doh" + "github.com/getlantern/lantern-client/internalsdk/analytics" + "github.com/getlantern/lantern-client/internalsdk/doh" "github.com/gorilla/mux" ) @@ -137,7 +136,7 @@ func (s *ReplicaServer) newHandler() (*replicaServer.HttpHandler, error) { input.RootUploadsDir = s.ConfigDir // XXX <16-12-21, soltzen> Those three flags make sure that uploads are not // saved to the torrent client, saved locally, or have any metadata - // generated for them. This decision is only for android-lantern to protect + // generated for them. This decision is only for lantern-client to protect // the privacy of uploaders input.AddUploadsToTorrentClient = false input.StoreUploadsLocally = false @@ -150,10 +149,6 @@ func (s *ReplicaServer) newHandler() (*replicaServer.HttpHandler, error) { input.GlobalConfig = optsFunc input.HttpClient.Transport = proxied.ParallelForIdempotent() input.ProcessCORSHeaders = common.ProcessCORS - input.InstrumentResponseWriter = func(w http.ResponseWriter, - label string) replicaServer.InstrumentedResponseWriter { - return ops.InitInstrumentedResponseWriter(w, label) - } input.HttpClient = &http.Client{ Transport: proxied.AsRoundTripper( func(req *http.Request) (*http.Response, error) { diff --git a/internalsdk/session_model.go b/internalsdk/session_model.go index 724bf9d98..25754c4d6 100644 --- a/internalsdk/session_model.go +++ b/internalsdk/session_model.go @@ -5,11 +5,11 @@ import ( "path/filepath" "strconv" - "github.com/getlantern/android-lantern/internalsdk/apimodels" - "github.com/getlantern/android-lantern/internalsdk/protos" "github.com/getlantern/errors" "github.com/getlantern/flashlight/v7/common" "github.com/getlantern/flashlight/v7/logging" + "github.com/getlantern/lantern-client/internalsdk/apimodels" + "github.com/getlantern/lantern-client/internalsdk/protos" "github.com/getlantern/pathdb" "github.com/getlantern/pathdb/minisql" ) diff --git a/lib/account/account.dart b/lib/account/account.dart index aad9669ab..fdd5a47cd 100644 --- a/lib/account/account.dart +++ b/lib/account/account.dart @@ -64,14 +64,13 @@ class AccountMenu extends StatelessWidget { inviteFriends(context); }, ), - if (Platform.isAndroid) - ListItemFactory.settingsItem( - icon: ImagePaths.devices, - content: 'Authorize Device for Pro'.i18n, - onTap: () { - authorizeDeviceForPro(context); - }, - ), + ListItemFactory.settingsItem( + icon: ImagePaths.devices, + content: 'Authorize Device for Pro'.i18n, + onTap: () { + authorizeDeviceForPro(context); + }, + ), ...commonItems(context) ]; } diff --git a/lib/account/device_linking/link_device.dart b/lib/account/device_linking/link_device.dart index bdd0dd8ba..af400ba11 100644 --- a/lib/account/device_linking/link_device.dart +++ b/lib/account/device_linking/link_device.dart @@ -16,7 +16,7 @@ class _LinkDeviceState extends State { @override void initState() { super.initState(); - sessionModel.requestLinkCode(); + if (Platform.isAndroid) sessionModel.requestLinkCode(); } @override diff --git a/lib/account/report_issue.dart b/lib/account/report_issue.dart index 4bcbc7651..1bda75306 100644 --- a/lib/account/report_issue.dart +++ b/lib/account/report_issue.dart @@ -1,5 +1,6 @@ import 'package:email_validator/email_validator.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; import 'package:lantern/common/ui/app_loading_dialog.dart'; bool isEmpty(value) => value == null || value == ''; @@ -197,7 +198,7 @@ class _ReportIssueState extends State { // For Android we have native dialog // Todo need to remove native dialog and use this one for Android & IOS - if (Platform.isIOS) { + if (Platform.isIOS || isDesktop()) { AppLoadingDialog.dismissLoadingDialog(context); } CDialog.showInfo( diff --git a/lib/account/settings.dart b/lib/account/settings.dart index 11199bf9a..41f187e33 100644 --- a/lib/account/settings.dart +++ b/lib/account/settings.dart @@ -2,6 +2,7 @@ import 'package:catcher_2/core/catcher_2.dart'; import 'package:intl/intl.dart'; import 'package:lantern/common/app_methods.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; import 'package:lantern/common/ui/app_loading_dialog.dart'; import 'package:lantern/i18n/localization_constants.dart'; import 'package:lantern/messaging/messaging_model.dart'; @@ -39,8 +40,10 @@ class Settings extends StatelessWidget { AppLoadingDialog.showLoadingDialog(context); await sessionModel.checkForUpdates(); AppLoadingDialog.dismissLoadingDialog(context); - } else { + } else if (Platform.isIOS) { AppMethods.openAppstore(); + } else { + await ffiCheckUpdates(); } } @@ -101,7 +104,7 @@ class Settings extends StatelessWidget { : const SizedBox(), ), //* Split tunneling - sessionModel.splitTunneling( + if (!isDesktop()) sessionModel.splitTunneling( (BuildContext context, bool value, Widget? child) => ListItemFactory.settingsItem( header: 'VPN'.i18n, diff --git a/lib/app.dart b/lib/app.dart index 44a86eef4..0c72a6c6f 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,5 +1,6 @@ import 'package:flutter/scheduler.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; import 'package:lantern/core/router/router.dart'; import 'package:lantern/messaging/messaging.dart'; @@ -32,18 +33,20 @@ class LanternApp extends StatelessWidget { // Since this notification is visible on all screens and we want the // animation state to remain consistent across screens, we put the animation // controller here at the app level since the app contains all screens. - sessionModel.networkAvailable - .addListener(toggleConnectivityWarningIfNecessary); - sessionModel.proxyAvailable - .addListener(toggleConnectivityWarningIfNecessary); - networkWarningAnimationController = AnimationController( - duration: shortAnimationDuration, - vsync: _TickerProviderImpl(), - ); - networkWarningAnimation = Tween(begin: 0.0, end: 1.0) - .animate(networkWarningAnimationController) - ..addListener(networkWarningAnimationChanged); - toggleConnectivityWarningIfNecessary(); + if (Platform.isAndroid) { + sessionModel.networkAvailable + .addListener(toggleConnectivityWarningIfNecessary); + sessionModel.proxyAvailable + .addListener(toggleConnectivityWarningIfNecessary); + networkWarningAnimationController = AnimationController( + duration: shortAnimationDuration, + vsync: _TickerProviderImpl(), + ); + networkWarningAnimation = Tween(begin: 0.0, end: 1.0) + .animate(networkWarningAnimationController) + ..addListener(networkWarningAnimationChanged); + toggleConnectivityWarningIfNecessary(); + } } final translations = Localization.ensureInitialized(); @@ -82,7 +85,9 @@ class LanternApp extends StatelessWidget { } return sessionModel.language( (context, lang, child) { - Localization.locale = lang; + if (!isDesktop()) { + Localization.locale = lang; + } return GlobalLoaderOverlay( overlayColor: Colors.black, overlayOpacity: 0.6, diff --git a/lib/common/common.dart b/lib/common/common.dart index 64a1b3506..d209650bc 100644 --- a/lib/common/common.dart +++ b/lib/common/common.dart @@ -27,7 +27,6 @@ export 'package:loader_overlay/loader_overlay.dart'; export 'package:provider/provider.dart'; export 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; export 'package:stop_watch_timer/stop_watch_timer.dart'; -export 'package:wakelock/wakelock.dart'; export 'add_nonbreaking_spaces.dart'; export 'disable_back_button.dart'; diff --git a/lib/common/common_desktop.dart b/lib/common/common_desktop.dart new file mode 100644 index 000000000..7e4582fe2 --- /dev/null +++ b/lib/common/common_desktop.dart @@ -0,0 +1,21 @@ +export 'dart:convert'; +export 'dart:ffi'; // For FFI + +export 'package:lantern/ffi.dart'; +export 'package:ffi/ffi.dart'; +export 'package:ffi/src/utf8.dart'; + +import 'dart:io' show Platform; + +bool isDesktop() { + return Platform.isMacOS || Platform.isLinux || Platform.isWindows; +} + +String systemTrayIcon(bool connected) { + if (connected) { + return Platform.isWindows ? 'assets/images/lantern_connected_32.ico' : + 'assets/images/lantern_connected_32.png'; + } + return Platform.isWindows ? 'assets/images/lantern_disconnected_32.ico' : + 'assets/images/lantern_disconnected_32.png'; +} \ No newline at end of file diff --git a/lib/common/ffi_list_subscriber.dart b/lib/common/ffi_list_subscriber.dart new file mode 100644 index 000000000..7ef97a8e8 --- /dev/null +++ b/lib/common/ffi_list_subscriber.dart @@ -0,0 +1,113 @@ +import 'dart:collection'; + +import 'common.dart'; +import 'common_desktop.dart'; +import 'list_subscriber.dart'; +import 'package:lantern/i18n/i18n.dart'; +import 'package:fixnum/fixnum.dart'; +import 'package:intl/intl.dart'; + +class FfiListNotifier extends SubscribedNotifier> { + FfiListNotifier( + path, + Pointer Function() ffiFunction, + T Function(Map json) fromJsonModel, + void Function() removeFromCache, { + bool details = false, + int Function(String key1, String key2)? compare, + T Function(Uint8List serialized)? deserialize, + }) : super(ChangeTrackingList(compare ?? sortNormally), removeFromCache) { + value.clearPaths(); + var result = jsonDecode(ffiFunction().toDartString()); + if (result is List) { + for (var item in result) { + var id = item['id']; + value.map[id] = fromJsonModel(item) as T; + } + } else if (result is Map) { + for (var key in result.keys) { + value.map[key] = fromJsonModel(result) as T; + } + } + cancel = () => {}; + } +} + +/// A ValueListenableBuilder that obtains a list of values by subscribing to a +/// path in the database. +class FfiListBuilder extends ValueListenableBuilder> { + FfiListBuilder( + String path, + ValueNotifier> notifier, + ValueWidgetBuilder> builder, + ) : super(valueListenable: notifier, builder: builder); + + @override + _FfiListBuilderState createState() => _FfiListBuilderState(); +} + +class _FfiListBuilderState + extends State>> { + late ChangeTrackingList value; + final _childNotifiers = HashMap>(); + + @override + void initState() { + super.initState(); + value = widget.valueListenable.value; + widget.valueListenable.addListener(_valueChanged); + } + + @override + void didUpdateWidget( + ValueListenableBuilder> oldWidget, + ) { + if (oldWidget.valueListenable != widget.valueListenable) { + oldWidget.valueListenable.removeListener(_valueChanged); + value = widget.valueListenable.value; + widget.valueListenable.addListener(_valueChanged); + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + widget.valueListenable.removeListener(_valueChanged); + super.dispose(); + } + + void _valueChanged() { + var newMap = widget.valueListenable.value; + var pathsChanged = + newMap.newPaths.isNotEmpty || newMap.deletedPaths.isNotEmpty; + var missingChildNotifier = false; + if (!pathsChanged) { + // we can take the optimized path and just notify the children + newMap.updatedPaths.forEach((path) { + var newValue = newMap.map[path]; + var foundChildNotifier = false; + var notifier = _childNotifiers[path]; + if (notifier != null) { + notifier.value = newValue; + foundChildNotifier = true; + } + missingChildNotifier = missingChildNotifier || !foundChildNotifier; + }); + if (!missingChildNotifier) { + // Only stop processing if we had notifiers for every updated value. + // If not, we'll fall through and update the whole list. + return; + } + } + + // Need to update the whole thing + setState(() { + value = widget.valueListenable.value; + }); + } + + @override + Widget build(BuildContext context) { + return widget.builder(context, value, widget.child); + } +} diff --git a/lib/common/ffi_subscriber.dart b/lib/common/ffi_subscriber.dart new file mode 100644 index 000000000..096b4a09c --- /dev/null +++ b/lib/common/ffi_subscriber.dart @@ -0,0 +1,85 @@ +import 'common.dart'; +import 'common_desktop.dart'; + +extension BoolParsing on String { + bool parseBool() { + return this.toLowerCase() == 'true'; + } +} + +class FfiValueNotifier extends SubscribedNotifier { + FfiValueNotifier( + Pointer Function() ffiFunction, + T? defaultValue, + void Function() removeFromCache, { + bool details = false, + T Function(Uint8List serialized)? deserialize, + }) : super(defaultValue, removeFromCache) { + if (defaultValue is int?) { + value = null; + //value = int.parse(ffiFunction().toDartString()) as T?; + } else if (defaultValue is String) { + value = ffiFunction().toDartString() as T?; + } else { + value = ffiFunction().toDartString().parseBool() as T?; + } + cancel = () => {}; + } +} + +/// A ValueListenableBuilder that obtains its single value by subscribing to a +/// path in the database. +class FfiValueBuilder extends ValueListenableBuilder { + FfiValueBuilder( + String path, + ValueNotifier notifier, + ValueWidgetBuilder builder, + ) : super( + valueListenable: notifier, + builder: (BuildContext context, T? value, Widget? child) => + value == null ? const SizedBox() : builder(context, value, child), + ); + + @override + _FfiValueBuilderState createState() => + _FfiValueBuilderState(); +} + +class _FfiValueBuilderState + extends State> { + T? value; + + @override + void initState() { + super.initState(); + value = widget.valueListenable.value; + widget.valueListenable.addListener(_valueChanged); + } + + @override + void didUpdateWidget(ValueListenableBuilder oldWidget) { + if (oldWidget.valueListenable != widget.valueListenable) { + oldWidget.valueListenable.removeListener(_valueChanged); + value = widget.valueListenable.value; + widget.valueListenable.addListener(_valueChanged); + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + widget.valueListenable.removeListener(_valueChanged); + super.dispose(); + } + + void _valueChanged() { + setState(() { + value = widget.valueListenable.value; + }); + } + + @override + Widget build(BuildContext context) { + return widget.builder(context, value, widget.child); + } +} diff --git a/lib/common/model.dart b/lib/common/model.dart index 46e4f39db..4b0b64a31 100644 --- a/lib/common/model.dart +++ b/lib/common/model.dart @@ -1,18 +1,26 @@ import 'dart:collection'; +import 'package:lantern/common/ffi_subscriber.dart'; +import 'package:lantern/common/ffi_list_subscriber.dart'; import 'package:lantern/messaging/messaging.dart'; +import 'common_desktop.dart'; abstract class Model { late MethodChannel methodChannel; late ModelEventChannel _updatesChannel; final Map _singleValueNotifierCache = HashMap(); + final Map _ffiValueNotifierCache = + HashMap(); final Map _listNotifierCache = HashMap(); Event? event; + final Map _ffiListNotifierCache = HashMap(); Model(String name) { - methodChannel = MethodChannel('${name}_method_channel'); - _updatesChannel = ModelEventChannel('${name}_event_channel'); + if (Platform.isAndroid) { + methodChannel = MethodChannel('${name}_method_channel'); + _updatesChannel = ModelEventChannel('${name}_event_channel'); + } } Future get(String path) async { @@ -45,6 +53,24 @@ abstract class Model { return result; } + ValueListenableBuilder ffiValueBuilder( + String path, + Pointer Function() ffiFunction, { + T? defaultValue, + required ValueWidgetBuilder builder, + bool details = false, + T Function(Uint8List serialized)? deserialize, + }) { + var notifier = ffiValueNotifier( + ffiFunction, + path, + defaultValue, + details: details, + deserialize: deserialize, + ); + return FfiValueBuilder(path, notifier, builder); + } + ValueListenableBuilder subscribedSingleValueBuilder( String path, { T? defaultValue, @@ -61,6 +87,23 @@ abstract class Model { return SubscribedSingleValueBuilder(path, notifier, builder); } + ValueNotifier ffiValueNotifier( + Pointer Function() ffiFunction, + String path, + T? defaultValue, { + bool details = false, + T Function(Uint8List serialized)? deserialize, + }) { + return FfiValueNotifier( + ffiFunction, + defaultValue, + () { + _ffiValueNotifierCache.remove(path); + }, + ); + } + + ValueNotifier singleValueNotifier( String path, T? defaultValue, { @@ -133,6 +176,61 @@ abstract class Model { return result; } + ValueListenableBuilder> ffiListBuilder( + String path, + Pointer Function() ffiFunction, + T Function(Map json) fromJsonModel, { + required ValueWidgetBuilder>> builder, + bool details = false, + int Function(String key1, String key2)? compare, + T Function(Uint8List serialized)? deserialize, + }) { + var notifier = ffiListNotifier( + path, + ffiFunction, + fromJsonModel, + details: details, + compare: compare, + deserialize: deserialize, + ); + return FfiListBuilder( + path, + notifier, + (BuildContext context, ChangeTrackingList value, Widget? child) => + builder( + context, + value.map.entries.map((e) => PathAndValue(e.key, e.value)), + child, + ), + ); + } + + ValueNotifier> ffiListNotifier( + String path, + Pointer Function() ffiFunction, + T Function(Map json) fromJsonModel, { + bool details = false, + int Function(String key1, String key2)? compare, + T Function(Uint8List serialized)? deserialize, + }) { + var result = _ffiListNotifierCache[path] as FfiListNotifier?; + if (result == null) { + result = FfiListNotifier( + path, + ffiFunction, + fromJsonModel, + () { + _ffiListNotifierCache.remove(path); + }, + details: details, + compare: compare, + deserialize: deserialize, + ); + _ffiListNotifierCache[path] = result; + } + return result; + } + ValueListenableBuilder listChildBuilder( BuildContext context, String path, { diff --git a/lib/common/session_model.dart b/lib/common/session_model.dart index b1e162063..4d825f368 100644 --- a/lib/common/session_model.dart +++ b/lib/common/session_model.dart @@ -1,6 +1,11 @@ import 'package:lantern/replica/common.dart'; +import 'package:lantern/i18n/i18n.dart'; +import 'package:fixnum/fixnum.dart'; +import 'package:intl/intl.dart'; import 'common.dart'; +import 'common_desktop.dart'; +import 'dart:convert' show utf8; final sessionModel = SessionModel(); @@ -14,34 +19,53 @@ class SessionModel extends Model { late final EventManager eventManager; SessionModel() : super('session') { - eventManager = EventManager('lantern_event_channel'); - eventManager.subscribe(Event.All, (eventType, map) { - switch (eventType) { - case Event.NoNetworkAvailable: - networkAvailable.value = false; - break; - case Event.NetworkAvailable: - networkAvailable.value = true; - break; - default: - break; - } - }); - - isStoreVersion = singleValueNotifier( - 'storeVersion', - false, - ); - isPlayVersion = singleValueNotifier( - 'playVersion', - false, - ); - /*Note - * Make proxyAvailable default value to true on IOS it take some to get data from go side - * So show banner only if proxyAvailable is false - */ - proxyAvailable = singleValueNotifier('hasSucceedingProxy', true); - country = singleValueNotifier('geo_country_code', 'US'); + if (Platform.isAndroid) { + eventManager = EventManager('lantern_event_channel'); + eventManager.subscribe(Event.All, (eventType, map) { + switch (eventType) { + case Event.NoNetworkAvailable: + networkAvailable.value = false; + break; + case Event.NetworkAvailable: + networkAvailable.value = true; + break; + default: + break; + } + }); + + isStoreVersion = singleValueNotifier( + 'storeVersion', + false, + ); + isPlayVersion = singleValueNotifier( + 'playVersion', + false, + ); + /*Note + * Make proxyAvailable default value to true on IOS it take some to get data from go side + * So show banner only if proxyAvailable is false + */ + proxyAvailable = singleValueNotifier('hasSucceedingProxy', true); + country = singleValueNotifier('geo_country_code', 'US'); + } else { + country = ffiValueNotifier(ffiLang, 'lang', 'US'); + isPlayVersion = ffiValueNotifier( + ffiPlayVersion, + 'isPlayVersion', + false, + ); + isStoreVersion = ffiValueNotifier( + ffiStoreVersion, + 'isStoreVersion', + false, + ); + proxyAvailable = ffiValueNotifier( + ffiHasSucceedingProxy, + 'hasSucceedingProxy', + false, + ); + } } ValueNotifier networkAvailable = ValueNotifier(true); @@ -51,12 +75,28 @@ class SessionModel extends Model { late ValueNotifier country; Widget proUser(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder('prouser', builder: builder); + if (Platform.isAndroid) { + return subscribedSingleValueBuilder('prouser', builder: builder); + } + return ffiValueBuilder( + 'prouser', + defaultValue: false, + ffiProUser, + builder: builder, + ); } Widget developmentMode(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'developmentMode', + builder: builder, + ); + } + return ffiValueBuilder( 'developmentMode', + defaultValue: false, + ffiDevelopmentMode, builder: builder, ); } @@ -81,8 +121,16 @@ class SessionModel extends Model { } Widget acceptedTermsVersion(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder('accepted_terms_version', - builder: builder, defaultValue: 0); + if (Platform.isAndroid) { + return subscribedSingleValueBuilder('accepted_terms_version', + builder: builder, defaultValue: 0); + } + return ffiValueBuilder( + 'accepted_terms_version', + defaultValue: 0, + ffiAcceptedTermsVersion, + builder: builder, + ); } Widget forceCountry(ValueWidgetBuilder builder) { @@ -116,32 +164,72 @@ class SessionModel extends Model { } Widget language(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder('lang', builder: builder); + if (Platform.isAndroid) { + return subscribedSingleValueBuilder('lang', builder: builder); + } + return ffiValueBuilder( + 'lang', + defaultValue: 'en', + ffiLang, + builder: builder, + ); } Widget emailAddress(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'emailAddress', + builder: builder, + ); + } + return ffiValueBuilder( 'emailAddress', + ffiEmailAddress, + defaultValue: '', builder: builder, ); } Widget expiryDate(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - 'expirydatestr', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'expirydatestr', + builder: builder, + ); + } + return ffiValueBuilder( + 'emailAddress', + ffiEmailAddress, + defaultValue: '', builder: builder, ); } Widget referralCode(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'referral', + builder: builder, + ); + } + return ffiValueBuilder( 'referral', + ffiReferral, + defaultValue: '', builder: builder, ); } Widget deviceId(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder('deviceid', builder: builder); + if (Platform.isAndroid) { + return subscribedSingleValueBuilder('deviceid', builder: builder); + } + return ffiValueBuilder( + 'referral', + ffiReferral, + defaultValue: '', + builder: builder, + ); } Widget devices(ValueWidgetBuilder builder) { @@ -223,25 +311,49 @@ class SessionModel extends Model { } Widget selectedTab(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - '/selectedTab', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + '/selectedTab', + defaultValue: TAB_VPN, + builder: builder, + ); + } + return ffiValueBuilder( + 'selectedTab', + ffiSelectedTab, defaultValue: TAB_VPN, builder: builder, ); } Widget replicaAddr(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'replicaAddr', + defaultValue: '', + builder: builder, + ); + } + return ffiValueBuilder( 'replicaAddr', + ffiReplicaAddr, defaultValue: '', builder: builder, ); } Widget countryCode(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - 'geo_country_code', - defaultValue: '', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'geo_country_code', + defaultValue: '', + builder: builder, + ); + } + return ffiValueBuilder( + 'lang', + defaultValue: 'US', + ffiLang, builder: builder, ); } @@ -255,17 +367,33 @@ class SessionModel extends Model { } Widget chatEnabled(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'chatEnabled', + defaultValue: false, + builder: builder, + ); + } + return ffiValueBuilder( 'chatEnabled', + ffiChatEnabled, defaultValue: false, builder: builder, ); } Widget sdkVersion(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'sdkVersion', + defaultValue: 'unknown', + builder: builder, + ); + } + return ffiValueBuilder( 'sdkVersion', defaultValue: 'unknown', + ffiSdkVersion, builder: builder, ); } @@ -276,15 +404,60 @@ class SessionModel extends Model { .then((enabled) => enabled == true); } - Future checkForUpdates() { - return methodChannel.invokeMethod('checkForUpdates'); + Future checkForUpdates() async { + if (Platform.isAndroid) { + return methodChannel.invokeMethod('checkForUpdates'); + } + await ffiCheckUpdates(); + return; + } + + Plan planFromJson(Map item) { + final formatCurrency = new NumberFormat.simpleCurrency(); + var id = item['id']; + var plan = Plan(); + plan.id = id; + plan.description = item["description"]; + plan.oneMonthCost = formatCurrency + .format(item["expectedMonthlyPrice"]["usd"] / 100) + .toString(); + plan.totalCost = formatCurrency.format(item["usdPrice"] / 100).toString(); + plan.totalCostBilledOneTime = + formatCurrency.format(item["usdPrice"] / 100).toString() + + ' ' + + 'billed_one_time'.i18n; + plan.bestValue = item["bestValue"] ?? false; + plan.usdPrice = Int64(item["usdPrice"]); + return plan; + } + + PaymentMethod paymentMethodFromJson(Map item) { + final formatCurrency = new NumberFormat.simpleCurrency(); + final List methods = []; + for (var m in item["desktop"]) { + var paymentMethod = PaymentMethod(); + paymentMethod.method = m["method"]; + return paymentMethod; + } + return PaymentMethod(); } Widget plans({ required ValueWidgetBuilder>> builder, }) { - return subscribedListBuilder( + if (Platform.isAndroid) { + return subscribedListBuilder( + '/plans/', + builder: builder, + deserialize: (Uint8List serialized) { + return Plan.fromBuffer(serialized); + }, + ); + } + return ffiListBuilder( '/plans/', + ffiPlans, + planFromJson, builder: builder, deserialize: (Uint8List serialized) { return Plan.fromBuffer(serialized); @@ -295,12 +468,20 @@ class SessionModel extends Model { Widget paymentMethods({ required ValueWidgetBuilder>> builder, }) { - return subscribedListBuilder( + if (Platform.isAndroid) { + return subscribedListBuilder( + '/paymentMethods/', + builder: builder, + deserialize: (Uint8List serialized) { + return PaymentMethod.fromBuffer(serialized); + }, + ); + } + return ffiListBuilder( '/paymentMethods/', + ffiPaymentMethods, + paymentMethodFromJson, builder: builder, - deserialize: (Uint8List serialized) { - return PaymentMethod.fromBuffer(serialized); - }, ); } @@ -314,6 +495,11 @@ class SessionModel extends Model { Future reportIssue( String email, String issue, String description) async { + if (isDesktop()) { + await ffiReportIssue(email.toNativeUtf8(), issue.toNativeUtf8(), + description.toNativeUtf8()); + return; + } return methodChannel.invokeMethod('reportIssue', { 'email': email, 'issue': issue, @@ -354,9 +540,17 @@ class SessionModel extends Model { } Widget deviceLinkingCode(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - 'devicelinkingcode', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'devicelinkingcode', + defaultValue: '', + builder: builder, + ); + } + return ffiValueBuilder( + 'deviceLinkingCode', defaultValue: '', + ffiDeviceLinkingCode, builder: builder, ); } @@ -390,6 +584,17 @@ class SessionModel extends Model { }).then((value) => value as String); } + Future paymentRedirect( + String planID, + String email, + String provider, + String deviceName, + ) async { + final resp = await ffiPaymentRedirect(planID.toNativeUtf8(), provider.toNativeUtf8(), + email.toNativeUtf8(), deviceName.toNativeUtf8()); + return resp.toDartString(); + } + Future submitStripePayment( String planID, String email, @@ -397,13 +602,17 @@ class SessionModel extends Model { String expDate, String cvc, ) async { - return methodChannel.invokeMethod('submitStripePayment', { - 'planID': planID, - 'email': email, - 'cardNumber': cardNumber, - 'expDate': expDate, - 'cvc': cvc, - }).then((value) => value as String); + if (Platform.isAndroid) { + return methodChannel.invokeMethod('submitStripePayment', { + 'planID': planID, + 'email': email, + 'cardNumber': cardNumber, + 'expDate': expDate, + 'cvc': cvc, + }).then((value) => value as String); + } + await ffiPurchase(planID.toNativeUtf8(), email.toNativeUtf8(), cardNumber.toNativeUtf8(), expDate.toNativeUtf8(), + cvc.toNativeUtf8()); } Future submitFreekassa( @@ -438,8 +647,16 @@ class SessionModel extends Model { } Widget splitTunneling(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - '/splitTunneling', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + '/splitTunneling', + builder: builder, + ); + } + return ffiValueBuilder( + 'splitTunneling', + ffiSplitTunneling, + defaultValue: false, builder: builder, ); } diff --git a/lib/common/ui/custom/fullscreen_video_viewer.dart b/lib/common/ui/custom/fullscreen_video_viewer.dart index 598b69eeb..9f6812f36 100644 --- a/lib/common/ui/custom/fullscreen_video_viewer.dart +++ b/lib/common/ui/custom/fullscreen_video_viewer.dart @@ -76,7 +76,6 @@ class FullScreenVideoViewerState } void handleButtonTap() { - Wakelock.toggle(enable: controller!.value.isPlaying); if (controller!.value.isPlaying) { setState(() { controller!.pause(); @@ -94,15 +93,11 @@ class FullScreenVideoViewerState void dispose() { controller?.dispose(); controller = null; - Wakelock.disable(); super.dispose(); } @override bool ready() { - Wakelock.toggle( - enable: controller?.value.isPlaying ?? false, - ); return controller != null; } diff --git a/lib/core/router/router.dart b/lib/core/router/router.dart index 69924f8bb..917b8fcfd 100644 --- a/lib/core/router/router.dart +++ b/lib/core/router/router.dart @@ -1,9 +1,8 @@ import 'package:auto_route/auto_route.dart'; +import 'package:lantern/common/common.dart'; import 'package:lantern/common/ui/transitions.dart'; import 'package:lantern/core/router/router.gr.dart'; - - @AutoRouterConfig( replaceInRouteName: 'Page,Route,Screen', ) diff --git a/lib/core/router/router.gr.dart b/lib/core/router/router.gr.dart index a7af9a6d8..843356121 100644 --- a/lib/core/router/router.gr.dart +++ b/lib/core/router/router.gr.dart @@ -76,11 +76,9 @@ abstract class $AppRouter extends _i41.RootStackRouter { ); }, Account.name: (routeData) { - final args = - routeData.argsAs(orElse: () => const AccountArgs()); return _i41.AutoRoutePage( routeData: routeData, - child: _i2.AccountMenu(key: args.key), + child: const _i2.AccountMenu(), ); }, AddViaChatNumber.name: (routeData) { @@ -453,31 +451,16 @@ class AccountManagementArgs { /// generated route for /// [_i2.AccountMenu] -class Account extends _i41.PageRouteInfo { - Account({ - _i43.Key? key, - List<_i41.PageRouteInfo>? children, - }) : super( +class Account extends _i41.PageRouteInfo { + const Account({List<_i41.PageRouteInfo>? children}) + : super( Account.name, - args: AccountArgs(key: key), initialChildren: children, ); static const String name = 'Account'; - static const _i41.PageInfo page = - _i41.PageInfo(name); -} - -class AccountArgs { - const AccountArgs({this.key}); - - final _i43.Key? key; - - @override - String toString() { - return 'AccountArgs{key: $key}'; - } + static const _i41.PageInfo page = _i41.PageInfo(name); } /// generated route for diff --git a/lib/custom_bottom_bar.dart b/lib/custom_bottom_bar.dart index 19db4901f..34c114c6a 100644 --- a/lib/custom_bottom_bar.dart +++ b/lib/custom_bottom_bar.dart @@ -16,9 +16,7 @@ class CustomBottomBar extends StatelessWidget { @override Widget build(BuildContext context) { - return messagingModel - .getOnBoardingStatus((context, hasBeenOnboarded, child) { - return sessionModel.chatEnabled((context, chatEnabled, _) { + return sessionModel.chatEnabled((context, chatEnabled, _) { return sessionModel.replicaAddr((context, replicaAddr, child) { final replicaEnabled = replicaAddr != ''; @@ -57,14 +55,13 @@ class CustomBottomBar extends StatelessWidget { currentIndex, chatEnabled, replicaEnabled, - hasBeenOnboarded!, + true, isDevelop, isTesting, replicaAddr, ), ); }); - }); }); } @@ -250,7 +247,7 @@ class CustomBottomBar extends StatelessWidget { label: 'Account'.i18n, icon: ImagePaths.account, addBadge: (child) { - if (hasBeenOnboarded != true) { + if (hasBeenOnboarded == true) { return child; } diff --git a/lib/custom_bottom_item.dart b/lib/custom_bottom_item.dart index 7158a066d..440bd601c 100644 --- a/lib/custom_bottom_item.dart +++ b/lib/custom_bottom_item.dart @@ -1,4 +1,5 @@ import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; class CustomBottomBarItem extends StatelessWidget { const CustomBottomBarItem({ @@ -51,7 +52,13 @@ class CustomBottomBarItem extends StatelessWidget { ), ), onTap: (() { - sessionModel.setSelectedTab(name); + if (Platform.isAndroid) { + sessionModel.setSelectedTab(name); + } else { + final tab = name.toNativeUtf8(); + setSelectTab(tab); + context.pushRoute(Home()); + } }), child: Container( decoration: ShapeDecoration( diff --git a/lib/ffi.dart b/lib/ffi.dart new file mode 100644 index 000000000..5166c5acf --- /dev/null +++ b/lib/ffi.dart @@ -0,0 +1,87 @@ +import 'dart:ffi' as ffi; // For FFI +import 'package:lantern/common/common.dart'; +import 'package:ffi/ffi.dart'; +import 'package:ffi/src/utf8.dart'; +import 'dart:convert'; +import 'dart:io'; + +typedef start_func = ffi.Pointer Function(); // FFI fn signature +typedef Start = ffi.Pointer Function(); // Dart fn signature + +typedef pro_func = ffi.Pointer Function(); +typedef ProFunc = ffi.Pointer Function(); + +typedef sysproxy_func = ffi.Pointer Function(); // FFI fn signature +typedef SysProxy = ffi.Pointer Function(); // Dart fn signature + +typedef selecttab_func = ffi.Void Function(ffi.Pointer); +typedef SelectTab = void Function(ffi.Pointer); + +typedef purchase_func = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer); +typedef Purchase = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer); + +typedef payment_redirect_func = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer); +typedef PaymentRedirect = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer); + +typedef checkupdates_func = ffi.Pointer Function(); +typedef CheckUpdates = ffi.Pointer Function(); + +typedef reportissue_func = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer); +typedef DoReportIssue = ffi.Pointer Function(ffi.Pointer, ffi.Pointer, ffi.Pointer); + +typedef selectedtab_func = ffi.Pointer Function(); // FFI fn signature +typedef SelectedTab = ffi.Pointer Function(); // Dart fn signature + +typedef setting_func = ffi.Pointer Function(); +typedef Setting = ffi.Pointer Function(); + +String dir = Directory.current.path; + +final dylib = ffi.DynamicLibrary.open(Platform.isMacOS ? 'liblantern.dylib' : Platform.isWindows ? 'liblantern.dll' : dir + '/liblantern.so'); + +final Start start = + dylib.lookup>('Start').asFunction(); + +final SysProxy sysProxyOn = + dylib.lookup>('SysProxyOn').asFunction(); + +final SysProxy sysProxyOff = + dylib.lookup>('SysProxyOff').asFunction(); + +final SelectTab setSelectTab = + dylib.lookup>('SetSelectTab').asFunction(); + +final SelectedTab ffiSelectedTab = + dylib.lookup>('SelectedTab').asFunction(); + +final PaymentRedirect ffiPaymentRedirect = dylib.lookup>('PaymentRedirect').asFunction(); + +final ProFunc ffiPlans = dylib.lookup>('Plans').asFunction(); +final ProFunc ffiPaymentMethods = dylib.lookup>('PaymentMethods').asFunction(); +final ProFunc getUserData = dylib.lookup>('UserData').asFunction(); +final ProFunc ffiEmailAddress = dylib.lookup>('EmailAddress').asFunction(); +final ProFunc ffiReferral = dylib.lookup>('Referral').asFunction(); +final ProFunc ffiReplicaAddr = dylib.lookup>('ReplicaAddr').asFunction(); +final ProFunc ffiChatEnabled = dylib.lookup>('ChatEnabled').asFunction(); +final ProFunc ffiCountry = dylib.lookup>('Country').asFunction(); +final ProFunc ffiLang = dylib.lookup>('Lang').asFunction(); +final ProFunc ffiAcceptedTermsVersion = dylib.lookup>('AcceptedTermsVersion').asFunction(); +final CheckUpdates ffiCheckUpdates = dylib.lookup>('CheckUpdates').asFunction(); +final Purchase ffiPurchase = dylib.lookup>('Purchase').asFunction(); +final DoReportIssue ffiReportIssue = dylib.lookup>('ReportIssue').asFunction(); +final ProFunc ffiProUser = dylib.lookup>('ProUser').asFunction(); +final ProFunc ffiDeviceLinkingCode = dylib.lookup>('DeviceLinkingCode').asFunction(); +final ProFunc ffiDevelopmentMode = dylib.lookup>('DevelopmentMode').asFunction(); +final ProFunc ffiSplitTunneling = dylib.lookup>('SplitTunneling').asFunction(); +final ProFunc ffiChatMe = dylib.lookup>('ChatMe').asFunction(); +final ProFunc ffiPlayVersion = dylib.lookup>('PlayVersion').asFunction(); +final ProFunc ffiStoreVersion = dylib.lookup>('StoreVersion').asFunction(); +final ProFunc ffiHasSucceedingProxy = dylib.lookup>('HasSucceedingProxy').asFunction(); +final ProFunc ffiOnBoardingStatus = dylib.lookup>('OnBoardingStatus').asFunction(); +final ProFunc ffiSdkVersion = dylib.lookup>('SdkVersion').asFunction(); +final ProFunc ffiVpnStatus = dylib.lookup>('VpnStatus').asFunction(); +final ProFunc ffiEmailExists = dylib.lookup>('EmailExists').asFunction(); + +void loadLibrary() { + start(); +} diff --git a/lib/home.dart b/lib/home.dart index ba855bc83..21cefc5b5 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -2,6 +2,7 @@ import 'package:lantern/account/account_tab.dart'; import 'package:lantern/account/developer_settings.dart'; import 'package:lantern/account/privacy_disclosure.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; import 'package:lantern/custom_bottom_bar.dart'; import 'package:lantern/messaging/chats.dart'; import 'package:lantern/messaging/onboarding/welcome.dart'; @@ -10,7 +11,7 @@ import 'package:lantern/replica/replica_tab.dart'; import 'package:lantern/vpn/try_lantern_chat.dart'; import 'package:lantern/vpn/vpn_tab.dart'; import 'package:logger/logger.dart'; - +import 'package:tray_manager/tray_manager.dart'; import 'messaging/messaging_model.dart'; @RoutePage(name: 'Home') @@ -21,10 +22,10 @@ class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState(); } -class _HomePageState extends State { +class _HomePageState extends State with TrayListener { BuildContext? _context; - final mainMethodChannel = const MethodChannel('lantern_method_channel'); - final navigationChannel = const MethodChannel('navigation'); + MethodChannel? mainMethodChannel; + MethodChannel? navigationChannel; Function()? _cancelEventSubscription; @@ -32,8 +33,13 @@ class _HomePageState extends State { @override void initState() { + if (isDesktop()) { + setupTrayManager(); + } super.initState(); if (Platform.isAndroid) { + mainMethodChannel = const MethodChannel('lantern_method_channel'); + navigationChannel = const MethodChannel('navigation'); sessionModel.getChatEnabled().then((chatEnabled) { if (chatEnabled) { messagingModel @@ -50,51 +56,83 @@ class _HomePageState extends State { } }); - navigationChannel.setMethodCallHandler(_handleNativeNavigationRequest); + navigationChannel?.setMethodCallHandler(_handleNativeNavigationRequest); // Let back-end know that we're ready to handle navigation - navigationChannel.invokeListMethod('ready'); + navigationChannel?.invokeListMethod('ready'); _cancelEventSubscription = sessionModel.eventManager.subscribe(Event.All, (event, params) { - switch (event) { - case Event.SurveyAvailable: - final message = params['message'] as String; - final buttonText = params['buttonText'] as String; - final snackBar = SnackBar( - backgroundColor: Colors.black, - duration: const Duration(days: 99999), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(8)), - ), - behavior: SnackBarBehavior.floating, - margin: - const EdgeInsetsDirectional.only( - start: 8, end: 8, bottom: 16), - // simple way to show indefinitely - content: CText( - message, - style: CTextStyle( - fontSize: 14, - lineHeight: 21, - color: white, - ), - ), - action: SnackBarAction( - textColor: pink3, - label: buttonText.toUpperCase(), - onPressed: () { - mainMethodChannel.invokeMethod('showLastSurvey'); - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - }, - ), - ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); - break; - default: - break; - } - }); + switch (event) { + case Event.SurveyAvailable: + final message = params['message'] as String; + final buttonText = params['buttonText'] as String; + final snackBar = SnackBar( + backgroundColor: Colors.black, + duration: const Duration(days: 99999), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + behavior: SnackBarBehavior.floating, + margin: const EdgeInsetsDirectional.only( + start: 8, end: 8, bottom: 16), + // simple way to show indefinitely + content: CText( + message, + style: CTextStyle( + fontSize: 14, + lineHeight: 21, + color: white, + ), + ), + action: SnackBarAction( + textColor: pink3, + label: buttonText.toUpperCase(), + onPressed: () { + mainMethodChannel?.invokeMethod('showLastSurvey'); + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + }, + ), + ); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + break; + default: + break; + } + }); } + } + + void setupTrayManager() async { + trayManager.addListener(this); + Menu menu = Menu( + items: [ + MenuItem( + key: 'show_window', + label: 'show'.i18n, + ), + MenuItem.separator(), + MenuItem( + key: 'exit_app', + label: 'exit'.i18n, + ), + ], + ); + await trayManager.setContextMenu(menu); + await trayManager.setIcon(systemTrayIcon(false)); + } + + @override + void onTrayIconMouseDown() { + // pop up the menu + trayManager.popUpContextMenu(); + } + + @override + void onTrayMenuItemClick(MenuItem menuItem) { + print(menuItem.label); + if (menuItem.label == "Exit") { + SystemChannels.platform.invokeMethod('SystemNavigator.pop'); } + } Future _handleNativeNavigationRequest(MethodCall methodCall) async { switch (methodCall.method) { @@ -109,13 +147,15 @@ class _HomePageState extends State { @override void dispose() { + if (isDesktop()) { + trayManager.removeListener(this); + } if (_cancelEventSubscription != null) { _cancelEventSubscription!(); } super.dispose(); } - @override Widget build(BuildContext context) { _context = context; return sessionModel.acceptedTermsVersion( @@ -128,26 +168,29 @@ class _HomePageState extends State { Logger.level = Level.error; } - bool isPlayVersion = (sessionModel.isPlayVersion.value??false); - bool isStoreVersion = (sessionModel.isStoreVersion.value??false); + bool isPlayVersion = (sessionModel.isPlayVersion.value ?? false); + bool isStoreVersion = (sessionModel.isStoreVersion.value ?? false); - if ((isPlayVersion||isStoreVersion) && version == 0) { + if ((isPlayVersion || isStoreVersion) && version == 0) { // show privacy disclosure if it's a Play build and the terms have // not already been accepted return const PrivacyDisclosure(); } return sessionModel.selectedTab( - (context, selectedTab, child) => messagingModel - .getOnBoardingStatus((_, isOnboarded, child) { + (context, selectedTab, child) => + messagingModel.getOnBoardingStatus((_, isOnboarded, child) { final isTesting = const String.fromEnvironment( - 'driver', - defaultValue: 'false', - ).toLowerCase() == + 'driver', + defaultValue: 'false', + ).toLowerCase() == 'true'; + final tab = Platform.isAndroid + ? selectedTab + : ffiSelectedTab().toDartString(); return Scaffold( - body: buildBody(selectedTab, isOnboarded), + body: buildBody(tab, isOnboarded), bottomNavigationBar: CustomBottomBar( - selectedTab: selectedTab, + selectedTab: tab, isDevelop: developmentMode, isTesting: isTesting, ), @@ -160,6 +203,7 @@ class _HomePageState extends State { ); } + @override Widget buildBody(String selectedTab, bool? isOnboarded) { switch (selectedTab) { case TAB_CHATS: diff --git a/lib/i18n/i18n.dart b/lib/i18n/i18n.dart index d9a103fd0..b07597a24 100644 --- a/lib/i18n/i18n.dart +++ b/lib/i18n/i18n.dart @@ -26,6 +26,8 @@ extension Localization on String { static String get localeShort => locale.split('_')[0]; + String doLocalize() => localize(this, translations, locale: locale.replaceAll('_', '-')); + String get i18n => localize(this, translations, locale: locale.replaceAll('_', '-')); diff --git a/lib/main.dart b/lib/main.dart index 55337f4eb..fb7433630 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,11 +2,15 @@ import 'package:flutter_driver/driver_extension.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:lantern/app.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; +import 'package:lantern/ffi.dart'; +import 'package:tray_manager/tray_manager.dart'; import 'catcher_setup.dart'; Future main() async { // CI will be true only when running appium test const String flavor = String.fromEnvironment('app.flavor'); + print("Running Flavor $flavor"); if (flavor == 'appiumTest') { print("Flutter extension enabled $flavor"); @@ -14,8 +18,10 @@ Future main() async { } WidgetsFlutterBinding.ensureInitialized(); - await _initGoogleMobileAds(); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + + //await initPlatformState(); + //await _initGoogleMobileAds(); + //await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); //Todo if catcher is not picking up error and exception then we should switch to sentryFlutter // SentryFlutter.init((options) { @@ -28,6 +34,10 @@ Future main() async { // : 'https://c14296fdf5a6be272e1ecbdb7cb23f76@o75725.ingest.sentry.io/4506081382694912'; // }, appRunner: () => setupCatcherAndRun(LanternApp())); + if (isDesktop()) { + loadLibrary(); + } + setupCatcherAndRun(LanternApp()); } diff --git a/lib/messaging/messaging_model.dart b/lib/messaging/messaging_model.dart index 8de6ca025..2910a4b75 100644 --- a/lib/messaging/messaging_model.dart +++ b/lib/messaging/messaging_model.dart @@ -1,5 +1,6 @@ // import 'calls/signaling.dart'; import 'messaging.dart'; +import 'package:lantern/common/common_desktop.dart'; final messagingModel = MessagingModel(); @@ -19,21 +20,22 @@ class MessagingModel extends Model { ); // signaling = Signaling(methodChannel); - - methodChannel.setMethodCallHandler((call) async { - switch (call.method) { - // case 'onSignal': - // var args = call.arguments as Map; - // signaling.onMessage( - // args['senderId'], - // args['content'], - // args['acceptedCall'], - // ); - // break; - default: - break; - } - }); + if (Platform.isAndroid) { + methodChannel.setMethodCallHandler((call) async { + switch (call.method) { + // case 'onSignal': + // var args = call.arguments as Map; + // signaling.onMessage( + // args['senderId'], + // args['content'], + // args['acceptedCall'], + // ); + // break; + default: + break; + } + }); + } } /* @@ -302,12 +304,20 @@ class MessagingModel extends Model { } Widget me(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - '/me', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + '/me', + builder: builder, + deserialize: (Uint8List serialized) { + return Contact.fromBuffer(serialized); + }, + ); + } + return ffiValueBuilder( + 'chatMe', + ffiChatMe, + defaultValue: null, builder: builder, - deserialize: (Uint8List serialized) { - return Contact.fromBuffer(serialized); - }, ); } @@ -510,9 +520,17 @@ class MessagingModel extends Model { Widget getOnBoardingStatus(ValueWidgetBuilder builder) { // Note - we use null as a placeholder for "unknown" to indicate when we // haven't yet read the actual onboarding status from the back-end - return subscribedSingleValueBuilder( + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'onBoardingStatus', + defaultValue: null, + builder: builder, + ); + } + return ffiValueBuilder( 'onBoardingStatus', - defaultValue: null, + defaultValue: false, + ffiOnBoardingStatus, builder: builder, ); } @@ -522,9 +540,17 @@ class MessagingModel extends Model { } Widget getCopiedRecoveryStatus(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - 'copiedRecoveryStatus', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + 'copiedRecoveryStatus', + defaultValue: false, + builder: builder, + ); + } + return ffiValueBuilder( + 'onBoardingStatus', defaultValue: false, + ffiOnBoardingStatus, builder: builder, ); } diff --git a/lib/plans/checkout.dart b/lib/plans/checkout.dart index a62109a64..43dafdbba 100644 --- a/lib/plans/checkout.dart +++ b/lib/plans/checkout.dart @@ -1,5 +1,7 @@ import 'package:email_validator/email_validator.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; import 'package:lantern/plans/payment_provider.dart'; import 'package:lantern/plans/plan_details.dart'; import 'package:lantern/plans/utils.dart'; @@ -126,6 +128,23 @@ class _CheckoutState extends State ); } + List desktopPaymentOptions() { + var widgets = []; + widgets.add( + PaymentProvider( + logoPaths: [ + ImagePaths.visa, + ImagePaths.mastercard, + ImagePaths.unionpay + ], + onChanged: () => selectPaymentProvider(Providers.stripe), + selectedPaymentProvider: selectedPaymentProvider!, + paymentType: Providers.stripe, + ), + ); + return widgets; + } + List paymentOptions( Iterable> paymentMethods, ) { @@ -185,6 +204,23 @@ class _CheckoutState extends State Future resolvePaymentRoute() async { switch (selectedPaymentProvider!) { case Providers.stripe: + + if (isDesktop()) { + String os = Platform.operatingSystem; + final redirectUrl = await sessionModel.paymentRedirect( + widget.plan.id, + emailController.text, + "stripe", + os, + ); + if (!Platform.isMacOS) { + await context.pushRoute(AppWebview(url: redirectUrl)); + } else { + await InAppBrowser.openWithSystemBrowser(url: WebUri(redirectUrl)); + } + return; + } + // * Stripe selected await context.pushRoute( StripeCheckout( @@ -361,7 +397,7 @@ class _CheckoutState extends State width: MediaQuery.of(context).size.width, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: paymentOptions(paymentMethods), + children: Platform.isAndroid ? paymentOptions(paymentMethods) : desktopPaymentOptions(), ), ), // * Price summary, unused pro time disclaimer, Continue button @@ -371,11 +407,6 @@ class _CheckoutState extends State message: AppKeys.continueCheckout, child: Button( text: 'continue'.i18n, - disabled: emailController.value.text.isEmpty || - emailFieldKey.currentState?.validate() == - false || - refCodeFieldKey.currentState?.validate() == - false, onPressed: onContinueTapped, ), ), @@ -404,17 +435,6 @@ class _CheckoutState extends State var refCode = refCodeController.value; Future.wait( [ - sessionModel - .checkEmailExists( - emailController.value.text, - ) - .onError((error, stackTrace) { - showError( - context, - error: e, - stackTrace: stackTrace, - ); - }), if (refCode.text.isNotEmpty) sessionModel .applyRefCode( diff --git a/lib/plans/plan_details.dart b/lib/plans/plan_details.dart index 51654359a..6c799c45b 100644 --- a/lib/plans/plan_details.dart +++ b/lib/plans/plan_details.dart @@ -30,13 +30,6 @@ class PlanCard extends StatelessWidget { .submitGooglePlay(planName) .onError((error, stackTrace) { // on failure - CDialog.showError( - context, - error: e, - stackTrace: stackTrace, - description: - (error as PlatformException).message ?? error.toString(), - ); }); } else { // * Proceed to our own Checkout diff --git a/lib/plans/plans.dart b/lib/plans/plans.dart index 6ab9f3268..b95332914 100644 --- a/lib/plans/plans.dart +++ b/lib/plans/plans.dart @@ -1,13 +1,6 @@ import 'package:lantern/common/common.dart'; import 'package:lantern/plans/plan_details.dart'; - -final featuresList = [ - 'unlimited_data'.i18n, - 'faster_data_centers'.i18n, - 'no_logs'.i18n, - 'connect_up_to_3_devices'.i18n, - 'no_ads'.i18n, -]; +import 'package:lantern/plans/utils.dart'; @RoutePage(name: "PlansPage") class PlansPage extends StatelessWidget { diff --git a/lib/plans/utils.dart b/lib/plans/utils.dart index 204213adf..7472352fd 100644 --- a/lib/plans/utils.dart +++ b/lib/plans/utils.dart @@ -7,6 +7,14 @@ const lanternStarLogo = CAssetImage( size: 72, ); +final featuresList = [ + 'unlimited_data'.i18n, + 'faster_data_centers'.i18n, + 'no_logs'.i18n, + 'connect_up_to_3_devices'.i18n, + 'no_ads'.i18n, +]; + void onAPIcallTimeout({code, message}) { throw PlatformException( code: code, diff --git a/lib/replica/ui/viewers/video.dart b/lib/replica/ui/viewers/video.dart index 821580fd0..65aead614 100644 --- a/lib/replica/ui/viewers/video.dart +++ b/lib/replica/ui/viewers/video.dart @@ -45,7 +45,6 @@ class _ReplicaVideoViewerState extends ReplicaViewerLayoutState { } void handleVideoTap() { - Wakelock.toggle(enable: controller!.value.isPlaying); if (controller!.value.isPlaying) { setState(() { controller!.pause(); diff --git a/lib/vpn/vpn_model.dart b/lib/vpn/vpn_model.dart index f5a0d2add..ff7aedd1c 100644 --- a/lib/vpn/vpn_model.dart +++ b/lib/vpn/vpn_model.dart @@ -1,4 +1,5 @@ import 'package:lantern/vpn/vpn.dart'; +import 'package:lantern/common/common_desktop.dart'; final vpnModel = VpnModel(); @@ -12,8 +13,16 @@ class VpnModel extends Model { } Widget vpnStatus(ValueWidgetBuilder builder) { - return subscribedSingleValueBuilder( - '/vpn_status', + if (Platform.isAndroid) { + return subscribedSingleValueBuilder( + '/vpn_status', + builder: builder, + ); + } + return ffiValueBuilder( + 'vpnStatus', + defaultValue: '', + ffiVpnStatus, builder: builder, ); } diff --git a/lib/vpn/vpn_pro_banner.dart b/lib/vpn/vpn_pro_banner.dart index 23b98dac2..e420d71a4 100644 --- a/lib/vpn/vpn_pro_banner.dart +++ b/lib/vpn/vpn_pro_banner.dart @@ -6,7 +6,7 @@ class ProBanner extends StatelessWidget { @override Widget build(BuildContext context) { return CInkWell( - onTap: () => context.pushRoute(const PlansPage()), + onTap: () => context.pushRoute(PlansPage()), child: Container( padding: const EdgeInsetsDirectional.all(16), decoration: BoxDecoration( diff --git a/lib/vpn/vpn_server_location.dart b/lib/vpn/vpn_server_location.dart index 20e394218..fc4b9fae3 100644 --- a/lib/vpn/vpn_server_location.dart +++ b/lib/vpn/vpn_server_location.dart @@ -3,6 +3,11 @@ import 'package:lantern/vpn/vpn.dart'; class ServerLocationWidget extends StatelessWidget { @override Widget build(BuildContext context) { + const vpnStatus = 'disconnected'; + const serverInfo = { + "countryCode": "DE", + "city": "Frankfurt" + }; return CInkWell( onTap: () => CDialog.showInfo( context, @@ -28,36 +33,22 @@ class ServerLocationWidget extends StatelessWidget { ), ), const Spacer(), - vpnModel.vpnStatus( - (BuildContext context, String vpnStatus, Widget? child) { - return sessionModel.serverInfo( - (BuildContext context, ServerInfo serverInfo, Widget? child) { - if (vpnStatus == 'connected' || vpnStatus == 'disconnecting') { - return Row( + Row( children: [ ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(4)), child: Flag.fromString( - serverInfo.countryCode, + serverInfo["countryCode"]!, height: 24, width: 36, ), ), const SizedBox(width: 12), CText( - serverInfo.city, + serverInfo["city"]!, style: tsSubtitle4, ) - ], - ); - } else { - return CText( - 'n/a'.i18n.toUpperCase(), - style: tsSubtitle4, - ); - } - }); - }), + ]), ], ), ); diff --git a/lib/vpn/vpn_switch.dart b/lib/vpn/vpn_switch.dart index 9f906e107..fcac28bf9 100644 --- a/lib/vpn/vpn_switch.dart +++ b/lib/vpn/vpn_switch.dart @@ -1,4 +1,9 @@ import 'package:lantern/vpn/vpn.dart'; +import 'package:lantern/ffi.dart'; +import 'package:lantern/common/common.dart'; +import 'package:lantern/common/common_desktop.dart'; +import 'package:tray_manager/tray_manager.dart'; +import 'package:lantern/main.dart'; class VPNSwitch extends StatefulWidget { const VPNSwitch({super.key}); @@ -10,6 +15,8 @@ class VPNSwitch extends StatefulWidget { class _VPNSwitchState extends State { // final adHelper = AdHelper(); + String vpnStatus = 'disconnected'; + @override void initState() { super.initState(); @@ -21,9 +28,19 @@ class _VPNSwitchState extends State { Future onSwitchTap(bool newValue, String vpnStatus) async { unawaited(HapticFeedback.lightImpact()); - if (isIdle(vpnStatus)) { - await vpnModel.switchVPN(newValue); + if (Platform.isAndroid) { + await vpnModel.switchVPN(newValue); + } else if (isDesktop()) { + bool isConnected = vpnStatus == 'connected'; + String path = systemTrayIcon(!isConnected); + if (isConnected) { + await sysProxyOff(); + } else { + await sysProxyOn(); + } + await trayManager.setIcon(path); + } } //add delayed to avoid flickering @@ -44,11 +61,19 @@ class _VPNSwitchState extends State { scale: 2, child: vpnModel .vpnStatus((BuildContext context, String vpnStatus, Widget? child) { + this.vpnStatus = vpnStatus; return FlutterSwitch( - value: vpnStatus == 'connected' || vpnStatus == 'disconnecting', + value: this.vpnStatus == 'connected' || + this.vpnStatus == 'disconnecting', + //value: true, activeColor: onSwitchColor, inactiveColor: offSwitchColor, - onToggle: (bool newValue) => onSwitchTap(newValue, vpnStatus), + onToggle: (bool newValue) { + onSwitchTap(newValue, vpnStatus); + setState(() { + this.vpnStatus = newValue ? 'connected' : 'disconnected'; + }); + }, ); }), ); diff --git a/lib/vpn/vpn_tab.dart b/lib/vpn/vpn_tab.dart index bba9f9f76..29845f5ee 100644 --- a/lib/vpn/vpn_tab.dart +++ b/lib/vpn/vpn_tab.dart @@ -13,9 +13,8 @@ class VPNTab extends StatelessWidget { @override Widget build(BuildContext context) { - return sessionModel - .proUser((BuildContext context, bool proUser, Widget? child) { - return BaseScreen( + const proUser = false; + return BaseScreen( title: SvgPicture.asset( proUser ? ImagePaths.pro_logo : ImagePaths.free_logo, height: 16, @@ -25,7 +24,7 @@ class VPNTab extends StatelessWidget { body: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - if(!proUser && Platform.isAndroid) + if(!proUser && !Platform.isIOS) ProBanner() else const SizedBox(), @@ -59,6 +58,5 @@ class VPNTab extends StatelessWidget { ], ), ); - }); } } diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 000000000..d3896c984 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 000000000..705fd756a --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "lantern") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "org.getlantern.lantern") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +# set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +# install(DIRECTORY "${NATIVE_ASSETS_DIR}" +# DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" +# COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000..d5bd01648 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..77ea32aca --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,31 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); + g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); + emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); + g_autoptr(FlPluginRegistrar) sentry_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "SentryFlutterPlugin"); + sentry_flutter_plugin_register_with_registrar(sentry_flutter_registrar); + g_autoptr(FlPluginRegistrar) tray_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin"); + tray_manager_plugin_register_with_registrar(tray_manager_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..8db74cd2c --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,28 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux + emoji_picker_flutter + sentry_flutter + tray_manager + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/linux/main.cc b/linux/main.cc new file mode 100644 index 000000000..e7c5c5437 --- /dev/null +++ b/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc new file mode 100644 index 000000000..281147f56 --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "lantern"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "lantern"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h new file mode 100644 index 000000000..72271d5e4 --- /dev/null +++ b/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/locale/translation/ar.json b/locale/translation/ar.json new file mode 100644 index 000000000..fb9974f5e --- /dev/null +++ b/locale/translation/ar.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "لانترن", + "pro": "Pro", + "BEAM": "شعاع", + "TRAY_STATUS": "الحالة: %v", + "TRAY_CONNECT": "اتصال", + "TRAY_DISCONNECT": "قطع الاتصال", + "TRAY_SHOW": "إظهار%s", + "TRAY_UPGRADE_TO_PRO": "الترقية الى برو", + "TRAY_QUIT": "إنهاء%s", + "BACKEND_DATA_TITLE": "لا مزيد من البيانات %sعالية السرعة", + "BACKEND_DATA_MESSAGE": "يرجى التحديث إلى Pro للحفاظ على استخدام %s بأقصى سرعة!", + "BACKEND_DATA_PERCENT_TITLE": "تم الوصول إلى %s من %s البيانات الخاصة بك", + "BACKEND_DATA_PERCENT_MESSAGE": "لقد استهلكت %s من بيانات السرعة العالية %s الخاصة بك. قم بالتحديث الآن!", + "BACKEND_CLICK_LABEL": "مفتوح", + "BACKEND_CLICK_LABEL_OPEN": "مفتوح", + "BACKEND_CLICK_LABEL_HELP": "مساعدة", + "BACKEND_CLICK_LABEL_GOT_IT": "فهمت", + "BACKEND_AUTOUPDATED_TITLE": "تحديث %sإلى الإصدار %s", + "BACKEND_AUTOUPDATED_MESSAGE": "تم تنزيل %s%s. الرجاء إعادة تشغيل %s من أجل الاستخدام.", + "BACKEND_MITM_INSTALL_CERT": "%s يريد تثبيت شهادة مخصصة لتحسين الأداء", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "يرجى السماح لـ %v باجراء التغييرات على نظامك.", + "BACKEND_ALERT_TITLE": "تنبيه مهم يحتاج إلى اهتمامك", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "يحتاج%s إلى إذنك لتثبيت أدوات التشخيص. سيساعدنا ذلك على تحسين تجربتك%s", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "يتعذر حفظ التهيئة", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "يتعذر حفظ تهيئة التطبيق. %s يتعذر ضمان أن يتم إنشاء وكيل للزيارة بشكل صحيح.", + "about.content": "لانترن هو تطبيق يقدم وصول آمن وموثوق وسريع الى الانترنت المفتوح.", + "app.error": "حدث خطأ ما!", + "about.faq": "اقرأ الأسئلة الشائعة حول تطبيق لانترن", + "about.open": "انترنت مفتوح للجميع", + "about.questions": "هل لديك أسئلة؟", + "about.title": "حول", + "account.add.password": "إضافة كلمة مرور الحساب", + "account.agree.terms": "أفهم أن فقدان كلمة المرور يعني فقدان\nالوصول إلى الحساب. لا يمكن لـ Lantern أن يساعدك على استرجاع\nكلمة السر الخاصة بك.", + "account.agree.terms.error": "يجب أن توافق أولًا على الشروط", + "account.cancel": "إلغاء حساب برو", + "account.created": "تم إنشاء الحساب!", + "account.create.pro.account.header": "إنشاء حساب Pro", + "account.create.pro.account.text": "يقوم Lantern بتغيير طريقة التعامل مع حسابات المستخدمين. من الآن فصاعدا سيحتاج مستخدمو Pro إلى إنشاء اسم مستخدم وكلمة مرور. سيتم استخدام بيانات الاعتماد هذه لتسجيل الدخول إلى أجهزة أخرى، وتوفير الوصول إلى ميزات جديدة.", + "account.have.a.account": "هل لديك حساب؟", + "account.link.username.pro": "ربط اسم المستخدم بحساب Pro", + "account.recovery": "استرداد الحساب", + "account.recovery.link.device": "ربط الجهاز", + "account.recovery.device.code": "كود ربط الجهاز", + "account.recovery.device.enter.code": "أدخل أو الصق رمز ربط الجهاز", + "account.recovery.device.instructions.header": "لربط هذا الجهاز مع حساب برو  الخاص بك:", + "account.recovery.device.instructions.step.one": "1. اختر \"ربط جهاز\" من بند شاشة إدارة الحساب على جهاز Desktop Pro، أو من القائمة الموجودة على جهاز Mobile Pro خاصتك.", + "account.recovery.device.instructions.step.two": "2. أدخل رمز ربط الجهاز واضغط على تسليم.", + "account.recovery.device.instructions.part.three": "* تأكد من أن كلا الجهازين يعملان بأحدث إصدار من Lantern", + "account.recovery.method": "الرجاء اختيار طريقة لاسترداد حسابك", + "account.recovery.send.email": "أرسل بريدا الكترونيا", + "account.recovery.submit": "ارسال", + "account.recovery.success": "تم الربط بنجاح!", + "account.pro_management": "إدارة حساب برو", + "account.free_management": "ادارة الحساب", + "account.free.cap": "متبقي{{mb}} ميغابايت من البيانات الحرة. تتم إعادة التعيين عند {{reset}}", + "account.free.cap.upgrade": "الترقية الى حساب برو لبيانات عالية السرعة وغير محدودة", + "account.freelink.validFor": "صالح لـ %s", + "account.freelink.desc": "لتخويل هذا الجهاز لاستخدام حساب Pro الخاص بك:", + "account.freelink.step1": "1. اختر خيار \"ربط جهاز\" من القائمة على جهاز Pro الخاص بك", + "account.freelink.step2": "2. أدخل رمز ربط الجهاز واضغط على تسليم.", + "account.freelink.reminder": "* تأكد من أن كلا الجهازين يعملان بأحدث إصدار من Lantern", + "account.freelink.errorTitle": "خطأ في الربط", + "account.freelink.errorText": "هل أنت متأكد أنك أدخلت الرمز الى جهاز برو الخاص بك؟", + "account.freelink.headerDesc": "اربط هذا الجهاز الى حساب برو الخاص بك", + "account.freelink.title": "كود ربط الجهاز", + "account.pro.charge": "سيتم فرض عمولة على حسابك تلقائياً لسنة أخرى لتطبيق لانترن برو في نهاية دورة الفاتورة الخاصة بك.", + "account.upgrade_pro": "الترقية الى برو", + "account.upgrade": "إشترك", + "account.upgrade_platinum": "الترقية إلى Platinum", + "account.create": "إنشاء حساب", + "account.email": "البريد الاكتروني", + "account.confirm.password": "تأكيد كلمة المرور", + "account.password": "كلمة المرور", + "account.pro.email": "البريد الإلكتروني:", + "account.pro.expiration": "انتهاء صلاحية حساب Pro", + "account.platinum.expiration": "انتهاء صلاحية حساب Platinum ", + "account.pro.expired": "لقد انت صلاحية حساب البرو الخاص بك. قم بتجديد البيانات الشهرية اللامحدودة.", + "account.pro.expiry": "تنتهي صلاحية حساب برو الخاص بك خلال %s يوماً بتاريخ %s.", + "account.pro.bonusMonths": "هذا يتضمن {{bonusMonths}} شهور مجانية!", + "account.pro.thisdevice": "(هذا الجهاز)", + "account.pro.logout": "تسجيل الخروج", + "account.pro.removedevice": "ازالة", + "account.pro.devices": "أجهزة Lantern Pro (تصل إلى 3)", + "account.pro.device.confirm.title": "إلغاء مصادقة الجهاز", + "account.pro.device.confirm": "هل أنت متأكد أنك تريد إزالة \"{{device}}\" من حساب Lantern Pro الخاص بك؟", + "account.pro.device.one.title": "جهاز واحد فقط", + "account.pro.device.one": "عذراً، لا يمكنك ازالة الجهاز الأخير الذي تم المصادقة عليه", + "account.pro.linkingcode": "رمز ربط الجهاز:", + "account.pro.renew": "تجديد حساب Pro", + "account.platinum.renew": "تجديد حساب Platinum", + "account.pro.renew_CN": "اعادة التجديد", + "account.prolink.errorTitle": "خطأ في الربط", + "account.prolink.errorText": "هل أنت متاكد من أنك نسخت الرمز بشكل صحيح من جهازك الآخر؟", + "account.prolink.successTitle": "الجهاز الذي تم ربطه", + "account.prolink.successText": "لقد تم ربط جهازك بنجاح! يرجى الانتظار للحظة على جهازك الآخر ليصبح حساب برو تلقائياً.", + "account.signin": "تسجيل الدخول", + "account.signout": "تسجيل الخروج", + "account.submit": "ارسال", + "account.username": "إسم المستخدم", + "account.switch.to.register": "التبديل إلى إنشاء حساب", + "account.switch.to.signin": "التبديل إلى تسجيل الدخول", + "account.invalid.username": "اسم المستخدم غير صالح", + "account.invalid.email": "البريد الإلكتروني غير صالح", + "account.password.mismatch": "تأكيد كلمة المرور لا يطابق كلمة المرور", + "account.password.short": "كلمة المرور قصيرة جدا", + "account.password.lowercase": "يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل", + "account.password.uppercase": "يجب أن تحتوي كلمة المرور على حرف واحد على الأقل", + "account.password.number": "يجب أن تحتوي كلمة المرور على رقم واحد على الأقل", + "account.password.compromised": "كلمة المرور تظهر على قائمة كلمات المرور التي تم اختراقها", + "modal.register.free.header": "التسجيل أو تسجيل الدخول للدخول إلى محفظة Yinbi", + "modal.register.pro.header": "إضافة كلمة مرور الحساب للوصول إلى محفظة Yinbi", + "modal.register.pro.signin.header": "تسجيل الدخول للوصول إلى محفظة Yinbi", + "modal.register.free.text": "لاستخدام محفظة Yinbi يجب أن يكون لديك حساب Lantern، يرجى القيام بالتسجيل أو\nتسجيل الدخول للمتابعة.", + "modal.register.pro.text": "لاستخدام محفظة Yinbi، يجب تعيين كلمة مرور لحساب Lantern الخاص بك.", + "modal.register.pro.signin.text": "لاستخدام محفظة Yinbi يجب عليك تسجيل الدخول إلى حساب Lantern الخاص بك", + "adyen.paymentMethods.title": "وسائل الدفع", + "adyen.paymentMethods.storedMethods": "وسائل الدفع الخاصة بك", + "adyen.paymentMethods.otherMethods": "حدد وسيلة دفع أخرى", + "adyen.paymentMethods.moreMethodsButton": "المزيد من وسائل الدفع", + "adyen.payButton": "ادفع", + "adyen.payButton.formatted": "ادفع %@", + "adyen.cancelButton": "إلغاء", + "adyen.dismissButton": "حسناً", + "adyen.storeDetails": "حفظ لدفعتي القادمة", + "adyen.payment.redirecting": "سيتم اعادة توجيهك", + "adyen.payment.processing": "جار معالجة دفعتك", + "adyen.creditCard.title": "تفاصيل البطاقة", + "adyen.creditCard.holderName": "اسم حامل البطاقة", + "adyen.creditCard.holderName.placeholder": "جون سميث", + "adyen.creditCard.numberField.title": "رقم البطاقة", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "رقم بطاقة غير صالح", + "adyen.creditCard.expiryDateField.title": "تاريخ انتهاء الصلاحية", + "adyen.creditCard.expiryDateField.placeholder": "شهر/سنة", + "adyen.creditCard.expiryDateField.invalid": "تاريخ انتهاء صلاحية غير صالح", + "adyen.creditCard.expiryDateField.month": "شهر", + "adyen.creditCard.expiryDateField.month.placeholder": "شهر", + "adyen.creditCard.expiryDateField.year.placeholder": "سنة", + "adyen.creditCard.expiryDateField.year": "سنة", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "عدد التثبيتات", + "adyen.creditCard.storeDetailsButton": "تذكر هذه البطاقة لعملية الدفع القادمة", + "adyen.creditCard.oneClickVerification.title": "تحقق من بطاقتك", + "adyen.creditCard.oneClickVerification.message": "يرجى ادخال رمز CVC لـ %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "رمز CVC غير صالح", + "adyen.creditCard.oneClickVerification.invalidInput.message": "يرجى ادخال رمز CVC صالح للمتابعة.", + "adyen.sepaDirectDebit.ibanField.title": "رقم الحساب (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "رقم حساب غير صالح", + "adyen.sepaDirectDebit.nameField.title": "اسم حامل البطاقة", + "adyen.sepaDirectDebit.nameField.placeholder": "جون سميث", + "adyen.sepaDirectDebit.consentButton": "أوافق على أن المبلغ أدناه سيتم خصمه من حسابي البنكي.", + "adyen.sepa.ownerName": "اسم حامل البطاقة", + "adyen.sepa.ibanNumber": "رقم الحساب (IBAN)", + "adyen.giropay.searchField.placeholder": "اسم البنك / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "3 حروف كحد أدنى", + "adyen.giropay.noResults": "لا يوجد نتائج بحث", + "adyen.error.title": "خطأ", + "adyen.error.subtitle.redirect": "فشل اعادة التوجيه", + "adyen.error.subtitle.payment": "فشلت عملية الدفع", + "adyen.error.subtitle.refused": "تم رفض عملية الدفع", + "adyen.error.message.unknown": "حدث خطأ غير معروف", + "adyen.error.message.cannotConnectToInternet": "تعذر الاتصال بالانترنت: يرجى التحقق من اتصالك بالانترنت.", + "adyen.error.message.cannotConnectToHost": "فشل الاتصال بخادم الدفع الخاص بنا.", + "adyen.error.retryButton": "حاول مرة أخرى", + "adyen.idealIssuer.selectField.title": "بنك", + "adyen.idealIssuer.selectField.placeholder": "حدد البنك الخاص بك", + "adyen.creditCard.success": "نجحت عملية الدفع", + "adyen.oneClick.confirmationAlert.title": "تأكيد دفعة %@", + "adyen.redirect.cannotOpenApp.title": "لا يمكن فتح التطبيق", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "لا يمكن فتح هذا التطبيق لأنه غير مثبت على هذا الجهاز.", + "adyen.holderName": "اسم حامل البطاقة", + "adyen.countryCode": "رمز البلد", + "adyen.telephone.number": "رقم الهاتف", + "android.download": "لانترن اندرويد", + "android.download.title": "تحميل Lantern لنظام Android", + "authorize.title": "السماح للجهاز بالترقية لحساب برو", + "authorize.step1.have_pro_device": "لدي جهاز بحساب لانترن برو آخر", + "authorize.step1.link": "ربط الجهاز", + "authorize.step1.email_linking": "ربط البريد الإلكتروني", + "authorize.device_linking_explanation": "استخدم هذه الطريقة إذا كنت قد سجلت الدخول إلى جهاز آخر وكان بحوزتك", + "authorize.device_email_explanation": "استخدم هذه الطريقة إذا كنت تريد إرسال رمز ربط الجهاز إلى بريدك الإلكتروني", + "authorize.link_device": "ربط الجهاز", + "authorize.step1.choose": "الرجاء اختيار طريقة لربط حسابك", + "authorize.step1.or": "أو", + "authorize.step1.recover": "أحتاج الى استرداد حساب لانترن برو الخاص بي", + "authorize.step1.start": "بدء الاسترداد", + "authorize.step1.no_mail": "هل لا تستطيع تذكر عنوان البريد الالكتروني الخاص بك؟", + "authorize.step1.description": "أدخل بريدك الإلكتروني وإذا كان الحساب موجودًا سنرسل بريدًا إلكترونيًا مع رمز ربط للجهاز", + "authorize.step2b.enter_code": "أدخل رمز استعادة الحساب الخاص بك", + "authorize.step2b.code": "رمز استرداد الحساب", + "authorize.step2b.instruction": "تم إرسال بريد إلكتروني برمز الاسترداد إلى {{email}} حالة وجود هذا الحساب. قد يستغرق وصول هذا البريد الإلكتروني عدة ساعات. يرجى التحقق من مجلد الرسائل غير المرغوب بها إذا لم تعثر عليه في صندوق الرسائل الواردة.", + "authorize.step2b.no_mail": "لم استلم رسالة", + "authorize.step3.recovery": "استرداد الحساب", + "authorize.step3.no_email": "عفواً! لدينا مشكلة في العثور على عنوان البريد الالكتروني هذا. يرجى اعطائنا المزيد من المعلومات أدناه لتساعدنا في تحديد موقع حسابك.", + "authorize.step3.no_code_received": "هل تواجه مشكلة في استلام بريد الاستعادة؟ أدخل المعلومات أدناه وسوف نتصل بك في غضون 48 ساعة.", + "authorize.step3.your_email": "بريدك الالكتروني", + "authorize.step3.payment_method": "وسيلة الدفع", + "authorize.step3.payment_method_hint": "حدد وسيلة الدفع التي استخدمتها للحصول على حساب برو", + "authorize.step3.credit_card": "بطاقة ائتمانية", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "حصلت على حساب برو من خلال الاحالة الى صديق", + "authorize.step3.payment_account": "حساب الدفع", + "authorize.step3.payment_account_hint": "أدخل معلومات حساب Alipay", + "authorize.step3.referral_code": "رمز الإحالة الخاص بك", + "authorize.step3.purchase_date": "تاريخ الشراء", + "authorize.step3.note": "يرجى كتابة أي معلومات أخرى يمكن أن تساعدنا على تحديد موقع حسابك.", + "authorize.step4.title": "استرداد الحساب قيد التقدم", + "authorize.step4.text1": "شكراً لك! لقد استلمنا طلب استعادة حسابك.", + "authorize.step4.text2": "يرجى امهالنا 48 ساعة لاستعادة معلومات حساب البرو  الخاص بك.", + "authorize.step4.text3": "سوف نرسل المعلومات الى عنوان البريد الالكتروني الذي تم ادخاله على الشاشة السابقة.", + "authorized.continue": "المتابعة الى حساب برو", + "authorized.continue.lantern": "المتابعة إلى Lantern", + "authorized.text": "تمت مصادقة هذا الجهاز لستخدام حساب لاتيرن برو الخاص بك!", + "authorized.title": "تم منح الاذن للجهاز", + "button.account": "حساب", + "button.renew": "اعادة التجديد", + "button.upgrade": "إشترك", + "button.upgrade_now": "الترقية الآن", + "button.upgrade_to_lantern_pro": "الترقية الى لاتيرن برو", + "button.copy_your_code": "انسخ الرمز الخاص بك", + "button.try_again": "حاول مرة أخرى", + "button.continue": "واصل", + "button.continue_to": "المتابعة إلى {{planType}}", + "bullet.click_button": "أنقر على الزر أدناه", + "bullet.paste_code": "ألصق الرمز ورابط التنزيل في رسالة", + "bullet.send_to_friends": "ارسال الى أصدقائك", + "cancel": "إلغاء", + "confirm": "تأكيد", + "norecoveryyinbi": "*لا يمكنه استرجاع محفظة Yinbi", + "email.recovery.check.email": "تحقق من بريدك الإلكتروني للحصول على رسالة بها رمز الاسترداد", + "email.recovery.code.label": "أدخل أو الصق رمز الاسترداد", + "email.recovery.no.code": "لم تحصل على رمز؟", + "email.recovery.text": "أدخل بريدك الإلكتروني، وسنرسل لك رمزًا لإعادة تعيين كلمة المرور.\nإذا كان لديك محفظة Yinbi، فلن يمكنك ذلك من استرداد محفظة ينبي الخاصة بك، لاسترداد محفظة ينبي، أدخل عبارة الاسترداد ينبي خاصتك.", + "email.recovery.desc": "استخدم هذة الطريقة في حال رغبتك في إرسال رمز استرداد إلى بريدك الإلكتروني", + "device.recovery.desc": "استخدم هذه الطريقة إذا كنت قد سجلت الدخول إلى جهاز آخر وكان بحوزتك", + "google_search": "البحث على جوجل", + "giveaway.upgrade": "قم بالتحديث لتحصل على التوزيع المجاني اليوم", + "giveaway.title_released_today": "{{formattedTokens}} YNB يتم إصدارها اليوم", + "giveaway.what_is_it": "ما هي هدية Yinbi؟", + "giveaway.description1": "تقوم مؤسسة Yinbi بتقديم 888 مليار عملة مشفرة YNB حصريا من خلال Lantern لمشتري Lantern Pro.", + "giveaway.description2": "سيتم توزيع YNB في نهاية كل يوم، استنادا إلى كمية Yinbi الصادرة في ذلك اليوم، وعدد الأشخاص الذين قاموا بالتحديث/ التجديد، وعدد السنوات أو الحسابات التي تشتريها. سيتم إيداع YNB مباشرة في محفظة Yinbi الخاصة بك في Lantern.", + "giveaway.learn_more": "مزيد من المعلومات", + "link_device": "هل لديم حساب برو بالفعل؟ اربط الجهاز", + "email.recovery": "استرداد البريد الإلكتروني", + "email_taken": "البريد الإلكتروني مسجل بالفعل", + "username_taken": "اسم المستخدم مسجل بالفعل", + "err.unknown_error": "خطأ غير معروف", + "err.internal_error": "خطأ داخلي", + "err.bad_input": "ادخال خاطئ", + "err.not_authorized": "غير مصرح به", + "err.user_exists": "المستخدم موجود", + "err.no_such_user": "لا يوجد مستخدم", + "err.user_already_verified": "لقد تمت مصادقة المستخدم بالفعل", + "err.invalid_user_verification": "تحقق مستخدم غير صالح", + "err.user_unverified": "لم يتم التحقق من المستخدم", + "err.operation_temporarily_unavailable": "العملية غير متاحة مؤقتاً", + "err.wrong_or_inexistent_plan": "خطة خاطئة أو غير موجودة", + "err.user_has_active_subscription": "يمتلك المستخدم حساب نشط", + "err.payment_error": "خطأ في الدفع", + "err.no_codes_left": "لم يتبقى رموز احالات", + "err.wrong_code": "رمز احالة خاطئ", + "err.redeeming_own_code_not_allowed": "لا يسمح باستبدال رموز الشخص نفسه", + "err.wrong_charge_id": "معرف شحن خاطئ", + "err.wrong_link_code": "رمز ارتباط خاطئ", + "err.invalid_credentials": "بيانات اعتماد المستخدم المقدمة غير صالحة", + "footer.reseller": "إجني المال! اصبح بائع تجزئة لدى تطبيق لانترن برو. أنقر هنا", + "footer.reseller.email_subject": "أخبرني عن برنامج البيع بالتجزئة لدى تطبيق لانترن!", + "footer.reseller.email_body": "عندما تصبح بائع بالتجزئة لدى تطبيق لاتيرن، سيكون لديك فرصة كسب 25% على كل بيع لاشتراك لانترن برو. أخبرنا لماذا تود أن تصبح بائع تجزئة أدناه.", + "feature.faster_speed": "أسرع سرعة", + "feature.faster": "مراكز بيانات أكثر سرعة", + "feature.unlimited": "بيانات غير محدودة", + "feature.nologs": "لا توجد سجلات", + "feature.devices": "توصيل ما يصل إلى 3 أجهزة", + "feature.noads": "بدون إعلانات", + "feature.yinbi.tooltip": "ستهدي مؤسسة Yinbi 888 مليارًا من عملة YNB المشفرة حصريًا عبر Lantern لمشتري حسابات Lantern Pro. ستُوزَّع عملات YNB بنهاية كل يوم، بناءً على كمية Yinbi الصادرة في ذلك اليوم، وعدد الأشخاص الذين رقوا حساباتهم أو جددوها، وعدد الأعوام أو الحسابات التي تشتريها، وستودع عملات YNB مباشرة في محفظتك Yinbi Wallet على Lantern!", + "feature.antiblock": "مقاوم للحظر", + "feature.data_center": "مراكز بيانات أفضل", + "feature.free_yinbi": "عملة Yinbi المشفرة بالمجان!", + "free.title": "لانترن برو", + "free.desc": "أسرع. أقوى. غير محدود. آمن.", + "free.link_account": "هل لديك حساب برو بالفعل؟ اربط حسابك.", + "home.get_lantern_pro": "إحصل على لانترن برو", + "home.get_lantern_platinum": "ترقية خطتك", + "home.welcome_popup_subheader": "مرحبا بكم في Lantern الجديد!", + "home.welcome_popup_content_1": "لقد عملنا بجد، وقمنا بتحديث Lantern وإضافة ميزات جديدة.", + "home.welcome_popup_content_2": "في واجهة المستخدم الجديدة، ستجد شريط بحث يسمح لك بالبحث في الملفات المشتركة على شبكة Lantern. يمكنك أيضا المساهمة بالمحتوى عن طريق نشر ملف بنفسك. هذه ميزة تجريبية، لذا قم بتجربتها وأخبرنا برأيك، سنواصل إجراء تحسينات استنادا إلى ملاحظاتك.", + "home.welcome_popup_button": "جربه", + "input.email": "البريد الاكتروني", + "input.your_email": "عنوان البريد الالكتروني الخاص بك", + "input.confirm_email": "تأكيد عنوان البريد الالكتروني", + "input.enter_email": "أدخل بريدك الالكتروني", + "input.use_valid_email": "أكتب عنوان بريد الكتروني صالح", + "input.email_not_match": "حقول البريد الالكتروني غير متطابقة", + "input.existing_email": "البريد الإلكتروني الحالي", + "issue.your_email": "بريدك الالكتروني", + "issue.attach_image_failure": "يتعذّر إرفاق الصورة", + "issue.try_again": "الرجاء المحاولة مجددا", + "issue.select_issue": "يرجى اختيار مشكلة", + "issue.selected_issue": "حدد المشكلة", + "issue.select_issue_hint": "حدد مشكلة من القائمة المنسدلة", + "issue.note": "صِف مشكلتك", + "issue.description": "وصف المشكلة", + "issue.error": "خطأ في ابلاغ عن مشكلة", + "issue.submit": "إرسال تقرير", + "issue.report_screenshot": "اسحب صورة أو اضغط لرفع لقطة شاشة", + "issue.reported": "نشكرك على الإبلاغ عن المشكلة، وسنوافيك برسالة إلكترونية في أقرب فرصة ممكنة", + "issue.report_sent": "تم إرسال التقرير", + "issue.type.no_access": "لا يمكن الوصول الى المواقع المحظورة", + "issue.type.payment_fail": "لا يمكن اكمال الدفع", + "issue.type.cannot_login": "لا يمكن تسجيل الدخول", + "issue.type.always_spinning": "مؤشر التحميل يدور الى ما لا نهاية", + "issue.type.slow": "بطئ", + "issue.type.cannot_link_device": "لا يمكن ربط الأجهزة", + "issue.type.crashes": "فشل في عمل تطبيق لانترن", + "issue.type.other": "أخرى", + "languages.title": "اللغات", + "lantern.email": "البريد الإلكتروني الخاص بـ Lantern", + "mobile.link": "استخدم الرابط لتنزيل تطبيق لانترن على جهاز الأندوريد الخاص بك:", + "mobile.title": "أحصل على اصدار الأندرويد", + "nav.about": "حول", + "nav.account": "ادارة الحساب", + "nav.authorize": "أضف جهاز", + "nav.authorized": "تم منح الاذن للجهاز", + "nav.unauthorized_link": "منح إذن للجهاز لحساب برو", + "nav.language": "لغة", + "nav.lantern": "لانترن", + "nav.mobile": "أحصل على اصدار الهاتف المحمول", + "nav.report_issue": "ابلاغ عن مشكلة", + "nav.settings": "الاعدادات", + "nav.support": "الدعم", + "nav.verify": "تأكيد الحساب", + "nav.yinbi": "استرداد Yinbi", + "nav.home": "الرئيسية", + "nav.discover": "اكتشف", + "nav.wallet": "المحفظة", + "nav.yinbi_wallet": "محفظة Yinbi", + "notification.retry": "إعادة المحاولة", + "notifications": "الإخطارات", + "notifications.whatisnew": "ما أحدث المستجدات؟", + "password.change": "تغيير كلمة المرور", + "password.changed": "تم تغيير كلمة المرور", + "continue.to.pro": "المتابعة الى حساب برو", + "username": "إسم المستخدم", + "password.new": "كلمة مرور جديدة", + "password.requirements": "
يجب أن تحتوي كلمة المرور على ما يلي:
  • 8 أحرف أو أكثر
  • حرف واحد صغير
  • حرف واحد كبير
  • رقم واحد على الأقل
  • ألا يكون ضمن قائمة كلمات المرور التي تمت اختراقها
", + "password.reset": "إعادة تعيين كلمة المرور", + "paxful.buy": "إجراء الشراء", + "paxful.payment": "طريقة الدفع", + "paxful.bitcoin": "بيتكوين (BTC)", + "paxful.tether": "تيثر (USDT)", + "paxful.wallet": "المحفظات عبر الإنرتنت", + "paxful.bank": "التحويلات البنكية", + "paxful.gamer_card": "بطاقات الألعاب", + "paxful.gift_card": "بطاقات الهدايا", + "paxful.cash": "الدفع النقدي", + "paxful.digital_currency": "العملات الرقمية", + "paxful.button": "إظهار أفضل العروض", + "payment.close": "اغلاق", + "payment.redirectErrorTitle": "خطأ في الاتصال بخادم الدفع.", + "payment.redirectErrorText": "نعمل حاليًا على حل هذه المشكلة. يرجى التحقق مرة أخرى في وقت لاحق.", + "payment.wait_for_pro": "نشكرك على شرائك تطبيق لانترن برو! يرجى الانتظار للحظة حتى يتحول حسابك الى حساب لانترن برو تلقائياً.", + "payment.moreOptions": "خيارات إضافية", + "payment.fewerOptions": "خيارات أقل", + "payment_methods.select_name": "حدد وسيلة الدفع", + "payment_methods.alipay": "بطاقة ائتمانية/Alipay", + "payment_methods.shetab": "فاست ورلد باي (شيتاب)", + "payment_methods.shetab.details.header": "لشراء لانترن برو", + "payment_methods.shetab.details.body": "حين تضغط على متابعة للشراء، سيجري توجيهك إلى موقع خارجي لإكمال عملية الدفع والحصول على رمز التنشيط الخاص بك.", + "payment_methods.shetab.details.tutorial_header": "درس تعليمي فارسي", + "payment_methods.shetab.details.purchase_voucher_button": "متابعة للشراء", + "payment_methods.shetab.details.input_code_button": "إدخال رمز التحقق", + "plan.step1": "الخطوة 1", + "plan.apply": "تطبيق", + "plan.step2": "الخطوة 2", + "plan.most_popular": "الأكثر شيوعًا!", + "plan.step3": "الخطوة 3", + "plan.choose_plan": "اختر الخطة", + "plan.enter_email": "أدخل البريد الإلكتروني", + "plan.choose_method": "اختر وسيلة الدفع", + "plan.bestValue": "العرض الأفضل!", + "plan.per_month": "شهريًا", + "plan.yinbi_2x": "+ عملتا Yinbi!", + "plan.oneYear": "1 سنة", + "plan.add_referral": "إضافة رمز الإحالة", + "plan.years": "خطة {{years}} سنوات", + "plan.desc": "تمت فوترة {{price}} مرة واحدة", + "plan.bonus_months": "+ {{bonusMonths}} أشهر", + "plan.price.cny": "ين %.02f", + "plan.price.usd": "دولار %.02f", + "plan.currency.cny": "(رنمينبي)", + "plan.currency.usd": "(دولار أمريكي)", + "plan.time_unit": "\\ريال", + "plan.select": "إختر", + "plan.two_year": "عامان", + "plan.one_year": "عام واحد", + "plan.savings": "وفر {{formattedDiscount}} %", + "plans.title": "خطط لانترن برو", + "plans.lantern_pro": "لانترن برو", + "plans.platforms": "للويندوز، للأندرويد، للماك، للأوبونتو.", + "plans.from_reseller": "هل لديك رمز تنشيط Lantern Pro؟ انقر هنا.", + "plans.with_voucher_code": "ألديك رمز تنشيط؟ اضغط هنا.", + "pro.apply": "سيتم تطبيق رصيدك على حسابك في دورة الفاتورة التالية.", + "pro.title": "ادعوا الأصدقاء واحصل على المزيد من حسابات البرو مجاناً", + "pro.subtitle": "عندما يقوم صديقك بشراء خطة السنتين، سيحصل كل منكما على 3 أشهر اضافية من حساب البرو، خطة السنة الواحدة تمنح كل منكما شهر 1 مجاني.", + "pro.share": "قم بمشاركة الرمز الخاص بك مع أصدقائك لتبدأ في كسب المزيد من الائتمانات!", + "promotion.title": "الدفع لحساب لانترن برو", + "promotion.title.activation": "تفعيل حساب لانترن برو", + "promotion.enter_and_confirm_email": "يرجى ادخال وتأكيد عنوان بريدك الالكتروني", + "promotion.code.hint": "أدخل رمز الاحالة الخاص بصديقك (اختياري)", + "promotion.code.label": "كود الإحالة", + "promotion.payment": "المتابعة في الدفع", + "promotion.payment.btc": "الدفع من خلال ₿", + "promotion.loading": "جاري التحميل...", + "promotion.howto_1y": "اذا قام صديقك بمشاركة رمز الاحالة معك، قم بإدخال الرمز لتتلقى شهر واحد من حساب لانترن برو مجاناً بعد الدفع.", + "promotion.howto_2y": "اذا قام صديقك بمشاركة رمز الاحالة معك، قم بإدخال الرمز لتتلقى ثلاثة أشهر من حساب لاتيرن برو مجاناً بعد الدفع.", + "promotion.pay": "تسديد {{المبلغ}}", + "promotion.select": "إختر", + "promotion.promotion_applied_1y": "+ شهر واحد منحة إضافية", + "promotion.promotion_applied_2y": "+ 3 أشهر منحة إضافية", + "promotion.too_many_referrals": "لقد تم اضافة رمز الاحالة هذا. تحقق الآن كي تتلقى أشهرك الاضافية.", + "promotion.activation.enter_and_confirm_email": "يرجى ادخال وتأكيد عنوان البريد الالكتروني الخاص بك لتسجل حساب لانترن برو الخاص بك.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "رمز التنشيط", + "promotion.activation.instructions": "أدخل بريدك الإلكتروني ورمز التنشيط المكون من 25 رقما الذي تلقيته من البائع لتسجيل حسابك.", + "promotion.activation.howto": "يرجى ادخال رمز تفعيل حساب لانترن برو أعلاة المكون من 25 حرف. اذا لم يكون لديك رمز، يرجى شراء حساب برو من الشاشة السابقة أو قم بالبحث عن بائع تجزئة لحساب لانترن برو على الانترنت.", + "promotion.activation.continue": "التسجيل لـ Pro", + "promotion.voucher.hint": "رمز التنشيط", + "promotion.voucher.howto": "نرجو إدخال رمز تنشيط قسيمة فاست وورلد باي المكوّن من 12 حرفًا أعلاه", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "حدث خطأ أثناء استرداد رمز التنشيط المخصص لك.", + "promotion.voucher.error.invalid_code": "رمز تنشيط غير صالح", + "promotion.voucher.error.invalid_plan": "رمز التنشيط مرتبط بخطة غير صالحة", + "promotion.voucher.error.already_redeemed": "لقد تم استرداد رمز التنشيط بالفعل", + "referral.code": "رمز الإحالة", + "referral.text": "استخدم الرمز الخاص بي %s واحصل على 3 أشهر مجانا عند قيامك بتسجيل اشتراك!", + "referral.description_free": "قم بمشاركة التعليمات البرمجية الخاصة بك مع أصدقائك، واحصل على 1 شهر من خدمة Lantern Pro مجانا عند شراء Pro!", + "referral.description_pro": "قم بمشاركة التعليمات البرمجية الخاصة بك مع أصدقائك واحصل على 1 شهر من خدمة Lantern Pro إضافية مجانا عند شراء Pro!", + "register": "Register", + "renew.subtitle_early": "تجديد لمدة 3 أشهر مجانًا!", + "renew.subtitle_last_day": "تجديد لمدة 3 أشهر مجانًا!", + "renew.subtitle_expired": "قم بالتجديد لمدة 45 يوما مجانًا!", + "renew.details_early": "أوشكت عضويتك بـLantern Pro على الإنتهاء قريبا. جدد الآن واستمتع بما يصل إلى ثلاثة أشهر مجانا!", + "renew.details_last_day": "تنتهي عضويتك في Lantern Pro اليوم! جدد الآن واستمتع بما يصل إلى ثلاثة أشهر مجانًا!", + "renew.details_expired": "انتهت عضويتك في Lantern Pro. جدد الآن واستمتع بما يصل إلى خمسة وأربعين يوما مجانًا!", + "renew.asterisk_early": "* هذا العرض المحدود الوقت صالح فقط للتجديدات المبكرة.", + "renew.asterisk_last_day": "* هذه هي فرصتك الأخيرة لتلقي هذا العرض الخاص!", + "renew.asterisk_expired": "* هذا عرض محدود الوقت!", + "renew.plan_label": "لانترن برو - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s+شهر مجاني واحد", + "renew.plan_renewal_bonus_months": "$%d%s+%dشهور مجانية", + "renew.plan_renewal_bonus_days": "$%d%s+%dأيام مجانية", + "renew.next": "التالي", + "renew.decline": "رفض العرض", + "renew.decline_question": "هل أنت واثق من رفض الطلب؟", + "renew.decline_yes": "التجديد لاحقاً", + "renew.decline_dismiss": "التجديد الآن", + "renew.notification_title_30_days": "تجديد حساب برو الآن لتوفير كبير", + "renew.notification_title_30_days_platinum": "جدد Platinum الآن واحصل على خصومات هائلة!", + "renew.notification_text_30_days": "ستنتهي صلاحية حسابك على {{planName}} في غضون {{remainingDays}} أيام. جدد الآن واحصل على ما يصل إلى 3 أشهر مجانًا.", + "renew.notification_title_2_days": "سينتهي الخصم على {{planName}} غدًا", + "renew.notification_text_2_days": "ستنتهي صلاحية حسابك على {{planName}} غدًا. لا تُضِع فرصة الحصول على خصم كبير.", + "renew.notification_title_last_day": "الفرصة الأخيرة للخصم!", + "renew.notification_text_last_day": "لقد انتهت صلاحية حسابك على {{planName}}. جدد اليوم واحصل على ما يصل إلى 3 أشهر مجانًا.", + "replica.upload": "تحميل", + "replica.favorite": "تفضيل", + "replica.added_to_favorites": "تمت إضافته إلى المفضلة", + "replica.filedrop_error": "خطأ في تحميل هذا الملف", + "replica.filedrop_error.file-too-large": "الحد الأقصى المسموح به لحجم الملف هو {{fileSize}}", + "replica.filedrop_error.file-too-small": "الملف صغير جدا", + "replica.filedrop_error.too-many-files": "ملفات كثيرة جدًا", + "replica.filedrop_error.file-invalid-type": "نوع الملف هذا غير معتمد حاليًا", + "replica.filedrop_remove_file": "إزالة من قائمة الانتظار", + "replica.post": "تحميل ملف", + "replica.relevance": "أهمية", + "replica.upload_date": "تاريخ التحميل", + "replica.gallery_view": "استعراض معرض الصور", + "replica.list_view": "عرض القائمة", + "replica.copy_lantern_link": "نسخ رابط Lantern", + "replica.documents": "الوثائق", + "replica.audio": "صوتي", + "replica.application": "تطبيقات", + "replica.image": "الصور", + "replica.video": "مقاطع فيديو", + "replica.web": "ويب", + "replica.news": "أخبار", + "replica.upload_alert.dont_show": "لا تظهر هذا مرة أخرى", + "replica.upload_alert.cancel": "إلغاء التحميل", + "replica.upload_alert.resume": "استئناف التحميل", + "replica.upload_alert.info": "معلومات هامة!", + "replica.upload_alert.desc1": "يتم توزيع الملفات التي تم تحميلها على Lantern وجعلها لامركزية. بمجرد الوصول إليها من قبل مستخدم آخر لا يمكن حذفها من الشبكة من قبل أي شخص، بما في ذلك Lantern، حتى لو تم حذفها من قائمة \"ملفاتي\".", + "replica.upload_alert.desc2": "يرجى التوقف عن استخدام معلومات التعريف الشخصية في الملف أو اسم الملف عند تحميل محتوى حساس.", + "replica.add_details": "إضافة تفاصيل", + "replica.cannot_edit": "لا يمكن تعديل أسماء الملفات بعد نشرها.", + "replica.next": "التالب", + "replica.previous": "سابق", + "replica.selectAll": "تحديد الكل", + "replica.search_replica": "Search", + "replica.search_results_info": "تظهر علامة التبويب هذه نتائج Lantern فقط .", + "replica.search_results_info_message": "تتألف نتائج Lantern من محتوى تم تحميله من قبل المستخدمين على شبكة Lantern.", + "replica.no_files_found": "لا توجد نتائج", + "replica.or_content": "المحتوى الخاص بك ليجده الآخرون!", + "replica.try_again": "جرب كلمة رئيسية مختلفة، أو", + "replica.upload_success": "تم التحميل بنجاح!", + "replica.cannot_preview": "لا توجد معاينة لهذا النوع من الملفات", + "replica.no_description": "لم يتم توفير وصف", + "replica.size": "الحجم", + "replica.uploaded": "تم التحميل", + "replica.invalid_link": "ارتباط غير صالح", + "replica.close": "اغلاق", + "replica.files": "الملفات", + "replica.upload_history": "تحميل سجل", + "replica.my_favorites": "المفضلة", + "replica.no_uploads": "لا يوجد تحميلات حتى الآن", + "replica.no_favorites": "لا توجد قائمة مفضلات حتى الآن", + "replica.mime_type": "نوع الملف: {{mime}}", + "replica.image_loading_error": "خطأ في تحميل الصورة", + "replica.play": "تشغيل", + "replica.pause": "إيقاف مؤقت", + "replica.scrub": "إلغاء", + "replica.skip_forward": "تخط إلى الأمام", + "replica.skip_backwards": "تخط إلى الخلف", + "replica.trending_videos": "مقاطع الفيديو الرائجة", + "replica.file_uploaded": "تم التحميل: منذ {{days}} من الأيام", + "replica.file_size": "الحجم", + "replica.duration": "المدة", + "replica.filename": "اسم الملف", + "replica.filename_required": "قم بتسمية الملف الخاص بك", + "replica.description_optional": "إضافة وصف", + "replica.expand": "توسيع التفاصيل", + "replica.filetype": "نوع الملف", + "replica.sortby": "الفرز حسب", + "replica.link": "ارتباط نسخة متماثلة", + "replica.collapse": "طي", + "replica.publish": "نشر", + "replica.cancel": "إلغاء", + "replica.progress_current_upload": "تحميل", + "replica.progress_files": "الملفات", + "replica.progress_of": "من", + "replica.progress_upload_complete": "إكمال", + "replica.progress_upload_failure": "فشل التحميل الرجاء المحاولة مرة أخرى.", + "replica.upload_in_progress": "التحميل قيد التقدم", + "replica.upload_pending": "تحميل معلق", + "replica.upload_error": "خطأ في التحميل", + "replica.upload_cancel": "إلغاء التحميل", + "replica.upload_confirm": "هل أنت واثق من إلغاء التحميل؟", + "replica.progress_view": "شاهد", + "replica.delete": "حذف", + "replica.remove": "ازالة", + "replica.delete_file": "حذف الملف", + "replica.remove_favorite": "إزالة من المفضلة", + "replica.failed_to_delete": "فشل الحذف", + "replica.failed_to_remove": "فشل الإزالة", + "replica.link_lookup_failure": "فشل العثور على الرابط", + "replica.delete_file_confirmation_1": "هل تريد الحذف بالتأكيد", + "replica.delete_file_confirmation_2": "من تحميلاتك", + "replica.remove_favorite_confirmation_1": "هل تريد الإزالة", + "replica.remove_favorite_confirmation_2": "من المفضلة لديك", + "replica.share_file": "مشاركة الملف", + "replica.download_and_view": "تنزيل/عرض", + "replica.download": "تحميل", + "replica.copy_link": "نسخ رابط Replica", + "replica.find_file": "البحث عن ملف", + "replica.file_drop_prompt": "قم بإسقاط الملف لبدء التحميل!", + "replica.empty_uploads_text1": "انقر", + "replica.empty_uploads_text2": "هنا", + "replica.empty_uploads_text3": "للقيام بمنشورك الأول.", + "replica.error_header": "عفوًا", + "replica.error": "حدث خطأ أثناء معالجة طلبك. الرجاء المحاولة مرة أخرى.", + "replica.serp_empty": "لم تُرجع Google أية نتائج لهذا الاستعلام.", + "replica.disclaimer": "يخفي Lantern هوية عمليات البحث التي تجريها ويحميها من الجهات الخارجية.", + "settings.general": "عام", + "settings.feedback": "التعليقات", + "settings.autoLaunch": "تشغيل تطبيق لانترن عند بدء النظام", + "settings.autoReport": "قم بالإبلاغ عن احصاءات الاستخدام بأمان للمساهمة في تطبيق لانترن", + "settings.lantern_ads": "عرض إعلانات Lantern", + "settings.lantern_ads_tooltip": "يعرض لك Lantern إعلانات على بعض مواقع الويب للمساعدة في دعم خدمتنا. لا يتم جمع أي معلومات للمستخدم أو تمريرها إلى خوادمنا. إذا قمت بإيقاف تشغيل هذا الخيار، فقد تظل تشاهد الإعلانات، ولكنها لن تكون من شبكة Lantern.", + "settings.proxyAll": "معالجة كل المواقع", + "settings.proxyAllHelpTitle": "ماذا تقوم \"معالجة كل المواقع\"", + "settings.proxyAllHelp1": "اذا قمت بالتمكين، سيتم ارسال جميع الزيارات عبر لانترن (الخيار الأكثر أماناً).", + "settings.proxyAllHelp2": "لو قمت بالتعطيل، سيتم ارسال الزيارات المحظورة فقط عبر تطبيق لانترن (الخيار الأسرع والأكثر شيوعاً).", + "settings.show_advanced": "إظهار الإعدادات المتقدمة", + "settings.hide_advanced": "إخفاء الإعدادات المتقدمة", + "settings.systemProxy": "ادارة بروكسي النظام", + "settings.title": "الاعدادات", + "settings.http_proxy": "وكيل (وكلاء) HTTP:", + "settings.socks_proxy": "بروكسي سوكس:", + "settings.caution": "تحذير:", + "settings.caution_text": "عند عدم فحص \"ادارة خادم النظام\"، فسوف لا يكون متصفحك وتطبيقاتك قادرين على استخدام تطبيق لانترن تلقائياً. اذا كنت تعرف كيفية تكوين هذه الاعدادات يدوياً، فإرجع الى المعلومات أعلاه.", + "settings.select_language": "اختر لغة", + "settings.diagnostics": "إرفاق معلومات التشخيص", + "settings.diagnostics_tooltip": "سيؤدي إرفاق معلومات التشخيص إلى إرسال بيانات فريق Lantern الملتقطة من اتصالك. سيؤدي ذلك إلى زيادة قدرتنا على تحديد مشكلتك وحلها.", + "status.lantern": "تطبيق Lantern هو", + "status.click_reconnect": "انقر هنا لإعادة الاتصال", + "status.server_location": "موقع الخادم", + "status.tooltip1": "يستخدم تطبيق لانترن خيار خادم ذكي للعثور لك تلقائياً على أسرع اتصال ممكن من مراكز البيانات الخاصة بنا.", + "status.tooltip2": "قم بالتحديث إلى Lantern Pro للحصول على سرعة أسرع مع اختيار الخادم الأمثل من مراكز بيانات Lantern Pro الحصرية", + "status.protected_connection": "اتصالك محمي", + "status.please_wait": "قد يستغرق هذا الأمر دقيقة أو دقيقتين...", + "status.connecting": "ربط ...", + "status.no_internet": "إيقاف التشغيل", + "status.no_internet_connection": "لا يوجد اتصال بالإنترنت", + "status.connected": "تشغيل", + "status.disconnected": "إيقاف التشغيل", + "status.throttled": "السرعة محدودة (حد البيانات)", + "status.no_system_proxy": "{{status}}، وليس إدارة وكيل النظام", + "status.fail_to_set_system_proxy": "فشل في تعيين لانترن كوكيل نظام", + "status.fail_to_open_browser": "فشل في فتح نافذة المتصفح لإظهار واجهة مستخدم لانترن", + "support.forum": "منتدى مستخدمي Lantern", + "support.faq": "أسئلة متكررة", + "terms_of_service.acknowledgment": "بالضغط على {{buttonText}}، فأنت توافق على شروط الخدمةلدينا", + "terms_of_service.replica": "من خلال البحث عن منتجاتنا أو تحميلها أو استخدامها بأي شكل من الأشكال، فإنك توافق على شروط الخدمة وسياسة الخصوصية وسياسة DMCA", + "top_sites.google": "Google", + "top_sites.twitter": "تويتر", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "الفيسبوك", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "أدخل أو ألصق رمز ربط الجهاز", + "verify.code": "رمز ربط الجهاز", + "verify.howto_1": "اذا كان لديك حساب لانترن برو على جهاز آخر، فيرجى ادخال عنوان بريدك الالكتروني هنا لتتلقى الرمز للمصادقة على الجهاز", + "verify.howto_1a": "أنت حاليا مستخدم لحساب برو غير مصادق عليه. يرجى إدخال عنوان البريد الإلكتروني الخاص بك لمنح الاذن لحساب برو الخاص بك. سيمكنك ذلك من ربط أجهزة متعددة.", + "verify.howto_2": "لربط جهاز بحسابك في Pro:", + "verify.howto_3": "1. اختر \"تخويل الجهاز لـ Pro\" من قائمة جهازك الآخر.", + "verify.howto_4": "2. أدخل رمز الربط الذي حصلت عليه في الخطوة 1، ومن ثم قم بالتسليم.", + "verify.reminder": "* تأكد من أن كلا الجهازين يعملان بأحدث إصدار من Lantern", + "verify.enter_pin": "أدخل أو الصق رمز ربط الجهاز", + "verify.submit": "ارسال", + "verify.title": "تأكيد الحساب", + "welcomeToPro.continue": "المتابعة الى حساب برو", + "welcomeToPro.invite": "ادعو الأصدقاء وكل منكما سيحصل على 3 شهور مجاناً عندما يقومون بشراء خطة لسنتين، خطة السنة الواحدة تمنح كل منكما شهر 1 مجاني. ابدأ بدعوة أصدقائك!", + "welcomeToPro.thanks": "لديك الآن وصول غير محدود باستخدام أسرع مراكز البيانات لدينا. يمكنك ربط ما يصل إلى ثلاثة أجهزة بحسابك. ", + "welcomeToPro.title": "اهلاً بك في تطبيق لانترن برو", + "welomeToPro.title_exclamation": "مرحبا بك في لانترن برو!", + "purchase.failed": "فشلت عملية الشراء، يرجى إعادة المحاولة فيما بعد.", + "purchase.success": "نجحت عملية الشراء", + "purchase.success_title": "أهلًا بك في Lantern {{planType}}!", + "purchase.success_content_pro": "لديك الآن وصول غير محدود باستخدام أسرع مراكز البيانات لدينا. يمكنك ربط ما يصل إلى ثلاثة أجهزة بحسابك. ", + "purchase.success_content_platinum": "لديك الآن وصول غير محدود باستخدام أسرع الخطوط المخصصة ومراكز البيانات لدينا. يمكنك ربط ما يصل إلى ثلاثة أجهزة بحسابك. ", + "welcomeToPro.description": "يمكنك الآن الوصول غير المقيد إلى المواقع والخدمات المحظورة", + "messages.copied_to_clipboard": "تم نسخ الرمز. شاركه مع أصدقائك!", + "messages.datacap": "لقد استخدمت بيانات السرعة المجانية. قم بالترقية الى برو لبيانات سرعة عالية غير محدودة.", + "messages.fatal_error": "عذراً، لدينا مشكلة في الاتصال بخوادم لانترن. يرجى التحقق من اتصالك بالانترنت وحاول مرة أخرى.", + "messages.backend_gone": "عذراً، يبدو ان تطبيق لانترن لم يعد يعمل. يرجى اعادة تشغيل لانترن وحاول مرة أخرى.", + "messages.get_help": "مساعدة", + "freeProCredits.title": "ادعو أصدقائك", + "freeProCredits.shareWithFriends": "شارك الرمز الخاص بك مع أصدقائك لكسب أشهر مجانية!", + "freeProCredits.shareWithFriendsDesc": "عندما يشتري صديقك خطة السنتين، فكل منكما سيحصل على 3 شهور مجاناً، خطة السنة الواحدة تمنح كل منكما شهر 1 مجاني.", + "cards.serverLocation.unknown": "غير معروف", + "cards.serverLocation.description": "موقع خادم محسّن", + "cards.serverLocation.description-free": "موقع الخادم", + "cards.serverLocation.description-upgrade": "ترقية للخوادم الأسرع", + "cards.serverLocation.title": "الموقع الحالي:", + "cards.serverLocation.location": "%s، %s", + "cards.serverLocation.text": "يستخدم تطبيق لانترن خيار خادم ذكي للعثور لك تلقائياً على أسرع اتصال ممكن من مراكز البيانات لدينا في طوكيو، وسنغافورا، وهونج كونج، وسان فرانسيسكو، ونيويورك، وأمستردام، والبنغالور والكثير من الدول الاخرى.", + "cards.serverLocation.text-free": "يستخدم تطبيق لانترن خيار خادم ذكي للعثور لك تلقائياً على أسرع اتصال ممكن من مراكز البيانات الخاصة بنا.", + "cards.serverLocation.upgrade-link": "قم بالترقية الى لانترن برو للحصول على سرعة أسرع مع خيار الخادم الأمثل من مراكز بيانات حساب لانترن برو الحصرية.", + "cards.httpsUpgrades.description": "ترقيات HTTPS:", + "cards.httpsUpgrades.title": "ترقيات HTTPS: %d", + "cards.httpsUpgrades.text": "يقوم تطبيق لانترن تلقائياً بالترقية الى اتصالات HTTP غير آمنة الى اتصالات HTTP مشفرة عندما يكون ذلك ممكنا للحفاظ على المعلومات الخاصة بك أثناء تصفح الإنترنت.", + "cards.adsBlocked.description": "لقد تم حظر الاعلانات", + "cards.adsBlocked.title": "لقد تم حظر الاعلانات: %d", + "cards.adsBlocked.text": "يقوم لانترن بحظر الاعلانات المتطفلة لتسريع وقت تحميل صفحة الويب، وحفظ النطاق الترددي، وتزويدك بتجربة تصفح أكثر سلاسة.", + "cards.dataUsage.description": "استخدام البيانات", + "cards.dataUsage.upgrade": "قم بالترقية الآن", + "cards.dataUsage.mb-used": "لقد استخدمت %d/%dميجابيت من بيانات السرعة العالية الشهرية.", + "cards.dataUsage.upgrade-link": "قم بالترقية الآن لخدمة سرعة عالية غير محدودة!", + "cards.subscription.description": "اشتراك برو", + "cards.subscription.renew": "اعادة التجديد", + "cards.subscription.months": "لديك %d شهور من حساب لانترن برو المتبقى في اشتراكك.", + "cards.subscription.days": "لديك %dأيام من حساب لانترن برو المتبقي في اشتراكك.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "أيام", + "cards.subscription.renew-link": "قم باعادة تجديد اشتراكك لاضافة المزيد من الوقت.", + "auth.email": "البريد الاكتروني", + "auth.username": "إسم المستخدم", + "auth.username.or.email": "اسم المستخدم أو البريد الإلكتروني", + "auth.signin": "تسجيل الدخول", + "current.password": "كلمة المرور الحالية", + "new.password": "كلمة مرور جديدة", + "auth.change.password": "تغيير كلمة المرور", + "confirm.new.password": "تأكيد كلمة المرور الجديدة", + "auth.password": "كلمة المرور", + "auth.have.recovery.phrase": "هل لديك عبارة استرداد؟", + "auth.forgot.password": "هل نسيت أو لم يكن لديك كلمة السر؟", + "auth.create.account": "إنشاء حساب", + "auth.missing.username": "اسم المستخدم المفقود", + "auth.missing.current.password": "فقدان كلمة المرور الحالية", + "auth.missing.new.password": "فقدان كلمة مرور جديدة", + "auth.missing.confirm.password": "تأكيد كلمة السر غير مكتمل", + "invalid_credentials": "بيانات اعتماد غير صالحة", + "yinbi.wallet": "محفظة Yinbi", + "create.wallet": "إنشاء محفظة", + "new.to.yinbi": "هل أنت مستخدم جديد لـ Yinbi؟", + "setup.wallet": "نعم ، لنقم بإنشاء محفظة جديدة!", + "web.wallet": "لا، لدي محفظة على موقع Yin.bi", + "yinbi.next": "التالب", + "yinbi.amount": "مبلغ", + "yinbi.missing.address": "لم يتم توفير عنوان الوجهة", + "yinbi.missing.amount": "لم يتم تحديد مبلغ", + "yinbi.missing.email": "لم يتم تحديد عنوان بريد إلكتروني", + "yinbi.missing.username": "لم يتم تحديد اسم مستخدم", + "yinbi.missing.password": "لم يتم تحديد كلمة مرور", + "yinbi.invalid.address": "{{destination}} عنوان Stellar غير صالح", + "yinbi.send": "إرسال", + "yinbi.to": "لكي:", + "yinbi.try_again": "حاول مرة أخرى؟", + "yinbi.success.transaction": "معاملة ناجحة!", + "yinbi.failure.transaction": "فشل المعاملة", + "yinbi.confirm.transaction": "تأكيد المعاملة", + "yinbi.sent.details": "أرسلت {{amount}} YNB إلى {{destination}}", + "yinbi.sent.failure.details": "فشلت معاملتك للأسباب التالية:", + "yinbi.recipient": "المستلم", + "yinbi.available.send": "لديك {{balance}} YNB متاحة لإرسال", + "yinbi.wallet.header": "المحفظة", + "yinbi.send.header": "أرسل Yinbi", + "yinbi.recovery.phrase": "عبارة استرداد Yinbi", + "yinbi.recover.account": "أدخل أو الصق عبارة استرداد Yinbi لاسترداد محفظة Yinbi وحساب Lantern", + "yinbi.recovery.desc": "استخدم هذه الطريقة إذا كنت ترغب في تسجيل الدخول إلى محفظة Yinbi بالإضافة إلى حساب Lantern الخاص بك", + "yinbi.redeem.codes": "استرداد رموز Yinbi المجمعة", + "yinbi.obtain.codes": "يمكن الحصول على رموز استرداد Yinbi المجمعة من reseller.lantern.io", + "yinbi.receive.header": "استقبال Yinbi", + "yinbi.this.is.your.wallet": "هذا هو عنوان محفظة Yinbi حيث يمكن للناس أن يرسلوا لك YNB.", + "yinbi.your.address": "عنوانك", + "yinbi.no.activity.header": "لا يوجد نشاط", + "yinbi.upgrade.pro.button": "قم بالتحديث إلى Pro واحصل على Yinbi مجانًا", + "yinbi.renew.pro.button": "قم بتجديد Pro والحصول على Yinbi مجانا", + "yinbi.wallet.activity_header": "نشاط", + "yinbi.wallet.send": "إرسال", + "yinbi.wallet.receive": "استلم", + "yinbi.wallet.balance": "رصيد حساب", + "yinbi.wallet.getlantern.pro": "قم بالترقية إلى Lantern Pro واحصل على Yinbi مجانًا", + "yinbi.redemption.codes": "رموز الاسترداد الخاصة بـ Yinbi", + "redeem_codes.title": "استرداد رموز Yinbi", + "redeem_codes.redeem_button_text": "استرداد", + "redeem_codes.cancel_button_text": "إلغاء", + "redeem_codes.success": "تم بنجاح", + "redeem_codes.errors.missing_codes": "لم يتم إدخال أكواد صالحة", + "redeem_codes.errors.invalid_codes": "خطأ، يرجى التحقق من الرموز المميزة. انتهت صلاحية الرموز المشطوبة ولا يمكن استردادها .", + "yinbi.new.account.text": "ستظهر معاملاتك هنا بمجرد إرسال أو استقبال Yinbi .", + "yinbi.createAccount": "إنشاء حساب", + "yinbi.confirm.account.text": "للتأكد من كتابة العبارة بشكل صحيح، يرجى إدخال الكلمات التالية من عبارة الاسترداد الخاصة بك", + "create_account.invalid_words.error": "لم تتطابق الكلمات التي تم إدخالها مع كلمات عبارة مرور الاسترداد", + "yinbi.recovery_text": "هذه هي عبارة استرداد محفظة Yinbi الخاصة بك. إنها الطريقة الوحيدة لاستعادة محفظة Yinbi\nفي حالة نسيان كلمة المرور. استخدم مدير كلمة المرور أو قم بإنشاء نسخة مطبوعة عند\nتخزين هذه العبارة.", + "yinbi.recovery_confirm_text": "هذه هي عبارة استرداد محفظة Yinbi الخاصة بك. إنها الطريقة الوحيدة لاستعادة محفظة Yinbi الخاصة بك في حالة نسيان كلمة المرور. استخدم مدير كلمة المرور أو قم بعمل نسخة مطبوعة عند تخزين هذه العبارة.", + "yinbi.import.wallet": "استيراد المحفظة", + "yinbi.setup.wallet": "إعداد المحفظة", + "yinbi.importWallet": "استيراد محفظة Yin.bi", + "yinbi.import.wallet.continue": "تابع إلى محفظتك", + "yinbi.import.wallet.success": "تم استيراد المحفظة بنجاح!", + "yinbi.wallet.text": "للوصول إلى محفظة Yinbi، يمكنك إنشاء حساب أو تسجيل الدخول أو\nاستيراد محفظتك من Yin.bi في حال قمت بالتسجيل المُسبق في موقع Yin.bi\n.", + "yinbi.wallet.pro.text": "للوصول إلى محفظة Yinbi، يمكنك إنشاء حساب واستيراد محفظتك من Yin.bi إذا كنت قد قمت بالتسجيل المُسبق.", + "yinbi.recovery_subheader": "عبارة استرداد محفظة Yinbi", + "yinbi.import_wallet.subheader": "استيراد محفظة Yinbi", + "yinbi.import_wallet.text": "قم بتسجيل الدخول باستخدام بيانات اعتماد Yin.bi لنقل محفظتك إلى Lantern", + "yinbi.import_wallet.success": "تم استيراد محفظتك بنجاح، يرجى إضافة بريدك الإلكتروني لإكمال تسجيل الحساب.", + "yinbi.import_wallet.success_subheader": "تم الاستيراد بنجاح!", + "yinbi.import_wallet.button": "استيراد محفظة Yin.bi", + "yinbi.import_wallet.success_button": "اكمل التسجيل", + "yinbi.recovery_passphrase.label_text": "عبارة الاسترداد", + "yinbi.recovery_passphrase.copy_button_text": "نسخ", + "terms_of_service.notice": "تنبيه", + "terms_of_service.i_agree": "أوافق", + "platinum": "Platinum", + "platinum.one_year": "سعر شراء عام واحد", + "platinum.two_years": "سعر شراء عامين", + "platinum.save": "تخفيض حتى {{savings}}%!", + "platinum.unlimited": "بيانات غير محدودة", + "platinum.logs": "لا توجد سجلات", + "platinum.devices": "توصيل ما يصل إلى 3 أجهزة", + "platinum.everything_in_pro": "كل شيء مضمن في Pro", + "platinum.faster_data": "مراكز بيانات أكثر سرعة", + "platinum.dedicated": "الخط المخصص", + "platinum.reliability": "الموثوقية الزائدة", + "platinum.platinum_one_year": "Lantern Platinum لعام واحد", + "platinum.platinum_two_years": "Lantern Platinum لعامين", + "platinum.pro_one_year": "Lantern Pro لعام واحد", + "platinum.pro_two_years": "Lantern Pro لعامين", + "platinum.total": "المجموع", + "platinum.free": "مجانًا", + "platinum.credit.days": "+ {{ days }} يوم/أيام", + "platinum.credit.months": "{{ شهور }} شهر(شهور)", + "platinum.upgrade": "ترقية إلى Platinum", + "platinum.upgrade_details": "خط مخصص + مراكز بيانات أسرع!", + "platinum.unused_time_disclaimer": "سيرى مستخدمو Pro الذين يترقون إلى Platinum اشتراكهم بـPro المحول مدرجًا في صورة وقت إضافي بالأعلى.", + "p2p.opt_in_description": "استخدم اتصالك بالإنترنت لمساعدة الناس في الاتصال بالإنترنت دون رقابة", + "p2p.active_sharing_description": "مشاركة الإنترنت قيد التشغيل", + "p2p.dialog.title": "مشاركة الاتصال بالإنترنت", + "p2p.dialog.text.1": "ساعد الآخرين ممن لديهم اتصال محدود بالإنترنت عن طريق مشاركة اتصالك. عندما تسمح باستخدام اتصالك بالإنترنت، ستكون جزءًا من شبكة المتطوعين الذين يعملون على زيادة توفير الإنترنت.", + "p2p.dialog.text.2": "لن تكشف المشاركة عن هويتك أو تؤثر على أمانك. كما يمكنك التوقف عن مشاركة اتصالك بالإنترنت وقتما تشاء.", + "p2p.dialog.yes_button": "نعم، أوافق على بدء المشاركة", + "p2p.dialog.no_button": "إلغاء", + "p2p.banner.introducing": "مقدمة تعريفية", + "top_sites.top_sites": "أفضل المواقع" +} \ No newline at end of file diff --git a/locale/translation/az.json b/locale/translation/az.json new file mode 100644 index 000000000..a99430ba4 --- /dev/null +++ b/locale/translation/az.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW_LANTERN": "Lantern-i Göstər", + "TRAY_UPGRADE_TO_PRO": "Pro-ya yüksəlt", + "TRAY_QUIT": "Lantern Dayansın", + "BACKEND_DATA_TITLE": "Lantenin yüksək sürəti dayandırıldı", + "BACKEND_DATA_MESSAGE": "Lanterni daha yüsək sürətlə əldə etmək üçün Pro versiyasına yüksəldin!", + "BACKEND_DATA_PERCENT_TITLE": "Lanterndə %s istifadə etdiniz", + "BACKEND_DATA_PERCENT_MESSAGE": "Siz bu ayın Lantern yüksək sürətinin %s istifadə etdiniz. İndi yüksəldin!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern İnternetə sürətli, davamlı və təhlükəsiz qoşulma təmin edir.", + "about.faq": "Lantern-in TTVS-ini oxuyun", + "about.open": "Hər Kəs Üçün Açıq İnternet", + "about.questions": "Suallar?", + "about.title": "Haqqında", + "account.cancel": "Pro hesabını dayandır", + "account.free.cap": "Aylıq pulsuz həcmin {{mb}} qalıb", + "account.free.cap.upgrade": "Limitsiz sürətli həcmi olan Pro versiyasına yüksəlt", + "account.freelink.validFor": "%s üçün uyğun", + "account.freelink.desc": "Pro hesabınızla bu aləti birləşdirmək üçün:", + "account.freelink.step1": "1. \"Alət əLavə et\" menyusunu Pro alətinizdə açın.", + "account.freelink.step2": "2. Alətin qoşma kodunu yazın və göndərin.", + "account.freelink.reminder": "Pro alətinizdə Lanternin son versiyasına yenilədiyinizə əin olun.", + "account.freelink.errorTitle": "Qoşulma xətası", + "account.freelink.errorText": "Pro alətinizdəki kodu əlavə etdiyinizə əminsiniz?", + "account.freelink.headerDesc": "Bu aləti Pro hesabınıza qoşun", + "account.freelink.title": "Alətin qoşulma kodu", + "account.pro.charge": "Ödəmə dövrünün sonunda hesabınızdan avtomatik olaraq daha bir ili ərzində Lantern Pro üçün ödəniş alınacaq.", + "account.upgrade": "Pro-ya yüksəlt", + "account.pro.email": "Email ünvanı:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(Bu alət)", + "account.pro.logout": "Çıx", + "account.pro.removedevice": "SİL", + "account.pro.devices": "Pro hesabınızı istifadə edən alət:", + "account.pro.device.confirm.title": "Aləti çıxart", + "account.pro.device.confirm": "'{{device}}' Lantern Pro hesabınızdan çıxartmaq istədiyinizə əminsiniz?", + "account.pro.device.one.title": "Yalnız bir alət", + "account.pro.device.one": "Üzr istəyirik, amma siz qeyd olunan aləti çıxara bilməzsiniz.", + "account.pro.linkingcode": "Alətin qoşulma kodu:", + "account.pro.renew": "PRO HESABINI YENİLƏ", + "account.prolink.errorTitle": "Qoşulmada xətası", + "account.prolink.errorText": "Digər alətinizdən kodu düzgün yapışdırdığınıza əminsiniz?", + "account.prolink.successTitle": "Alət qoşuldu", + "account.prolink.successText": "Siz alətinizi uğurla qoşdunuz! Xahiş edirik digər alətinizin avtomatik olaraq pro olmasını gözləyin.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Ləğv et", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kart nömrəsi", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Ay", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "İl", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Yenidən yoxlayın", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Alətinizin Pro olması üçün təsdiqləyin", + "authorize.step1.have_pro_device": "Başqa Lantern Pro alətim var", + "authorize.step1.link": "Bu aləti qoş", + "authorize.step1.or": "və ya", + "authorize.step1.recover": "Lantern Pro hesabımı açmaq istəyirəm", + "authorize.step1.start": "yadasalmanı başla", + "authorize.step1.no_mail": "Email ünvanınızı unutmusunuz?", + "authorize.step2b.enter_code": "Hesab yadasalma kodunu yazın", + "authorize.step2b.code": "Hesab yadasalma kodu", + "authorize.step2b.instruction": "{{email}} yadasalma kodu ilə bağlı email alacaq. Bu emailin gəlməsi bir neçə saat çəkə bilər. Onu tapmasanız, zəhmət olmasa spam qutusuna baxın.", + "authorize.step2b.no_mail": "Email almadım", + "authorize.step3.recovery": "Hesabın yadasalınması", + "authorize.step3.no_email": "Ay! Email ünvanını tapmaqda çətinlik çəkirik. Sizin hesabınızı müəyyənləşdirməyimizə yardı etmək üçün aşağıdakı əlavə məlumatları verin.", + "authorize.step3.no_code_received": "Yadasalma emailini almaqda çətinlik çəkirsiniz? Aşağıdakı məlumatları doldurun və biz sizinlə 48 saat ərzində əlaqə saxlayacağıq.", + "authorize.step3.your_email": "Emailiniz", + "authorize.step3.payment_method": "Ödəniş üsulu", + "authorize.step3.payment_method_hint": "Pro əldə etmək üçün ödəniş üsulunu seçin", + "authorize.step3.credit_card": "Kredit Kartı", + "authorize.step3.alipay": "Alipay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Dostunuza məsləhət görməklə Pro əldə edin", + "authorize.step3.payment_account": "Ödəniş hesabı", + "authorize.step3.payment_account_hint": "Alipay ödəniş məlumatlarınızı qeyd edin", + "authorize.step3.referral_code": "Məsləhət kodunuz", + "authorize.step3.purchase_date": "Alınma tarixi", + "authorize.step3.note": "Nəzərə alın ki, başqa digər məlumatlar sizin hesabınızı tapmağa kömək edəcək.", + "authorize.step4.title": "Hesabın yadasalınması baş verir", + "authorize.step4.text1": "Çox sağ olun! Sizin hesab yadasalınması tələbinizi aldıq.", + "authorize.step4.text2": "48 saat ərzində sizn Pro hesabınıın məlumatları yenilənəcək.", + "authorize.step4.text3": "Əvvəlki pəncərədə göstərilən email ünvanına məlumat göndərəcəyik.", + "authorized.continue": "Pro-ya davam et", + "authorized.text": "Alət artıq Lantern Pro hesabını istifadə edə bilər!", + "authorized.title": "Alət təsdiqləndi", + "button.renew": "Renew", + "button.upgrade": "Yüksəlt", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Lantern Pro-ya yüksəlt", + "button.copy_your_code": "Kodunuzu kopyalayın", + "button.try_again": "Yenidən yoxlayın", + "button.continue": "Continue", + "bullet.click_button": "Aşağıdakı düyməni basın", + "bullet.paste_code": "İsmarışın içinə kodu və yükləmə linkini yapışdırın", + "bullet.send_to_friends": "Dostkarlnlza göndərin", + "cancel": "Ləğv et", + "confirm": "Təsdiqlə", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Bilinməyən xəta", + "err.internal_error": "Daxili xəta", + "err.bad_input": "Səhv daxiletmə", + "err.not_authorized": "Təsdiqlənməyib", + "err.user_exists": "İstifadəçi vardır", + "err.no_such_user": "Belə istifadəçi yoxdur", + "err.user_already_verified": "İstifadəçi artıq təsdiqlənib", + "err.invalid_user_verification": "İstifadəçinin səhv təsdiqlənməsi", + "err.user_unverified": "İstifadəçi təsdiqlənməyib", + "err.operation_temporarily_unavailable": "Əməliyyat müvəqqəti olaraq mümkün deyil", + "err.wrong_or_inexistent_plan": "Səhv və ya olmayan plan", + "err.user_has_active_subscription": "İstifadəçinin aktiv abunəsi var", + "err.payment_error": "Ödəniş səhvi", + "err.no_codes_left": "Məsləhət kodları bitib", + "err.wrong_code": "Səhv məsləhət kodu", + "err.redeeming_own_code_not_allowed": "Kodların tələb olunmasına icazə verilmir", + "err.wrong_charge_id": "İD dəyişikliyində səhv", + "footer.reseller": "Pul qazan! Lantern Pro satıcısı ol. Kliklə.", + "footer.reseller.email_subject": "Lantern Satıcısı proqramı haqda öyrənmək istəyirəm!", + "footer.reseller.email_body": "Lantern Satıcısı olanda hər Lantern Pro abunəliyi üçün 25% o qazanacaqsınız. Aşağıda özünüz haqqında məlumat verin və niyə satıcı olmağınızı izah edin.", + "feature.faster_speed": "Yüksək sürət", + "feature.faster": "Faster data centers", + "feature.unlimited": "Limitsiz plan", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Reklamsızdır", + "feature.antiblock": "Qarşısı alınmaz", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Lantern Pro əldə et", + "input.email": "Email", + "input.your_email": "Email ünvanınız", + "input.confirm_email": "Email ünvanı təsdiqlə", + "input.enter_email": "Emaili əlavə et", + "input.use_valid_email": "Düzgün email ünvanı yazın", + "input.email_not_match": "Email sahələri uyğun gəlmir", + "issue.your_email": "Emailiniz", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Yenidən sınayın", + "issue.select_issue": "Hadisəni seç", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Düşən menyudan seçim edin", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Xəta haqda məlumat", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Bloklanan sayta girmək alınmadı", + "issue.type.payment_fail": "Ödəniş bitmədi", + "issue.type.cannot_login": "Daxil olmaq alınmır", + "issue.type.always_spinning": "Yükləmə dayanmadan fırlanır", + "issue.type.slow": "Yavaş", + "issue.type.cannot_link_device": "Alətləri qoşa bilmir", + "issue.type.crashes": "Lantern işləmədi", + "issue.type.other": "Digər", + "languages.title": "Dillər", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Haqqında", + "nav.account": "Hesab idarəçiliyi", + "nav.authorize": "Alət artır", + "nav.authorized": "Alət təsdiqlənib", + "nav.unauthorized_link": "Alətinizin Pro olması üçün təsdiqlə", + "nav.language": "Dil", + "nav.lantern": "Lantern", + "nav.mobile": "Mobil versiya əldə et", + "nav.report_issue": "Məsələni xəbər ver", + "nav.settings": "Seçimlər", + "nav.verify": "Hesab təsdiqlənməsi", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Ev", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Təkrar Sına", + "notifications.whatisnew": "What's New?", + "payment.close": "Close", + "payment.wait_for_pro": "Lantern Pro aldığınız üçün minnətdarıq! Sizin Lanternin avtomatik Pro olması üçün bir az gözləyin.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Ən ucuz!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 il", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Seç", + "plans.title": "Lanten Pro Planları", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Windows, Android, Mac, Ubuntu üçün.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Sizin kreditiniz növbəti ödəniş dövrü üçün hesablanacaq.", + "pro.title": "Dostlarınızı dəvət etməklə, Pro-n pulsuz əldə edin", + "pro.subtitle": "Dostunuz iki illik plan aldıqda hər biriniz əlavə 3 ay Pro-nu əldə edirsiniz. Bir illik planda isə əlavə 1 ayı əldə edirsiniz.", + "pro.share": "Kodu dostlarınızla paylaşın ki, əlavə kreditlər qazanasınız!", + "promotion.title": "Lantern Pro Ödəniş", + "promotion.title.activation": "Lantern Pro aktivasiyası", + "promotion.enter_and_confirm_email": "Ümailnizi əlavə edin və təsdiqləyin", + "promotion.code.hint": "Dostunuzun məsləhət kodunu əlavə edin (məcburi deyil)", + "promotion.code.label": "Məsləhət kodu", + "promotion.payment": "Ödənişə davam", + "promotion.loading": "Yüklənir...", + "promotion.howto_1y": "Əgər dostunuz sizinlə məsləhət kodunu paylaşıbsa, kodu əlavə etdikdə Lantern Pro-nu bir aylıq pulsuz əldə edəcəksiniz.", + "promotion.howto_2y": "Əgər dostunuz sizinlə məsləhət kodunu paylaşıbsa, kodu əlavə etdikdə Lantern Pro-nu üç aylıq pulsuz əldə edəcəksiniz.", + "promotion.pay": "Ödə {{amount}}", + "promotion.select": "Seçim", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Bu məsləhət kodu tətbiq olundu! Çıxan kimi əlavə aylar əldə edəcəksiniz", + "promotion.activation.enter_and_confirm_email": "Lantern Pro hesabının qeydiyyatı üçün emailinizi əlavə edin və təsdiqləyin.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Aktivasiya kodunu əlavə edin", + "promotion.activation.howto": "Lantern Pro üçün 25 işarəlik aktivasiya kodunu əlavə edin. Əgər kodunuz yoxdursa, əvvəlki pəncərədən Pro alın və ya Lantern Pro satıcısını onlayn axtarın.", + "promotion.activation.continue": "Pro-ya davam et", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Məsləhət kodunuzu paylaşın", + "referral.text": "Mənim kodumu istifadə et %s və qeydiyyatdan keçdikdən sonra 3 ayı pulsuz əldə et.", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Sənədlər", + "replica.other": "Digər", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Növbəti", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Ölçü", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Close", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Ləğv et", + "replica.delete": "Sil", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Download", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Ümumi", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Sistem başlayandan Lantern işləsin", + "settings.autoReport": "Lanternə yardım etmək üçün istifadə statistikasını təhlükəsiz göndərin", + "settings.proxyAll": "Bütün trafiki proksidən keçir", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Sistem proksisini idarə et", + "settings.title": "Seçimlər", + "settings.http_proxy": "HTTP(S) proksi:", + "settings.socks_proxy": "SOCKS proksi:", + "settings.caution": "Xəbərdarlıq:", + "settings.caution_text": "\"Sistem proksini idarə et\" seçmədikdə sizin brauzer və tətbiqetmələr Lanterni avtomatik istifadə edə bilməyəcəklər. Əgər bu quraşdırmaları idarə etməyi bacarırsınızsa, yuxarıdakı məlumatlara əsaslanın.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connecting...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Pro hesabına başqa aləti qoşmaq istəyirsiniz? Alət qoşma kodunu aşağıya əlavə et", + "verify.code": "Alətin qoşulması kodu", + "verify.howto_1": "Əgər başqa alətinizdə Lantern Pro hesabınız varsa, burada email ünvanınızı qeyd etməklə alətiniz üçün təsdiqlənməni ala bilərsiniz", + "verify.howto_1a": "Hazırda təsdiqlənməmiş Pro istifadəçisiniz. Təsdiqləmək üçün öz email ünvanınızı qeyd edin. Bunun köməkliyi bir neçə aləti qoşa biləcəksiniz.", + "verify.howto_3": "1. \"Pro üçün aləti təsdiqləyin\" menyusunu təsdiqlənməmiş alətinizdən açın.", + "verify.howto_4": "2. Birinci addımdan alınan kodu aləvə edin və göndərin.", + "verify.reminder": "Təsdiq olunmamış alətinizdə ən son versiya Lanterni yüklədiyinizə əmin olun", + "verify.submit": "Göndər", + "verify.title": "Hesab təsdiqlənməsi", + "welcomeToPro.continue": "Pro-ya davam et", + "welcomeToPro.invite": "Dostlarınızı dəvət edin və 2 illik planı alsalar hər biriniz pulsuz 3 ay, 1 illik planı alsalar 1 ay pulsuz əldə edəcəksiniz. Dəvət etməyə başla!", + "welcomeToPro.thanks": "Lantern Pro aldığınıza görə minnətdarıq!", + "welcomeToPro.title": "Lantern Pro-ya xoş gəlmisiniz", + "messages.copied_to_clipboard": "Kod kopyalanıb. Dostlarınızla paylaşın!", + "messages.datacap": "Pulsuz sürətli planınızı istifadə etdiniz. Yüksək sürət əldə etmək üçün Pro-ya yüksəlt.", + "messages.fatal_error": "Üzr istəyirik, Lantern serverlərinə qoşulmaqda çətinlik çəkirik. İnternet qoşulmanızı yoxlayın və yenidən sınayın.", + "messages.backend_gone": "Üzr istəyirik, Lantern qoşulmayıb. ZƏhmət olmasa Lanterni yenidən yükləyin.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Dostları dəvət et", + "freeProCredits.shareWithFriends": "Kodunuzu dostlarınızla paylaşın və pulsuz üç ay qazanın!", + "freeProCredits.shareWithFriendsDesc": "Dostunuz iki illik plan aldıqda hər ikiniz 3 ay pulsuz əldə edirsiniz, bir illik aldıqda pulsuz 1 ay qazanırsınız.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/be.json b/locale/translation/be.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/be.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/bg.json b/locale/translation/bg.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/bg.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/bn.json b/locale/translation/bn.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/bn.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/bs.json b/locale/translation/bs.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/bs.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/bs_BA.json b/locale/translation/bs_BA.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/bs_BA.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/ca.json b/locale/translation/ca.json new file mode 100644 index 000000000..95753aef4 --- /dev/null +++ b/locale/translation/ca.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connecta", + "TRAY_DISCONNECT": "Desconnecta", + "TRAY_SHOW_LANTERN": "Mostra Lantern", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Surt de Lantern", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Ajuda", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "El Lantern és una aplicació que proporciona un accés ràpid, segur i de confiança a la Internet oberta.", + "about.faq": "Llegir les preguntes més freqüents", + "about.open": "Internet oberta per a tothom", + "about.questions": "Preguntes?", + "about.title": "Quant a", + "account.cancel": "Cancel·la el compte PRO", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Al finalitzar el cicle de facturació, carregarem automàticament un altre any del Lantern Pro al vostre compte.", + "account.upgrade": "Upgrade to Pro", + "account.pro.email": "Email Address:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Cancel·lar", + "adyen.dismissButton": "D'acord", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Número de targeta", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Autoritza dispositiu per a PRO", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Link this device", + "authorize.step1.or": "o", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "El vostre codi de referència", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Dispositiu autoritzat", + "button.renew": "Renew", + "button.upgrade": "Actualitza", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Actualitza a Lantern Pro", + "button.copy_your_code": "Copieu el vostre codi", + "button.try_again": "Try again", + "button.continue": "Continuar", + "bullet.click_button": "Feu clic al botó d'avall", + "bullet.paste_code": "Enganxa el codi i l'enllaç per descarregar en un missatge", + "bullet.send_to_friends": "Envieu als vostres amics", + "cancel": "Cancel·lar", + "confirm": "Confirm", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Error desconegut", + "err.internal_error": "Error intern", + "err.bad_input": "Entrada incorrecta", + "err.not_authorized": "Not authorized", + "err.user_exists": "L'usuari existeix", + "err.no_such_user": "No aquest usuari", + "err.user_already_verified": "L'usuari ja s'ha verificat", + "err.invalid_user_verification": "Verificació d'usuari invàlida", + "err.user_unverified": "Usuari no verificat", + "err.operation_temporarily_unavailable": "Operació inhabilitada temporalment", + "err.wrong_or_inexistent_plan": "Pla inexistent o erroni", + "err.user_has_active_subscription": "L'usuari disposa d'una subscripció activa", + "err.payment_error": "Error de pagament", + "err.no_codes_left": "No queden codis de referència", + "err.wrong_code": "Codi de referència erroni", + "err.redeeming_own_code_not_allowed": "No està permès reclamar codis d'un mateix", + "err.wrong_charge_id": "ID de càrrec erroni", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Augmentar velocitat", + "feature.faster": "Faster data centers", + "feature.unlimited": "Unlimited data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Sense publicitat", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Obtenir Lantern Pro", + "input.email": "Correu electrònic", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Informeu una adreça electrònica vàlida", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Si us plau torneu a provar-ho", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Idiomes", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Quant a", + "nav.account": "Gestió del compte", + "nav.authorize": "Add Device", + "nav.authorized": "Dispositiu autoritzat", + "nav.unauthorized_link": "Autoritza dispositiu per a PRO", + "nav.language": "Idioma", + "nav.lantern": "Lantern", + "nav.mobile": "Obtenir versió Mòbil", + "nav.report_issue": "Report an Issue", + "nav.settings": "Paràmetres", + "nav.verify": "Verificació del compte", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Inici", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Torna-ho a intentar", + "notifications.whatisnew": "What's New?", + "payment.close": "Tanca", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Selecciona", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "En el proper cicle de facturació aplicarem els crèdits al vostre compte.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Compartiu el vostre codi amb amics per començar a guanyar més crèdits.", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pagament {{amount}}", + "promotion.select": "Selecciona", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continue to Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Documents", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Següent", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Tamany", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Tanca", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Cancel·lar", + "replica.delete": "Esborra", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Descarrega", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Per contribuir al Lantern, informa de manera segura les estadístiques d'ús", + "settings.proxyAll": "Direcciona/Filtra tot el trànsit", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Gestiona el servidor intermediari del sistema", + "settings.title": "Paràmetres", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connectant...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Submit", + "verify.title": "Verificació del compte", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Gràcies per adquirir el Lantern Pro!", + "welcomeToPro.title": "Welcome To Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Convideu amics", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Desconegut", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/cs.json b/locale/translation/cs.json new file mode 100644 index 000000000..177b1dea0 --- /dev/null +++ b/locale/translation/cs.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Ukázat Lantern", + "TRAY_QUIT": "Zavřít Lantern" +} \ No newline at end of file diff --git a/locale/translation/da.json b/locale/translation/da.json new file mode 100644 index 000000000..97397ecc8 --- /dev/null +++ b/locale/translation/da.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Vis Lantern", + "TRAY_QUIT": "Afslut Lantern" +} \ No newline at end of file diff --git a/locale/translation/de.json b/locale/translation/de.json new file mode 100644 index 000000000..c24f25b8f --- /dev/null +++ b/locale/translation/de.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Verbinden", + "TRAY_DISCONNECT": "Trennen", + "TRAY_SHOW_LANTERN": "Lantern anzeigenf", + "TRAY_UPGRADE_TO_PRO": "Auf Pro aufrüsten", + "TRAY_QUIT": "Lantern beenden", + "BACKEND_DATA_TITLE": "Keine weiteren Lantern-Hochgeschwindigkeitsdaten", + "BACKEND_DATA_MESSAGE": "Bitte rüsten Sie auf Pro auf, um Lantern weiterhin mit voller Geschwindigkeit nutzen zu können!", + "BACKEND_DATA_PERCENT_TITLE": "%s von Ihren Lantern-Daten erreicht", + "BACKEND_DATA_PERCENT_MESSAGE": "Sie haben %s von Ihren für diesen Monat verfügbaren Lantern-Hochgeschwindigkeitsdaten verbraucht. Rüsten Sie jetzt auf!", + "BACKEND_CLICK_LABEL": "Öffnen", + "BACKEND_CLICK_LABEL_OPEN": "Öffnen", + "BACKEND_CLICK_LABEL_HELP": "Hilfe", + "BACKEND_CLICK_LABEL_GOT_IT": "Verstanden", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Laterne ist eine Anwendung, die einen schnellen, zuverlässigen und sicheren Zugang zum offenen Internet liefert.", + "about.faq": "Lesen Sie die Lantern FAQs", + "about.open": "Offenes Internet für Jeden", + "about.questions": "Fragen?", + "about.title": "Über", + "account.cancel": "Pro-Konto kündigen", + "account.free.cap": "{{mb}} MB verbleiben von Ihren kostenlosen monatlichen Daten", + "account.free.cap.upgrade": "Rüsten Sie auf Pro für unbegrenzte Hochgeschwindigkeitsdaten auf", + "account.freelink.validFor": "gültig für %s", + "account.freelink.desc": "Um dieses Gerät mit Ihrem Pro-Konto zu verknüpfen:", + "account.freelink.step1": "1. Öffnen Sie den Menüpunkt 'Gerät hinzufügen' auf Ihrem Pro-Gerät.", + "account.freelink.step2": "2. Geben Sie den Geräteverknüpfungscode ein und senden Sie ab.", + "account.freelink.reminder": "* Stellen Sie sicher, dass Sie auf die neueste Version von Lantern auf Ihrem Pro-Gerät aktualisiert haben", + "account.freelink.errorTitle": "Fehler beim Verknüpfen", + "account.freelink.errorText": "Sind Sie sicher, dass Sie den Code auf Ihrem Pro-Gerät eingegeben haben?", + "account.freelink.headerDesc": "Verknüpfen Sie dieses Gerät mit Ihrem Pro-Konto", + "account.freelink.title": "Gerätverknüpfungscode", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Auf Pro aufrüsten", + "account.pro.email": "E-Mail-Adresse:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Ihr Pro-Konto läuft in %s Tagen am %s ab.", + "account.pro.bonusMonths": "Dies beinhaltet Ihre {{bonusMonths}} Bonusmonate!", + "account.pro.thisdevice": "(Dieses Gerät)", + "account.pro.logout": "ABMELDEN", + "account.pro.removedevice": "ENTFERNEN", + "account.pro.devices": "Geräte zur Verwendung mit Ihrem Pro-Konto autorisiert:", + "account.pro.device.confirm.title": "Gerät deautorisieren", + "account.pro.device.confirm": "Sind Sie sicher, dass Sie '{{device}}' aus Ihrem Lantern Pro-Konto entfernen möchten?", + "account.pro.device.one.title": "Nur ein Gerät", + "account.pro.device.one": "Entschuldigung, aber Sie können Ihr letztes autorisiertes Gerät nicht entfernen.", + "account.pro.linkingcode": "Gerätverknüpfungscode:", + "account.pro.renew": "PRO-KONTO ERNEUERN", + "account.prolink.errorTitle": "Fehler beim Verknüpfen", + "account.prolink.errorText": "Sind Sie sicher, dass Sie den Code von einem anderen Gerät korrekt kopiert haben?", + "account.prolink.successTitle": "Gerät verknüpft", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Abbruch", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kartennummer", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Ungültige Kartennummer", + "adyen.creditCard.expiryDateField.title": "Ablaufdatum", + "adyen.creditCard.expiryDateField.placeholder": "MM/JJ", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Monat", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "JJ", + "adyen.creditCard.expiryDateField.year": "Jahr", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Kontonummer (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Ungültige Kontonummer", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Kontonummer (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Fehler", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Erneut versuchen", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telefonnummer", + "authorize.title": "Gerät für Pro autorisieren", + "authorize.step1.have_pro_device": "Ich habe ein weiteres Lantern Pro-Gerät", + "authorize.step1.link": "Dieses Gerät verknüpfen", + "authorize.step1.or": "oder", + "authorize.step1.recover": "Ich muss mein Lantern Pro-Konto wiederherstellen", + "authorize.step1.start": "Wiederherstellung starten", + "authorize.step1.no_mail": "Sie erinnern sich nicht an Ihre E-Mail-Adresse?", + "authorize.step2b.enter_code": "Geben Sie Ihren Kontowiederherstellungscode ein", + "authorize.step2b.code": "Kontowiederherstellungscode", + "authorize.step2b.instruction": "Eine Email mit dem Wiederherstellungscode wurde gesendet an {{email}}. Es kann mehrere Stunden bis zur Zustellung dieser dauern. Sehen Sie auch im Spam-Order nach.", + "authorize.step2b.no_mail": "Habe die E-Mail nicht erhalten", + "authorize.step3.recovery": "Kontowiederherstellung", + "authorize.step3.no_email": "Hoppla! Wir haben Probleme bei der Suche nach dieser E-Mail-Adresse. Bitte geben unten Sie mehr Informationen an um das Konto zu finden.", + "authorize.step3.no_code_received": "Haben Sie Probleme, die E-Mail zur Kontowiederherstellung zu erhalten? Geben Sie unten die Informationen unten und wir werden Sie innerhalb der nächsten 48 Stunden kontaktieren.", + "authorize.step3.your_email": "Ihre E-Mail-Adresse", + "authorize.step3.payment_method": "Zahlungsmethode", + "authorize.step3.payment_method_hint": "Wählen Sie die Zahlungsmethode aus, mit der Sie Pro erhalten haben", + "authorize.step3.credit_card": "Kreditkarte", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Zahlungskonto", + "authorize.step3.payment_account_hint": "Geben Sie Ihre Alipay-Kontoinformationen ein", + "authorize.step3.referral_code": "Ihr Empfehlungscode", + "authorize.step3.purchase_date": "Kaufdatum", + "authorize.step3.note": "Bitte geben Sie unten die Informationen an um uns das Finden des Kontos zu erleichtern.", + "authorize.step4.title": "Kontowiederherstellung in Bearbeitung", + "authorize.step4.text1": "Vielen Dank! Wir haben Ihre Kontowiederherstellungsanforderung erhalten.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Weiter zu Pro", + "authorized.text": "Dieses Gerät ist nun zur Verwendung Ihres Lantern Pro-Kontos autorisiert!", + "authorized.title": "Gerät autorisiert", + "button.renew": "Erneuern", + "button.upgrade": "Aufrüsten", + "button.upgrade_now": "Jetzt aufrüsten", + "button.upgrade_to_lantern_pro": "Auf Lantern PRO aufrüsten", + "button.copy_your_code": "Kopieren Sie Ihren Code", + "button.try_again": "Erneut versuchen", + "button.continue": "Fortsetzen", + "bullet.click_button": "Klicken Sie auf die Schaltfläche unten", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Senden Sie es an Ihre Freunde", + "cancel": "Abbruch", + "confirm": "Bestätigen", + "google_search": "Google Suche", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Unbekannter Fehler", + "err.internal_error": "Interner Fehler", + "err.bad_input": "Falsche Eingabe", + "err.not_authorized": "Nicht autorisiert", + "err.user_exists": "Benutzer vorhanden", + "err.no_such_user": "Kein solcher Benutzer", + "err.user_already_verified": "Benutzer bereits bestätigt", + "err.invalid_user_verification": "Ungültige Benutzerbestätigung", + "err.user_unverified": "Benutzer unbestätigt", + "err.operation_temporarily_unavailable": "Vorgang vorübergehend nicht erreichbar", + "err.wrong_or_inexistent_plan": "Falscher oder nicht vorhandener Plan", + "err.user_has_active_subscription": "Benutzer hat aktives Abonnement", + "err.payment_error": "Zahlungsfehler", + "err.no_codes_left": "Kein Empfehlungscode übrig", + "err.wrong_code": "Falscher Empfehlungscode", + "err.redeeming_own_code_not_allowed": "Einlösen von Codes auf sich selbst ist nicht erlaubt", + "err.wrong_charge_id": "Falsche Gebührenkennung", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Höhere Geschwindigkeit", + "feature.faster": "Faster data centers", + "feature.unlimited": "Unbegrenzte Daten", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Keine Werbung", + "feature.antiblock": "Sperrresistenz", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Schneller. Stärker. Unbegrenzt. Sicher.", + "free.link_account": "Sie haben bereits ein Pro-Konto? Verknüpfen Sie Ihr Konto.", + "home.get_lantern_pro": "Lantern Pro erhalten", + "input.email": "E-Mail", + "input.your_email": "Ihre E-Mail-Adresse", + "input.confirm_email": "E-Mail-Adresse bestätigen", + "input.enter_email": "Geben Sie Ihre E-Mail-Adresse ein", + "input.use_valid_email": "Schreiben Sie eine gültige E-Mail-Adresse", + "input.email_not_match": "E-Mail-Felder stimmen nicht überein", + "issue.your_email": "Ihre E-Mail-Adresse", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Bitte versuchen Sie es erneut", + "issue.select_issue": "Bitte wählen Sie ein Problem aus", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Fehler beim Melden des Problems", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Kann nicht auf blockierte Seiten zugreifen", + "issue.type.payment_fail": "Kann die Zahlung nicht abschließen", + "issue.type.cannot_login": "Kann nicht anmelden", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Langsam", + "issue.type.cannot_link_device": "Kann Geräte nicht verknüpfen", + "issue.type.crashes": "Lantern-Abstürze", + "issue.type.other": "Andere", + "languages.title": "Sprachen", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Android-Version holen", + "nav.about": "Über", + "nav.account": "Kontoverwaltung", + "nav.authorize": "Gerät hinzufügen", + "nav.authorized": "Gerät autorisiert", + "nav.unauthorized_link": "Gerät für Pro autorisieren", + "nav.language": "Sprache", + "nav.lantern": "Lantern", + "nav.mobile": "Mobile Version erhalten", + "nav.report_issue": "Problem melden", + "nav.settings": "Einstellungen", + "nav.verify": "Kontobestätigung", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Wiederholen", + "notifications.whatisnew": "What's New?", + "payment.close": "Schließen", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 Jahr", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Auswählen", + "plans.title": "Lantern Pro-Pläne", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Für Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern-Pro-Aktivierung", + "promotion.enter_and_confirm_email": "Bitte geben Sie Ihre E-Mail-Adresse ein und bestätigen Sie sie", + "promotion.code.hint": "Geben Sie den Empfehlungscode Ihres Freundes ein (optional)", + "promotion.code.label": "Empfehlungscode", + "promotion.payment": "Weiter zur Bezahlung", + "promotion.loading": "Ladevorgang...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "{{amount}} zahlen", + "promotion.select": "Auswählen", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Dieser Empfehlungscode wurde bereits hinzugefügt. Probieren Sie es jetzt aus, um Ihre zusätzlichen Monate zu erhalten.", + "promotion.activation.enter_and_confirm_email": "Bitte geben Sie Ihre E-Mail-Adresse ein und bestätigen Sie sie, um Ihr Lantern-Pro-Konto zu registrieren.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Geben Sie Ihren Aktivierungscode ein", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Weiter zu Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Teilen Sie Ihren Empfehlungscode", + "referral.text": "Verwenden Sie meinen Code %s und erhalten Sie 3 Monate kostenlos, wenn Sie sich registrieren!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "weiter", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Dokumentation", + "replica.other": "Andere", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Weiter", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Größe", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Schließen", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Abbruch", + "replica.delete": "Löschen", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Herunterladen", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Allgemein", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Lantern beim Systemstart starten", + "settings.autoReport": "Nutzungsstatistiken sicher berichten, um zu Lantern beizutragen", + "settings.proxyAll": "Kompletten Datenverkehr durch Proxy leiten", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Systemproxy verwalten", + "settings.title": "Einstellungen", + "settings.http_proxy": "HTTP(S)-Proxy:", + "settings.socks_proxy": "SOCKS-Proxy:", + "settings.caution": "Vorsicht:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Serverstandort", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Verbinden …", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Gerätverknüpfungscode", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "Sie sind momentan an unautorisierter Pro-Benutzer. Bitte geben Sie Ihre E-Mail-Adresse ein, um Ihr Pro-Konto zu autorisieren. Dies ermöglicht es Ihnen, mehrere Geräte zu verknüpfen.", + "verify.howto_3": "1. Öffnen Sie den Menüpunkt 'Gerät für Pro autorisieren' auf Ihrem unautorisierten Gerät.", + "verify.howto_4": "2. Geben Sie den Geräteverknüpfungscode aus Schritt 1 ein und senden Sie ab.", + "verify.reminder": "*Stellen Sie sicher, dass Sie auf die neueste Version von Lantern auf Ihrem unautorisierten Gerät aktualisiert haben", + "verify.submit": "Absenden", + "verify.title": "Kontobestätigung", + "welcomeToPro.continue": "Weiter zu Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Vielen Dank für Ihren Kauf von Lantern Pro!", + "welcomeToPro.title": "Willkommen bei Lantern Pro", + "messages.copied_to_clipboard": "Code kopiert. Teilen Sie ihn mit Ihren Freunden!", + "messages.datacap": "Sie haben Ihre kostenlosen Hochgeschwindigkeitsdaten verbraucht. Rüsten Sie auf Pro für unbegrenzte Hochgeschwindigkeitsdaten auf.", + "messages.fatal_error": "Entschuldigung, die Lantern Server konnten nicht erreicht werden. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "messages.backend_gone": "Entschuldigung, Lantern scheint nicht mehr ausgeführt zu werden. Bitte starten Sie Lantern neu und versuchen Sie es erneut.", + "messages.get_help": "Hilfe", + "freeProCredits.title": "Freunde einladen", + "freeProCredits.shareWithFriends": "Teilen Sie Ihren Code mit Freunden und erhalten Sie drei Monate!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unbekannt", + "cards.serverLocation.description": "Optimierter Serverstandort", + "cards.serverLocation.description-free": "Serverstandort", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Aktueller Standort:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Anzeigen blockiert", + "cards.adsBlocked.title": "Geblockte Anzeigen: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Datennutzung", + "cards.dataUsage.upgrade": "Jetzt aufrüsten", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro-Abonnement", + "cards.subscription.renew": "Erneuern", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "TAGE", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/el.json b/locale/translation/el.json new file mode 100644 index 000000000..69ac4e052 --- /dev/null +++ b/locale/translation/el.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Κατάσταση: %v", + "TRAY_CONNECT": "Σύνδεση", + "TRAY_DISCONNECT": "Αποσύνδεση", + "TRAY_SHOW_LANTERN": "Εμφανίστε του Lantern", + "TRAY_UPGRADE_TO_PRO": "Αναβάθμιση σε Pro", + "TRAY_QUIT": "Έξοδος από το Φανάρι", + "BACKEND_DATA_TITLE": "Τελείωσαν τα δεδομένα υψηλής ταχύτητας του Lantern", + "BACKEND_DATA_MESSAGE": "Κάντε αναβάθμιση σε Pro για να συνεχίσετε να χρησιμοποιείτε το Lantern σε μέγιστη ταχύτητα!", + "BACKEND_DATA_PERCENT_TITLE": "Έχετε χρησιμοποιήσει %s των δεδομενων του Lantern", + "BACKEND_DATA_PERCENT_MESSAGE": "Έχετε χρησιμοποιήσει %s των δεδομένων υψηλής ταχύτητας, του Lantern, του μήνα", + "BACKEND_CLICK_LABEL": "Άνοιγμα", + "BACKEND_CLICK_LABEL_OPEN": "Άνοιγμα", + "BACKEND_CLICK_LABEL_HELP": "Βοήθεια", + "BACKEND_CLICK_LABEL_GOT_IT": "Το κατάλαβα", + "BACKEND_AUTOUPDATED_TITLE": "Ενημέρωση του Lantern στην έκδοση %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Ολοκληρώθηκε η λήψη του Lantern %s. Επανεκκινήστε το Lantern για να το χρησιμοποιήσετε.", + "BACKEND_MITM_INSTALL_CERT": "Το Lantern θέλει να εγκαταστήσει ένα προσαρμοσμένο πιστοποιητικό για να ξεμπλοκάρει την κίνηση σας", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Επιτρέψτε στο %v να κάνει αλλαγές στο σύστημά σας", + "BACKEND_ALERT_TITLE": "Κρίσιμη προειδοποίηση χρειάζεται την προσοχή σας", + "about.content": "Το Lantern είναι μια εφαρμογή που παρέχει γρήγορη, αξιόπιστη και ασφαλή πρόσβαση στο ανοικτό διαδίκτυο.", + "about.faq": "Διαβάστε τις συχνές ερωτήσεις του Lantern", + "about.open": "Ανοιχτό διαδίκτυο για όλους.", + "about.questions": "Ερωτήσεις;", + "about.title": "Σχετικά", + "account.cancel": "Ακύρωση λογαριασμού Pro", + "account.free.cap": "Απομένουν {{mb}} MB από τα δωρεάν μηνιαία σας δεδομένα ", + "account.free.cap.upgrade": "Κάντε αναβάθμιση σε Pro για απεριόριστα δεδομένα υψηλής ταχύτητας", + "account.freelink.validFor": "ισχύει για %s", + "account.freelink.desc": "Για να συνδέσετε αυτήν τη συσκευή με τον Pro λογαριασμό σας:", + "account.freelink.step1": "1. Ανοίξτε την επιλογή \"Προσθήκη συσκευής\" στο μενού της Pro συσκευής.", + "account.freelink.step2": "2. Εισάγετε τον κωδικό σύνδεσης συσκευής και πατήστε υποβολή.", + "account.freelink.reminder": "* Βεβαιωθείτε ότι η έχετε την τελευταία έκδοση του Lantern στην Pro συσκευή σας.", + "account.freelink.errorTitle": "Σφάλμα σύνδεσης", + "account.freelink.errorText": "Είστε σίγουρος ότι εισάγατε τον κωδικό στην Pro συσκευή σας;", + "account.freelink.headerDesc": "Σύνδεση αυτής της συσκευής με τον Pro λογαριασμό σας", + "account.freelink.title": "Κωδικός σύνδεσης συσκευής", + "account.pro.charge": "Ο λογαριασμός σας θα χρεωθεί αυτόματα για ένα ακόμα έτος στο τέλος του κύκλου χρέωσης.", + "account.upgrade": "Αναβάθμιση σε Pro", + "account.pro.email": "Διεύθυνση email:", + "account.pro.expired": "Ο Pro λογαριασμός σας έχει λήξει. Ανανεώστε τον τώρα για απεριόριστα μηνιαία δεδομένα.", + "account.pro.expiry": "Ο Pro λογαριασμός σας λήγει σε %s ημέρα/ες στις %s.", + "account.pro.bonusMonths": "Αυτό περιλαμβάνει τους {{bonusMonths}} μήνες μπόνους!", + "account.pro.thisdevice": "(αυτή τη συσκευή)", + "account.pro.logout": "ΑΠΟΣΥΝΔΕΣΗ", + "account.pro.removedevice": "ΑΦΑΙΡΕΣΗ", + "account.pro.devices": "Συσκευές εξουσιοδοτημένες να χρησιμοποιούν τον Pro λογαριασμό σας:", + "account.pro.device.confirm.title": "Κατάργηση εξουσιοδότησης συσκευής", + "account.pro.device.confirm": "Είστε σίγουρος ότι θέλετε να καταργήσετε το '{{device}}' από το λογαριασμό Lantern Pro;", + "account.pro.device.one.title": "Μόνο μία συσκευή", + "account.pro.device.one": "Λυπούμαστε, αλλά δεν μπορείτε να καταργήσετε την τελευταία εξουσιοδοτημένη συσκευή σας.", + "account.pro.linkingcode": "Κωδικός σύνδεσης συσκευής", + "account.pro.renew": "ΑΝΑΝΕΩΣΗ PRO", + "account.prolink.errorTitle": "Σφάλμα σύνδεσης", + "account.prolink.errorText": "Είστε σίγουρος ότι έχετε αντιγράψει σωστά τον κώδικο από την άλλη σας συσκευή;", + "account.prolink.successTitle": "Η συσκευή συνδέθηκε", + "account.prolink.successText": "Η συσκευή σας συνδέθηκε με επιτυχία! Περιμένετε μια στιγμή, ώστε η άλλη συσκευή σας να γίνει αυτόματα pro.", + "adyen.paymentMethods.title": "Μέθοδοι Πληρωμής", + "adyen.paymentMethods.storedMethods": "Οι μέθοδοι πληρωμής σας", + "adyen.paymentMethods.otherMethods": "Επιλέξτε άλλη μέθοδο", + "adyen.paymentMethods.moreMethodsButton": "Περισσότερες μέθοδοι πληρωμής", + "adyen.payButton": "Πληρωμή", + "adyen.payButton.formatted": "Πληρωμή %@", + "adyen.cancelButton": "Ακύρωση", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Αποθήκευση για την επόμενη πληρωμή μου", + "adyen.payment.redirecting": "Θα μεταφερθείτε", + "adyen.payment.processing": "Η πληρωμή σας είναι υπό επεξεργασία", + "adyen.creditCard.title": "Στοιχεία κάρτας", + "adyen.creditCard.holderName": "Όνομα κατόχου", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Αριθμός κάρτας", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Μη έγκυρος αριθμός κάρτας", + "adyen.creditCard.expiryDateField.title": "Ημερομηνία λήξης", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Μη έγκυρη ημερομηνία λήξης", + "adyen.creditCard.expiryDateField.month": "Μήνας", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Χρόνος", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Αριθμός δόσεων", + "adyen.creditCard.storeDetailsButton": "Αποθήκευση κάρτας για την επόμενη πληρωμή μου", + "adyen.creditCard.oneClickVerification.title": "Επαλήθευση κάρτας", + "adyen.creditCard.oneClickVerification.message": "Εισαγάγετε τον κωδικό CVC της %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Μη έγκυρο CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Εισαγάγετε ένα έγκυρο CVC για να συνεχίσετε.", + "adyen.sepaDirectDebit.ibanField.title": "Αριθμός λογαριασμού (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Μη έγκυρος αριθμός λογαριασμού", + "adyen.sepaDirectDebit.nameField.title": "Όνομα κατόχου", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Συμφωνώ ότι το παρακάτω ποσό θα χρεωθεί στον τραπεζικό μου λογαριασμό.", + "adyen.sepa.ownerName": "Όνομα κατόχου", + "adyen.sepa.ibanNumber": "Αριθμός λογαριασμού (IBAN)", + "adyen.giropay.searchField.placeholder": "Όνομα Τράπεζας / BIC / Κωδικός τράπεζας", + "adyen.giropay.minimumLength": "Min. 3 χαρακτήρες", + "adyen.giropay.noResults": "Δεν υπάρχουν αποτελέσματα αναζήτησης", + "adyen.error.title": "Σφάλμα", + "adyen.error.subtitle.redirect": "Η ανακατεύθυνση απέτυχε", + "adyen.error.subtitle.payment": "Η πληρωμή απέτυχε", + "adyen.error.subtitle.refused": "Η πληρωμή απορρίφθηκε", + "adyen.error.message.unknown": "Παρουσιάστηκε άγνωστο σφάλμα", + "adyen.error.message.cannotConnectToInternet": "Αποτυχία σύνδεσης στο διαδίκτυο : ελέγξτε τη σύνδεσή σας.", + "adyen.error.message.cannotConnectToHost": "Αποτυχία σύνδεσης με το διακομιστή πληρωμών.", + "adyen.error.retryButton": "Ξαναπροσπαθήστε", + "adyen.idealIssuer.selectField.title": "Τράπεζα", + "adyen.idealIssuer.selectField.placeholder": "Επιλέξτε την τράπεζά σας", + "adyen.creditCard.success": "Επιτυχής Πληρωμή", + "adyen.oneClick.confirmationAlert.title": "Επιβεβαίωση %@ πληρωμής", + "adyen.redirect.cannotOpenApp.title": "Δεν είναι δυνατό το άνοιγμα της εφαρμογής", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Η εφαρμογή δεν μπορούσε να ανοίξει επειδή δεν είναι εγκατεστημένη σε αυτήν τη συσκευή.", + "adyen.holderName": "Όνομα κατόχου", + "adyen.countryCode": "Κωδικός χώρας", + "adyen.telephone.number": "Αριθμός τηλεφώνου", + "authorize.title": "Εξουσιοδότηση συσκευής για Pro", + "authorize.step1.have_pro_device": "Έχω άλλη συσκευή Lantern Pro", + "authorize.step1.link": "Συνδέστε αυτή τη συσκευή", + "authorize.step1.or": "ή", + "authorize.step1.recover": "Πρέπει να ανακτήσω τον λογαριασμό μου Lantern Pro", + "authorize.step1.start": "Έναρξη Ανάκτησης", + "authorize.step1.no_mail": "Ξεχάσατε το email σας;", + "authorize.step2b.enter_code": "Εισαγωγή Κωδικού Ανάκτησης Λογαριασμού", + "authorize.step2b.code": "Κωδικός Ανάκτησης Λογαριασμού", + "authorize.step2b.instruction": "Ένα email με έναν κωδικό ανάκτησης έχει σταλεί στο {{email}}. Το email ίσως να κάνει αρκετές ώρες μέχρι να παραδοθεί. Ελέγξτε το φάκελο ανεπιθύμητης αλληλογραφίας αν δεν το βρείτε.", + "authorize.step2b.no_mail": "Δεν έλαβα email", + "authorize.step3.recovery": "Ανάκτηση Λογαριασμού", + "authorize.step3.no_email": "Ωχ! Δεν μπορούμε να βρούμε αυτή τη διεύθυνση email. Καταχωρίστε τις παρακάτω πληροφορίες για να μας βοηθήσετε να εντοπίσουμε το λογαριασμό σας.", + "authorize.step3.no_code_received": "Δεν μπορείτε να λάβετε το email ανάκτησης; Καταχωρίστε τις παρακάτω πληροφορίες και θα επικοινωνήσουμε μαζί σας εντός 48 ωρών.", + "authorize.step3.your_email": "Το email σας", + "authorize.step3.payment_method": "Τρόπος πληρωμής", + "authorize.step3.payment_method_hint": "Επιλέξτε τη μέθοδο πληρωμής που χρησιμοποιήσατε για να πάρετε το Pro", + "authorize.step3.credit_card": "Πιστωτική κάρτα", + "authorize.step3.alipay": "Alipay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Έλαβα το Pro από προώθηση σε φίλο", + "authorize.step3.payment_account": "Λογαριασμός πληρωμής", + "authorize.step3.payment_account_hint": "Εισάγετε τα στοιχεία του λογαριασμού σας στο Alipay", + "authorize.step3.referral_code": "Ο δικός σας κωδικός προώθησης", + "authorize.step3.purchase_date": "Ημερομηνία αγοράς", + "authorize.step3.note": "Παρακαλώ σημειώστε οποιαδήποτε άλλη πληροφορία που ίσως να μας βοηθήσει να εντοπίσουμε το λογαριασμό σας.", + "authorize.step4.title": "Ανάκτηση λογαριασμού σε εξέλιξη", + "authorize.step4.text1": "Ευχαριστούμε! Λάβαμε το αίτημα ανάκτησης του λογαριασμού σας.", + "authorize.step4.text2": "Αφήστε να περάσουν 48 ώρες για την ανάκτηση των πληροφοριών του Pro λογαριασμού σας.", + "authorize.step4.text3": "Θα στείλουμε πληροφορίες στη διεύθυνση email που καταχωρίσατε στην προηγούμενη οθόνη.", + "authorized.continue": "Συνέχεια στο PRO", + "authorized.text": "Αυτή η συσκευή είναι τώρα εξουσιοδοτημένη να χρησιμοποιεί τον Lantern Pro λογαριασμό σας!", + "authorized.title": "Εξουσιοδοτημένη συσκευή", + "button.renew": "Ανανέωση", + "button.upgrade": "Αναβάθμιση", + "button.upgrade_now": "Αναβάθμιση τώρα", + "button.upgrade_to_lantern_pro": "Αναβαθμίστε σε Lantern Pro", + "button.copy_your_code": "Αντιγράψτε τον κωδικό σας", + "button.try_again": "Ξαναπροσπαθήστε", + "button.continue": "Συνέχεια", + "bullet.click_button": "Πατήστε το παρακάτω κουμπί", + "bullet.paste_code": "Επικολλήστε τον κωδικό & τον σύνδεσμο λήψης σε ένα μήνυμα", + "bullet.send_to_friends": "Αποστολή σε φίλους σας", + "cancel": "Ακύρωση", + "confirm": "Επιβεβαίωση", + "google_search": "Αναζήτηση Google", + "link_device": "Έχετε ήδη λογαριασμό Pro; Σύνδεση συσκευης", + "err.unknown_error": "Άγνωστο σφάλμα", + "err.internal_error": "Εσωτερικό σφάλμα", + "err.bad_input": "Κακή καταχώρηση", + "err.not_authorized": "Not authorized", + "err.user_exists": "Ο χρήστης υπάρχει", + "err.no_such_user": "Δεν υπάρχει αυτός ο χρήστης", + "err.user_already_verified": "Ο χρήστης είναι ήδη επιβεβαιωμένος", + "err.invalid_user_verification": "Μη έγκυρη επαλήθευση χρήστη", + "err.user_unverified": "Ο χρήστης δεν είναι επιβεβαιωμένος", + "err.operation_temporarily_unavailable": "Η λειτουργία δεν είναι προσωρινά διαθέσιμη", + "err.wrong_or_inexistent_plan": "Λανθασμένος ή ανύπαρκτος τύπος συνδρομής", + "err.user_has_active_subscription": "Ο χρήστης έχει ενεργή συνδρομή", + "err.payment_error": "Σφάλμα πληρωμής", + "err.no_codes_left": "Δεν έχουν απομείνει κωδικοί προώθησης", + "err.wrong_code": "Λανθασμένος κωδικός προώθησης", + "err.redeeming_own_code_not_allowed": "Δεν επιτρέπεται η εξαργύρωση από εσάς των δικών σας κωδίκων", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Κερδίστε χρήματα! Γίνετε μεταπωλητής Lantern Pro. Πατήστε εδώ", + "footer.reseller.email_subject": "Πείτε μου για το πρόγραμμα μεταπωλητών Lantern!", + "footer.reseller.email_body": "Όταν γίνεστε μεταπωλητής του Lantern θα έχετε την ευκαιρία να κερδίσετε μέχρι και 25% από κάθε πώληση συνδρομής Lantern Pro. Πείτε μας λίγα λογια για το λόγο που θέλετε να γίνετε μεταπωλητής παρακάτω.", + "feature.faster_speed": "Πιο γρήγορη ταχύτητα", + "feature.faster": "Faster data centers", + "feature.unlimited": "Απεριόριστα δεδομένα", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Χωρίς διαφημίσεις", + "feature.antiblock": "Ανθεκτικό στον αποκλεισμό", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Γρηγορότερο. Ισχυρότερο. Απεριόριστο. Ασφαλές", + "free.link_account": "Έχετε ήδη λογαριασμό Pro; Σύνδεση λογαριασμού", + "home.get_lantern_pro": "Λήψη Lantern Pro", + "input.email": "Email", + "input.your_email": "Η Διεύθυνση email", + "input.confirm_email": "Επιβεβαίωση διεύθυνσης email", + "input.enter_email": "Εισάγετε το email σας", + "input.use_valid_email": "Γράψτε μια έγκυρη διεύθυνση email", + "input.email_not_match": "Τα πεδία email δεν ταιριάζουν", + "issue.your_email": "Το email σας", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Προσπαθήστε ξανά", + "issue.select_issue": "Επιλέξτε ένα θέμα", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Επιλέξτε ένα θέμα από το μενού", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Σφάλμα αναφοράς προβλήματος ", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Δεν είναι δυνατή η πρόσβαση στις αποκλεισμένες ιστοσελίδες", + "issue.type.payment_fail": "Δεν είναι δυνατή η ολοκλήρωση της πληρωμής", + "issue.type.cannot_login": "Δεν μπορώ να συνδεθώ", + "issue.type.always_spinning": "Η ένδειξη φόρτωσης συνεχίζει ατελείωτα", + "issue.type.slow": "Αργά", + "issue.type.cannot_link_device": "Δεν μπορώ να συνδέσω τις συσκευές", + "issue.type.crashes": "Το Lantern κρασάρει", + "issue.type.other": "Άλλο", + "languages.title": "Γλώσσες", + "mobile.link": "Χρησιμοποιήστε το σύνδεσμο για να κατεβάσετε Lantern στην Android συσκευή σας:", + "mobile.title": "Λήψη έκδοσης για Android", + "nav.about": "Σχετικά", + "nav.account": "Διαχείριση Λογαριασμού", + "nav.authorize": "Προσθήκη συσκευής", + "nav.authorized": "Εξουσιοδοτημένη συσκευή", + "nav.unauthorized_link": "Εξουσιοδότηση συσκευής για Pro", + "nav.language": "Γλώσσα", + "nav.lantern": "Lantern", + "nav.mobile": "Λήψη έκδοσης για κινητό", + "nav.report_issue": "Αναφορά Προβλήματος", + "nav.settings": "Ρυθμίσεις", + "nav.verify": "Επιβεβαίωση λογαριασμού", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Επαναπροσπάθεια", + "notifications.whatisnew": "What's New?", + "payment.close": "Κλείσιμο", + "payment.wait_for_pro": "Ευχαριστούμε για την αγορά του Lantern Pro! Περιμένετε λίγο για να γίνει αυτόματα το Lantern σας Pro.", + "payment_methods.select_name": "Επιλέξτε μέθοδο πληρωμής", + "payment_methods.alipay": "Πιστωτική Κάρτα/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Αγορά Lantern Pro", + "payment_methods.shetab.details.body": "Όταν πατήσετε στο κουμπί για να προχωρήσετε σε αγορά, θα μεταφερθείτε σε μια εξωτερική ιστοσελίδα για να ολοκληρώσετε την πληρωμή και να πάρετε τον κωδικό ενεργοποίησης.", + "payment_methods.shetab.details.tutorial_header": "Farsi Tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Συνέχεια σε αγορά", + "payment_methods.shetab.details.input_code_button": "Εισάγετε κωδικό ενεργοποίησης", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Καλύτερη προσφορά!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 Έτος ", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Επιλογή", + "plans.title": "Lantern Pro Συνδρομές", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Για Windows, Android, Mac και Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Έχετε κωδικό ενεργοποίησης; Πατήστε εδώ.", + "pro.apply": "Οι μονάδες σας θα εφαρμοστούν στον επόμενο κύκλο χρέωσης του λογαριασμού σας.", + "pro.title": "Προσκαλέστε φίλους, κερδίστε περισσότερο Pro δωρεάν", + "pro.subtitle": "Όταν ο φίλος σας αγοράσει τη διετή συνδρομή θα λάβετε ο καθένας 3 μήνες δωρεάν, η ετήσια συνδρομή δίνει στον καθένα σας 1 μήνα δωρεάν", + "pro.share": "Μοιραστείτε τον κωδικό σας με φίλους για να κερδίσετε περισσότερες μονάδες!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Ενεργοποίηση Lantern Pro", + "promotion.enter_and_confirm_email": "Εισαγάγετε, και επιβεβαιώστε τη διεύθυνση email σας.", + "promotion.code.hint": "Εισαγάγετε τον κωδικό προώθησης του φίλου σας (προαιρετικό)", + "promotion.code.label": "Κωδικός προώθησης", + "promotion.payment": "Συνέχεια στην πληρωμή", + "promotion.loading": "Λήψη..", + "promotion.howto_1y": "Αν ένας φίλος μοιράστηκε έναν κωδικό προώθησης μαζί σας, πληκτρολογήστε τον κωδικό για να λάβετε ένα μήνα Lantern Pro δωρεάν μετά το checkout.", + "promotion.howto_2y": "Αν ένας φίλος μοιράστηκε έναν κωδικό προώθησης μαζί σας, πληκτρολογήστε τον κωδικό για να λάβετε τρεις μήνες Lantern Pro δωρεάν μετά το checkout.", + "promotion.pay": "Πληρωμή {{amount}}", + "promotion.select": "Επιλογή", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Αυτός ο κωδικός προώθησης έχει ήδη προστεθεί. Κάντε Checkout τώρα για να λάβετε τους επιπλέον μήνες σας.", + "promotion.activation.enter_and_confirm_email": "Εισαγάγετε και επιβεβαιώστε τη διεύθυνση email σας για να εγγραφείτε στο Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Εισάγετε κωδικό ενεργοποίησης", + "promotion.activation.howto": "Εισαγάγετε τον 25ψηφιο κωδικό ενεργοποίησης του Lantern Pro παραπάνω. Αν δεν έχετε κωδικό, παρακαλούμε να αγοράσετε το Pro στην προηγούμενη οθόνη ή να αναζητήσετε έναν μεταπωλητή του Lantern Pro στο Internet.", + "promotion.activation.continue": "Συνέχεια στο PRO", + "promotion.voucher.hint": "Κωδικός ενεργοποίησης", + "promotion.voucher.howto": "Εισαγάγετε τον 12ψηφιο κωδικό ενεργοποίησης Fast World Pay παραπάνω", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Σφάλμα εξαργύρωσης του κωδικού ενεργοποίησης. Επικοινωνήστε με το contact@fastworldpay.com για βοήθεια.", + "promotion.voucher.error.invalid_code": "Μη έγκυρος κωδικός ενεργοποίησης", + "promotion.voucher.error.invalid_plan": "Κωδικός ενεργοποίησης που σχετίζεται με μη έγκυρο τύπο συνδρομής", + "promotion.voucher.error.already_redeemed": "Ο κωδικός ενεργοποίησης έχει ήδη εξαργυρωθεί", + "referral.code": "Μοιραστείτε τον κωδικό προώθησης", + "referral.text": "Χρησιμοποιήστε τον κωδικό μου %s και λάβετε 3 μήνες δωρεάν όταν εγγραφείτε!", + "renew.title_30_days": "Κάντε ανανέωση τώρα για να πάρετε 3 μήνες δωρεάν!", + "renew.title_2_days": "Το Lantern Pro λήγει αύριο. Ανανεώστε το τώρα για να πάρετε 3 μήνες δωρεάν!", + "renew.title_last_day": "Το Lantern Pro λήγει σήμερα.\nΜην χάσετε την έκπτωση του Pro!", + "renew.title_expired": "Το Lantern Pro έχει λήξει", + "renew.details_30_days": "Η συνδρομή σας στο Lantern Pro λήγει σύντομα, ανανεώστε τώρα και απολαύστε μέχρι και τρεις μήνες δωρεάν! Αυτή η προσφορά περιορισμένης διάρκειας ισχύει μόνο για έγκαιρες ανανεώσεις.", + "renew.details_2_days": "Η συνδρομή σας στο Lantern Pro λήγει σύντομα, ανανεώστε τώρα και απολαύστε μέχρι και τρεις μήνες δωρεάν! Αυτή η προσφορά περιορισμένης διάρκειας ισχύει μόνο για έγκαιρες ανανεώσεις.", + "renew.details_last_day": "Κάντε ανανέωση τώρα και απολαύστε έως και τρεις μήνες δωρεάν!\nΑυτή είναι η τελευταία μέρα που μπορείτε να επωφεληθείτε από αυτήν την προσφορά.\nΟι χρήστες του Lantern Pro έχουν γρηγορότερες ταχύτητες, απεριόριστα δεδομένα, καλύτερη αντίσταση στον αποκλεισμό, τρεις συσκευές και δεν έχουν διαφημίσεις.", + "renew.details_expired": "Κάντε ανανέωση τώρα για να πάρετε επιπλέον 45 ημέρες δωρεάν. Μόνο για περιορισμένο χρόνο.\nΟι χρήστες του Lantern Pro παίρνουν γρηγορότερες ταχύτητες, απεριόριστα δεδομένα, καλύτερη αντίσταση στον αποκλεισμό, τρεις συσκευές και δεν έχουν διαφημίσεις.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 ΔΩΡΕΑΝ ΜΗΝΑ", + "renew.plan_renewal_bonus_months": "$%d%s + %dΔΩΡΕΑΝ ΜΗΝΕΣ", + "renew.plan_renewal_bonus_days": "$%d%s + %d ΔΩΡΕΑΝ ΗΜΕΡΕΣ", + "renew.next": "επόμενο", + "renew.decline": "Απόρριψη προσφοράς", + "renew.decline_question": "Σίγουρα θέλετε να απορρίψετε αυτή την προσφορά;", + "renew.decline_yes": "Ανανέωση αργότερα", + "renew.decline_dismiss": "Ανανέωση τώρα", + "renew.notification_title_30_days": "Ανανέωση του Pro τώρα για τεράστια εξοικονόμηση χρημάτων!", + "renew.notification_text_30_days": "Ο Pro λογαριασμός σας λήγει σε {{days}} ημέρα/ες. Ανανεώστε τον τώρα και πάρτε έως και 3 μήνες δωρεάν.", + "renew.notification_title_2_days": "Η έκπτωση του Lantern Pro τελειώνει αύριο!", + "renew.notification_text_2_days": "Ο Pro λογαριασμός σας λήγει αύριο. Μην χάσετε την ευκαιρία για μια τεράστια έκπτωση.", + "renew.notification_title_last_day": "Τελευταία ευκαιρία για έκπτωση!", + "renew.notification_text_last_day": "Ο Lantern Pro λογαριασμός σας έληξε. Ανανεώστε τον σήμερα και πάρτε έως και 3 μήνες δωρεάν.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Έγγραφα", + "replica.other": "Άλλο", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Επόμενο", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Κλείσιμο", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Ακύρωση", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Κατέβασμα", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Γενικά", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Αυτόματη εκκίνηση του Lantern κατά την εκκίνηση του συστήματος", + "settings.autoReport": "Αναφέρετε με ασφάλεια τα στατιστικά στοιχεία χρήσης για να συμβάλλετε στο Lantern", + "settings.proxyAll": "Διαμεσολάβηση όλης της κίνησης", + "settings.proxyAllHelpTitle": "ΤΙ ΚΑΝΕΙ Η \"ΔΙΑΜΕΣΟΛΑΒΗΣΗ ΟΛΗΣ ΤΗΣ ΚΙΝΗΣΗΣ\";", + "settings.proxyAllHelp1": "Αν είναι ενεργοποιημένο, όλη η κίνηση θα στέλνεται μέσω του Lantern (η πιο ασφαλής επιλογή).", + "settings.proxyAllHelp2": "Αν είναι απενεργοποιημένο, μόνο η κίνηση προς αποκλεισμένες ιστοσελίδες θα στέλνεται μέσω του Lantern (ταχύτερη επιλογή, πιο συνηθισμένη).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Διαχείριση διαμεσολαβητή συστήματος", + "settings.title": "Ρυθμίσεις", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Προσοχή:", + "settings.caution_text": "Όταν καταργήσετε την επιλογή \"Διαχείριση του μεσολαβητή συστήματος\", ο περιηγητής και οι εφαρμογές σας δεν θα μπορούν να χρησιμοποιήσουν αυτόματα το Lantern. Εάν γνωρίζετε πώς να διαμορφώσετε με μη αυτόματο τρόπο αυτές τις ρυθμίσεις, ανατρέξτε στις παραπάνω πληροφορίες", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Τοποθεσία διακομιστή", + "status.tooltip1": "Το Lantern χρησιμοποιεί έξυπνη επιλογή διακομιστή για να σας συνδέει στα καλύτερα κέντρα δεδομένων μας.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Γίνεται σύνδεση...", + "status.no_internet": "Off", + "status.no_internet_connection": "Δεν υπάρχει σύνδεση στο Internet", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Μειωμένη ταχύτητα (Data Cap)", + "status.no_system_proxy": "{{status}}, δεν γίνεται διαχείριση του διαμεσολαβητή συστήματος", + "status.fail_to_set_system_proxy": "Δεν ήταν δυνατή η ρύθμιση του Lantern ως διαμεσολαβητή συστήματος", + "status.fail_to_open_browser": "Δεν ήταν δυνατό το άνοιγμα του παραθύρου του περιηγητή για να εμφανιστεί το user interface του Lantern", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Θέλετε να συνδέσετε μια άλλη συσκευή με αυτόν τον λογαριασμό Pro; Εισάγετε τον κωδικό σύνδεσης συσκευής παρακάτω", + "verify.code": "Κωδικός σύνδεσης συσκευής", + "verify.howto_1": "Αν έχετε λογαριασμό Lantern Pro σε άλλη συσκευή, εισάγετε τη διεύθυνση email σας εδώ για να λάβετε έναν κωδικό για να εξουσιοδοτήσετε τη συσκευή", + "verify.howto_1a": "Είστε μη εξουσιοδοτημένος χρήστης του Pro. Εισάγετε τη διεύθυνση email σας για να εξουσιοδοτήσετε τον Pro λογαριασμό σας. Αυτό θα σας επιτρέψει να συνδέσετε πολλαπλές συσκευές.", + "verify.howto_3": "1. Ανοίξτε την επιλογή \"Προσθήκη συσκευής\" στο μενού της μη εξουσιοδοτημένης συσκευής.", + "verify.howto_4": "2. Εισάγετε τον κωδικό σύνδεσης συσκευής του βήματος 1, και πατήστε υποβολή.", + "verify.reminder": "* Βεβαιωθείτε ότι έχετε την τελευταία έκδοση του Lantern στη μη εξουσιοδοτημένη συσκευή σας.", + "verify.submit": "Υποβολή", + "verify.title": "Επιβεβαίωση λογαριασμού", + "welcomeToPro.continue": "Συνέχεια στο PRO", + "welcomeToPro.invite": "Προσκαλέστε τους φίλους σας και θα πάρετε ο καθένας 3 μήνες δωρεάν όταν αγοράσουν τη διετη συνδρομή, η ετησία συνδρομή δίνει στον καθένα σας 1 μήνα δωρεάν. Ξεκινήστε να προσκαλείτε!", + "welcomeToPro.thanks": "Σας ευχαριστούμε που αγοράσατε το Lantern Pro!", + "welcomeToPro.title": "Καλώς ήλθατε στο Lantern Pro", + "messages.copied_to_clipboard": "Ο κωδικός αντιγράφηκε. Μοιραστείτε τον με τους φίλους σας!", + "messages.datacap": "Έχετε χρησιμοποιήσει τα δωρεάν δεδομένα υψηλής ταχύτητας. Κάντε αναβάθμιση σε Pro για απεριόριστα δεδομένα υψηλής ταχύτητας.", + "messages.fatal_error": "Λυπούμαστε, άλλα δεν μπορούμε να επικοινωνήσουμε με τους διακομιστές του Lantern. Ελέγξτε τη σύνδεση σας στο Internet και δοκιμάστε ξανά.", + "messages.backend_gone": "Λυπούμαστε, το Lantern φαίνεται έχει σταματήσει να λειτουργεί. Κάντε επανεκκίνηση του Lantern και δοκιμάστε ξανά.", + "messages.get_help": "Ζητήστε Βοήθεια", + "freeProCredits.title": "Προσκαλέστε φίλους", + "freeProCredits.shareWithFriends": "Μοιραστείτε τον κωδικό σας με τους φίλους σας για να κερδίσετε δωρεάν μήνες!", + "freeProCredits.shareWithFriendsDesc": "Όταν ο φίλος σας αγοράσει τη διετή συνδρομή θα λάβετε ο καθένας 3 μήνες δωρεάν, η ετήσια συνδρομή δίνει στον καθένα σας 1 μήνα δωρεάν", + "cards.serverLocation.unknown": "Άγνωστο ", + "cards.serverLocation.description": "Βελτιστοποιημένη τοποθεσία διακομιστή", + "cards.serverLocation.description-free": "Τοποθεσία διακομιστή", + "cards.serverLocation.description-upgrade": "Αναβαθμίστε για γρηγορότερους διακομιστές", + "cards.serverLocation.title": "Τρέχουσα τοποθεσία:", + "cards.serverLocation.location": "%s,%s", + "cards.serverLocation.text": "Το Lantern χρησιμοποιεί έξυπνη επιλογή διακομιστή για να σας βρει αυτόματα την ταχύτερη δυνατή σύνδεση από τα κέντρα δεδομένων μας στο Τόκιο, τη Σιγκαπούρη, το Χονγκ Κονγκ, το Σαν Φρανσίσκο, τη Νέα Υόρκη, το Άμστερνταμ, το Μπανγκαλόρ και πολλά άλλα.", + "cards.serverLocation.text-free": "Το Lantern χρησιμοποιεί έξυπνη επιλογή διακομιστή για να σας συνδέει στα καλύτερα κέντρα δεδομένων μας.", + "cards.serverLocation.upgrade-link": "Κάντε αναβάθμιση σε Lantern Pro για μεγαλύτερη ταχύτητα με βελτιστοποιημένη επιλογή διακομιστή από τα αποκλειστικά κέντρα δεδομένων του Lantern Pro.", + "cards.httpsUpgrades.description": "HTTPS Αναβαθμίσεις", + "cards.httpsUpgrades.title": "HTTPS Αναβαθμίσεις: %d", + "cards.httpsUpgrades.text": "Το Lantern αναβαθμίζει αυτόματα τις μη ασφαλείς συνδέσεις HTTP σε κρυπτογραφημένες συνδέσεις HTTPS, όταν είναι δυνατόν, για να διατηρήσετε τις πληροφορίες σας ιδιωτικές κατά την περιήγηση σας στο διαδίκτυο.", + "cards.adsBlocked.description": "Αποκλεισμένες Διαφημίσεις", + "cards.adsBlocked.title": "Αποκλεισμένες Διαφημίσεις: %d", + "cards.adsBlocked.text": "Το Lantern μπλοκάρει τις ενοχλητικές διαφημίσεις για να επιταχύνει τον χρόνο φόρτωσης των ιστοσελίδων, να εξοικονομήσει bandwidth και να σας δώσει μια πιο ομαλή εμπειρία περιήγησης.", + "cards.dataUsage.description": "Χρήση δεδομένων", + "cards.dataUsage.upgrade": "Αναβάθμιση τώρα", + "cards.dataUsage.mb-used": "Έχετε χρησιμοποιήσει %d/%dMB από τα μηνιαία σας δεδομένων υψηλής ταχύτητας.", + "cards.dataUsage.upgrade-link": "Κάντε αναβάθμιση τώρα για απεριόριστα δεδομένα υψηλής ταχύτητας!", + "cards.subscription.description": "Pro συνδρομή", + "cards.subscription.renew": "Ανανέωση", + "cards.subscription.months": "Απομένουν %d μήνας/ες του Lantern Pro στη συνδρομή σας", + "cards.subscription.days": "Απομένουν %d ήμερα/ες του Lantern Pro στη συνδρομή σας", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "ΗΜΕΡΕΣ", + "cards.subscription.renew-link": "Ανανεώστε το λογαριασμό σας για να προσθέσετε περισσότερο χρόνο" +} \ No newline at end of file diff --git a/locale/translation/en-US.json b/locale/translation/en-US.json new file mode 100644 index 000000000..f866742a0 --- /dev/null +++ b/locale/translation/en-US.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW": "Show %s", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Quit %s", + "BACKEND_DATA_TITLE": "No more high speed %s data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using %s at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your %s data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your %s high speed data. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update %s to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s has been downloaded. Please restart %s to use it.", + "BACKEND_MITM_INSTALL_CERT": "%s wants to install a custom certificate to improve performance", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s needs your permission to install diagnostic tools. This will help us improve your %s experience.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Unable to save configuration", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Unable to save application configuration. %s cannot guarantee that traffic will be correctly proxied.", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "app.error": "Something went wrong!", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Questions?", + "about.title": "About", + "account.add.password": "Add Account Password", + "account.agree.terms": "I understand that losing my password means losing\naccount access. Lantern cannot help you recover\nyour password.", + "account.agree.terms.error": "Must first agree to terms", + "account.cancel": "Cancel Pro Account", + "account.created": "Account Created!", + "account.create.pro.account.header": "Create Pro Account", + "account.create.pro.account.text": "Lantern is changing the way user accounts are handled. From now on Pro users will need to create a username and password. These credentials will be used to sign in to other devices, and provide access to new features.", + "account.have.a.account": "Have an Account?", + "account.link.username.pro": "Link username to Pro Account", + "account.recovery": "Account Recovery", + "account.recovery.link.device": "Link Device", + "account.recovery.device.code": "Device Linking Code", + "account.recovery.device.enter.code": "Enter or Paste Device Linking Pin", + "account.recovery.device.instructions.header": "To link this device to your Pro account:", + "account.recovery.device.instructions.step.one": "1. Choose the ‘Link a Device’ option from the Account Management screen item on your Desktop Pro device, or From the menu on you Mobile Pro Device.", + "account.recovery.device.instructions.step.two": "2. Enter the device linking code, and submit.", + "account.recovery.device.instructions.part.three": "*Ensure both devices are running the most recent version of Lantern", + "account.recovery.method": "Please Choose a method to recover your account", + "account.recovery.send.email": "Send Email", + "account.recovery.submit": "Submit", + "account.recovery.success": "Linking Success!", + "account.pro_management": "Pro Account Management", + "account.free_management": "Account Management", + "account.free.cap": "{{mb}} MB of free data remaining. Resets at {{reset}}", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To Authorize this device to use your Pro account:", + "account.freelink.step1": "1. Choose the 'Link a Device' option from the Menu on your Pro Device", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Ensure both devices are running the most recent version of Lantern", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade_pro": "Upgrade to Pro", + "account.upgrade": "Upgrade", + "account.upgrade_platinum": "Upgrade to Platinum", + "account.create": "Create Account", + "account.email": "Email", + "account.confirm.password": "Confirm Password", + "account.password": "Password", + "account.pro.email": "Email:", + "account.pro.expiration": "Pro Account Expiration", + "account.platinum.expiration": "Platinum Account Expiration", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Lantern Pro Devices (up to 3)", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "Renew Pro Account", + "account.platinum.renew": "Renew Platinum Account", + "account.pro.renew_CN": "Renew", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "account.signin": "Sign In", + "account.signout": "Sign Out", + "account.submit": "Submit", + "account.username": "Username", + "account.switch.to.register": "Switch to Create Account", + "account.switch.to.signin": "Switch to Sign In", + "account.invalid.username": "Username is invalid", + "account.invalid.email": "Email is invalid", + "account.password.mismatch": "Confirm Password doesn't match password", + "account.password.short": "Password is too short", + "account.password.lowercase": "Password must contain at least one lowercase letter", + "account.password.uppercase": "Password must contain at least one uppercase letter", + "account.password.number": "Password must contain at least one number", + "account.password.compromised": "Password appears on a list of compromised passwords", + "modal.register.free.header": "Register or Sign in to access Yinbi Wallet", + "modal.register.pro.header": "Add account password to access Yinbi Wallet", + "modal.register.pro.signin.header": "Sign in to access Yinbi Wallet", + "modal.register.free.text": "To use the Yinbi Wallet you must have a Lantern Account, please Register or\nSign in to Continue.", + "modal.register.pro.text": "To use the Yinbi wallet you must add a password to your Lantern account.", + "modal.register.pro.signin.text": "To use the Yinbi wallet you must sign in to your Lantern account", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Cancel", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Card Number", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "android.download": "Lantern Android", + "android.download.title": "Download Lantern Android", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Device Linking", + "authorize.step1.email_linking": "Email Linking", + "authorize.device_linking_explanation": "Use this method if you are signed into another device and have it with you", + "authorize.device_email_explanation": "Use this method if you want a Device linking pin sent to your email", + "authorize.link_device": "Link Device", + "authorize.step1.choose": "Please choose a method to Link your account", + "authorize.step1.or": "or", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step1.description": "Enter your email and if the account exists we will send an email with a device linking code", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An email with a recovery code has been sent to {{email}} if this account exists. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.continue.lantern": "Continue to Lantern", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Device Authorized", + "button.account": "Account", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade to Lantern Pro", + "button.copy_your_code": "Copy your code", + "button.try_again": "Try again", + "button.continue": "Continue", + "button.continue_to": "Continue to {{planType}}", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "Cancel", + "confirm": "Confirm", + "norecoveryyinbi": "*Does not recover Yinbi Wallet", + "email.recovery.check.email": "Check your email for a message with a Recovery Code", + "email.recovery.code.label": "Enter or Paste Recovery Code", + "email.recovery.no.code": "Didnt get a Code?", + "email.recovery.text": "Enter your email, and we will send you a code to reset your password.\nIf you have a Yinbi Wallet, this will NOT recover your Yinbi wallet, to recover your Yinbi Wallet enter your Yinbi Recovery Phrase.", + "email.recovery.desc": "Use this method if you want a recovery code sent to your email", + "device.recovery.desc": "Use this method if you are signed in to another device and have it with you", + "google_search": "Google Search", + "giveaway.upgrade": "Upgrade to receive today's free distribution", + "giveaway.title_released_today": "{{formattedTokens}} YNB being released today", + "giveaway.what_is_it": "What is the Yinbi Giveaway?", + "giveaway.description1": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro.", + "giveaway.description2": "YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern.", + "giveaway.learn_more": "Learn More", + "link_device": "Already have a Pro account? Link device", + "email.recovery": "Email Recovery", + "email_taken": "Email already registered", + "username_taken": "Username already registered", + "err.unknown_error": "Unknown error", + "err.internal_error": "Internal error", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "User exists", + "err.no_such_user": "No such user", + "err.user_already_verified": "User already verified", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "err.wrong_link_code": "Wrong link code", + "err.invalid_credentials": "The supplied user credentials were invalid", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Faster Speed", + "feature.faster": "Faster Data Centers", + "feature.unlimited": "Unlimited Data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.yinbi.tooltip": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro. YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern!", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "home.get_lantern_platinum": "Upgrade your plan", + "home.welcome_popup_subheader": "Welcome to the new Lantern!", + "home.welcome_popup_content_1": "We have been hard at work, updating Lantern and adding new features.", + "home.welcome_popup_content_2": "In our new UI, you will find a search bar that allows you to search shared files on the Lantern network. You can also contribute content by posting a file yourself. This is a Beta feature, so try it out, and tell us what you think, we will continue to make improvements based on your feedback.", + "home.welcome_popup_button": "Try it out", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "input.existing_email": "Existing email", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Please try again", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue. Due to volume, we cannot respond to most issues, but we assure you we are working hard to improve Lantern based on your reports.", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Languages", + "lantern.email": "Lantern Email", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "About", + "nav.account": "Account Management", + "nav.authorize": "Add Device", + "nav.authorized": "Device Authorized", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "Language", + "nav.lantern": "Lantern", + "nav.mobile": "Get Mobile Version", + "nav.report_issue": "Report an Issue", + "nav.settings": "Settings", + "nav.support": "Support", + "nav.verify": "Account Verification", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Retry", + "notifications": "Notifications", + "notifications.whatisnew": "What's New?", + "password.change": "Change Password", + "password.changed": "Password Changed", + "continue.to.pro": "Continue to Pro", + "username": "Username", + "password.new": "New Password", + "password.requirements": "
Password must contain the following:
  • 8 or more characters
  • 1 lowercase letter
  • 1 uppercase letter
  • At least 1 number
  • Not on a list of compromised passwords
", + "password.reset": "Reset Password", + "paxful.buy": "Buy", + "paxful.payment": "Payment method", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Online Wallets", + "paxful.bank": "Bank Transfers", + "paxful.gamer_card": "Game Cards", + "paxful.gift_card": "Gift Cards", + "paxful.cash": "Cash Payment", + "paxful.digital_currency": "Digital Currencies", + "paxful.button": "Show Best Deals", + "payment.close": "Close", + "payment.redirectErrorTitle": "Error connecting to payment server", + "payment.redirectErrorText": "We are currently working on resolving this issue. Please check back later.", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment.moreOptions": "More Options", + "payment.fewerOptions": "Fewer Options", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.most_popular": "Most Popular!", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.choose_method": "Choose Payment Method", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.bonus_months": "+ {{bonusMonths}} months", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Select", + "plan.two_year": "Two Year", + "plan.one_year": "One Year", + "plan.savings": "Save {{formattedDiscount}} %", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here.", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.payment.btc": "Pay with ₿", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Select", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Activation Code", + "promotion.activation.instructions": "Enter your email and the 25 digit activation code received from the reseller to register your account.", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Register for Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "referral.description_free": "Share your code with your friends, and get 1 month of Lantern Pro service for free when they purchase Pro!", + "referral.description_pro": "Share your code with your friends and get 1 month of Additional Lantern Pro service for free when they purchase Pro!", + "register": "Register", + "renew.subtitle_early": "Renew for 3 free months!", + "renew.subtitle_last_day": "Renew for 3 free months!", + "renew.subtitle_expired": "Renew for 45 free days!", + "renew.details_early": "Your Lantern Pro membership is ending soon. Renew now and enjoy up to three months free!", + "renew.details_last_day": "Your Lantern Pro membership ends today! Renew now and enjoy up to three months free!", + "renew.details_expired": "Your Lantern Pro membership has expired. Renew now and enjoy up to forty-five days free!", + "renew.asterisk_early": "* This limited time offer is only valid for early renewals.", + "renew.asterisk_last_day": "* This is your last chance to receive this special offer!", + "renew.asterisk_expired": "* This is a limited time offer!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_title_30_days_platinum": "Renew Platinum now for huge savings!", + "renew.notification_text_30_days": "Your {{planName}} account expires in {{remainingDays}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "{{planName}} discount ends tomorrow!", + "renew.notification_text_2_days": "Your {{planName}} account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your {{planName}} account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.favorite": "Favorite", + "replica.added_to_favorites": "Added to Favorites", + "replica.filedrop_error": "Error uploading this file", + "replica.filedrop_error.file-too-large": "Maximum allowed file size is {{fileSize}}", + "replica.filedrop_error.file-too-small": "File is too small", + "replica.filedrop_error.too-many-files": "Too many files", + "replica.filedrop_error.file-invalid-type": "This file type is not currently supported", + "replica.filedrop_remove_file": "Remove from queue", + "replica.post": "Upload File", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.documents": "Documents", + "replica.audio": "Audio", + "replica.application": "Apps", + "replica.image": "Images", + "replica.video": "Videos", + "replica.web": "Web", + "replica.news": "News", + "replica.upload_alert.dont_show": "Don't show this again", + "replica.upload_alert.cancel": "Cancel Upload", + "replica.upload_alert.resume": "Resume Upload", + "replica.upload_alert.info": "Important Information!", + "replica.upload_alert.desc1": "Files uploaded to Lantern are distributed and decentralized. Once they are accessed by another user they cannot be deleted from the network by anyone, including Lantern, even if they are deleted from your 'My Files' list.", + "replica.upload_alert.desc2": "Please refrain from using personal identifying information in the file or filename when uploading sensitive content.", + "replica.add_details": "Add details", + "replica.cannot_edit": "Filenames cannot be edited once published.", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.selectAll": "Select All", + "replica.search_replica": "Search", + "replica.search_results_info": "This tab only shows Lantern results.", + "replica.search_results_info_message": "Lantern results are comprised of content uploaded by users to the Lantern network.", + "replica.no_files_found": "No Results", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this file type", + "replica.no_description": "No description provided", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Close", + "replica.files": "Files", + "replica.upload_history": "Upload history", + "replica.my_favorites": "Favorites", + "replica.no_uploads": "No Uploads Yet", + "replica.no_favorites": "No Favorites Yet", + "replica.mime_type": "File type: {{mime}}", + "replica.image_loading_error": "Error loading image", + "replica.play": "Play", + "replica.pause": "Pause", + "replica.scrub": "Scrub", + "replica.skip_forward": "Skip forward", + "replica.skip_backwards": "Skip backwards", + "replica.trending_videos": "Trending Videos", + "replica.file_uploaded": "Uploaded: {{days}} days ago", + "replica.file_size": "Size", + "replica.duration": "Duration", + "replica.filename": "File Name", + "replica.filename_required": "Name Your File", + "replica.description_optional": "Add Description", + "replica.expand": "Expand details", + "replica.filetype": "File type", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Cancel", + "replica.progress_current_upload": "Upload of", + "replica.progress_files": "files", + "replica.progress_of": "of", + "replica.progress_upload_complete": "Complete", + "replica.progress_upload_failure": "Upload failed please try again.", + "replica.upload_in_progress": "Upload in progress", + "replica.upload_pending": "Upload pending", + "replica.upload_error": "Upload error", + "replica.upload_cancel": "Cancel upload", + "replica.upload_confirm": "Are you sure you want to cancel the upload?", + "replica.progress_view": "View", + "replica.delete": "Delete", + "replica.remove": "Remove", + "replica.delete_file": "Delete File", + "replica.remove_favorite": "Remove from Favorites", + "replica.failed_to_delete": "Failed to delete", + "replica.failed_to_remove": "Failed to remove", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.remove_favorite_confirmation_1": "Are you sure you want to remove", + "replica.remove_favorite_confirmation_2": "from your favorites", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Download", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drop file to begin upload!", + "replica.empty_uploads_text1": "Click", + "replica.empty_uploads_text2": "here", + "replica.empty_uploads_text3": "to make your first post.", + "replica.error_header": "Oops", + "replica.error": "There was an error processing your request. Please try again.", + "replica.serp_empty": "Google has not returned any results for this query.", + "replica.disclaimer": "Lantern anonymizes your searches and protects them from third parties", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.lantern_ads": "Show Lantern Ads", + "settings.lantern_ads_tooltip": "Lantern shows you ads on some websites to help support our service. No user information is collected or passed to our servers. If you turn this option off, you may still see ads, but they will not be from the Lantern network.", + "settings.proxyAll": "Proxy all traffic", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "Settings", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Language", + "settings.diagnostics": "Attach Diagnostic Information", + "settings.diagnostics_tooltip": "Attaching diagnostic information will send the Lantern team data captured from your connection. This will increase our ability to identify and solve your issue.", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connecting...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "support.forum": "Lantern User Forum", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "terms_of_service.replica": "By Searching, uploading or using our products in any way, you agree to our Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Enter or Paste Device Linking Pin", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_2": "To Link a Device to your Pro Account:", + "verify.howto_3": "1. Choose ‘Authorize Device for Pro from the Menu of your other device.", + "verify.howto_4": "2. Enter the linking pin obtained from step 1, and submit.", + "verify.reminder": "*Ensure both devices are running the most recent version of Lantern", + "verify.enter_pin": "Enter or Paste Device Linking Pin", + "verify.submit": "Submit", + "verify.title": "Account Verification", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.title": "Welcome To Lantern Pro", + "welomeToPro.title_exclamation": "Welcome to Lantern Pro!", + "purchase.failed": "Purchase failed. Please try again later.", + "purchase.success": "Purchase Success", + "purchase.success_title": "Welcome to Lantern {{planType}}!", + "purchase.success_content_pro": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "purchase.success_content_platinum": "You now have unlimited access using our dedicated lines and fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.description": "You now have unrestricted access to blocked sites and services", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Invite Friends", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time.", + "auth.email": "Email", + "auth.username": "Username", + "auth.username.or.email": "Username or Email", + "auth.signin": "Sign In", + "current.password": "Current Password", + "new.password": "New Password", + "auth.change.password": "Change Password", + "confirm.new.password": "Confirm New Password", + "auth.password": "Password", + "auth.have.recovery.phrase": "Have a Recovery Phrase?", + "auth.forgot.password": "Forgot or do not have password?", + "auth.create.account": "Create Account", + "auth.missing.username": "Missing username", + "auth.missing.current.password": "Missing current password", + "auth.missing.new.password": "Missing new password", + "auth.missing.confirm.password": "Missing confirm password", + "invalid_credentials": "Invalid Credentials", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Create Wallet", + "new.to.yinbi": "New to Yinbi?", + "setup.wallet": "Yes, lets set up a new wallet!", + "web.wallet": "No, I have a Wallet on the Yin.bi Website", + "yinbi.next": "Next", + "yinbi.amount": "Amount", + "yinbi.missing.address": "No destination address provided", + "yinbi.missing.amount": "No amount specified", + "yinbi.missing.email": "No email address specified", + "yinbi.missing.username": "No username specified", + "yinbi.missing.password": "No password specified", + "yinbi.invalid.address": "{{destination}} is not a valid Stellar address", + "yinbi.send": "Send", + "yinbi.to": "To:", + "yinbi.try_again": "Try again?", + "yinbi.success.transaction": "Transaction Successful!", + "yinbi.failure.transaction": "Transaction Failed", + "yinbi.confirm.transaction": "Confirm Transaction", + "yinbi.sent.details": "You sent {{amount}} YNB to {{destination}}", + "yinbi.sent.failure.details": "Your Transaction failed for the following reasons:", + "yinbi.recipient": "Recipient", + "yinbi.available.send": "You have {{balance}} YNB available to send", + "yinbi.wallet.header": "Wallet", + "yinbi.send.header": "Send Yinbi", + "yinbi.recovery.phrase": "Yinbi Recovery Phrase", + "yinbi.recover.account": "Enter or Paste your Yinbi Recovery Phrase to recover your Yinbi Wallet, and Lantern account", + "yinbi.recovery.desc": "Use this method if you want to sign in to a Yinbi Wallet in addition to your Lantern account", + "yinbi.redeem.codes": "Redeem Bulk Yinbi Codes", + "yinbi.obtain.codes": "Bulk Yinbi Redemption codes can be obtained from reseller.lantern.io", + "yinbi.receive.header": "Receive Yinbi", + "yinbi.this.is.your.wallet": "This is your Yinbi wallet address where people can send you YNB.", + "yinbi.your.address": "Your Address", + "yinbi.no.activity.header": "No Activity", + "yinbi.upgrade.pro.button": "Upgrade to Pro and Get Free Yinbi", + "yinbi.renew.pro.button": "Renew Pro and Get Free Yinbi", + "yinbi.wallet.activity_header": "Activity", + "yinbi.wallet.send": "Send", + "yinbi.wallet.receive": "Receive", + "yinbi.wallet.balance": "Balance", + "yinbi.wallet.getlantern.pro": "Get Lantern Pro + Free Yinbi", + "yinbi.redemption.codes": "Yinbi Redemption Codes", + "redeem_codes.title": "Redeem Yinbi Codes", + "redeem_codes.redeem_button_text": "Redeem", + "redeem_codes.cancel_button_text": "Cancel", + "redeem_codes.success": "Success", + "redeem_codes.errors.missing_codes": "No valid codes entered", + "redeem_codes.errors.invalid_codes": "Error, please check the highlighted codes. Crossed out codes are expired and can no longer be redeemed.", + "yinbi.new.account.text": "Once you send or receive Yinbi your transactions will appear here.", + "yinbi.createAccount": "Create Account", + "yinbi.confirm.account.text": "To make sure that you wrote the phrase down correctly, please enter the following words from your recovery phrase", + "create_account.invalid_words.error": "The words entered didn't match those of the recovery passphrase", + "yinbi.recovery_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet\nin case of a forgotten password. Use a password manager or make a hard copy when\nstoring this phrase.", + "yinbi.recovery_confirm_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet in case of a forgotten password. Use a password manager or make a hard copy when storing this phrase.", + "yinbi.import.wallet": "Import Wallet", + "yinbi.setup.wallet": "Set up Wallet", + "yinbi.importWallet": "Import Yin.bi Wallet", + "yinbi.import.wallet.continue": "Continue to Your Wallet", + "yinbi.import.wallet.success": "Import Wallet Success!", + "yinbi.wallet.text": "To access the Yinbi Wallet, you can Create an Account, Sign In or\nImport your wallet from Yin.bi if you have signed up on the Yin.bi\nwebsite before.", + "yinbi.wallet.pro.text": "To access the Yinbi Wallet, you can Create an Account, Import your wallet from Yin.bi if you have signed up before.", + "yinbi.recovery_subheader": "Yinbi Wallet Recovery Phrase", + "yinbi.import_wallet.subheader": "Import Yinbi Wallet", + "yinbi.import_wallet.text": "Sign in using your Yin.bi credentials to transfer your wallet to Lantern", + "yinbi.import_wallet.success": "Your Wallet has been imported successfully please add your email to complete account registration.", + "yinbi.import_wallet.success_subheader": "Import Success!", + "yinbi.import_wallet.button": "Import Yin.bi Wallet", + "yinbi.import_wallet.success_button": "Complete Registration", + "yinbi.recovery_passphrase.label_text": "Recovery Phrase", + "yinbi.recovery_passphrase.copy_button_text": "Copy", + "terms_of_service.notice": "Notice", + "terms_of_service.i_agree": "I agree", + "platinum": "Platinum", + "platinum.one_year": "1 year pricing", + "platinum.two_years": "2 year pricing", + "platinum.save": "Up to {{savings}}% savings!", + "platinum.unlimited": "Unlimited Data", + "platinum.logs": "No logs", + "platinum.devices": "Connect up to 3 devices", + "platinum.everything_in_pro": "Everything included in Pro", + "platinum.faster_data": "Faster data centers", + "platinum.dedicated": "Dedicated line", + "platinum.reliability": "Increased Reliability", + "platinum.platinum_one_year": "Lantern Platinum 1 year", + "platinum.platinum_two_years": "Lantern Platinum 2 years", + "platinum.pro_one_year": "Lantern Pro 1 year", + "platinum.pro_two_years": "Lantern Pro 2 years", + "platinum.total": "Total", + "platinum.free": "Free", + "platinum.credit.days": " + {{ days }} days", + "platinum.credit.months": "{{ months }} month(s)", + "platinum.upgrade": "Upgrade to Platinum", + "platinum.upgrade_details": "Dedicated Line + Faster Data centers!", + "platinum.unused_time_disclaimer": "Pro users upgrading to Platinum will see their converted Pro subscription listed as added time above.", + "p2p.opt_in_description": "Use your internet to help people access the internet uncensored", + "p2p.active_sharing_description": "Your internet sharing is on", + "p2p.dialog.title": "Share internet access", + "p2p.dialog.text.1": "Help others with restricted access to the internet by sharing your connection. By allowing access to your internet, you will be part of a network of volunteers that makes the internet more open.", + "p2p.dialog.text.2": "Sharing will not compromise your identity or safety. You can stop sharing your internet whenever you want.", + "p2p.dialog.yes_button": "YES, START SHARING", + "p2p.dialog.no_button": "CANCEL", + "p2p.banner.introducing": "INTRODUCING", + "top_sites.top_sites": "Top Sites" +} diff --git a/locale/translation/en.json b/locale/translation/en.json new file mode 100644 index 000000000..f866742a0 --- /dev/null +++ b/locale/translation/en.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW": "Show %s", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Quit %s", + "BACKEND_DATA_TITLE": "No more high speed %s data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using %s at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your %s data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your %s high speed data. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update %s to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s has been downloaded. Please restart %s to use it.", + "BACKEND_MITM_INSTALL_CERT": "%s wants to install a custom certificate to improve performance", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s needs your permission to install diagnostic tools. This will help us improve your %s experience.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Unable to save configuration", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Unable to save application configuration. %s cannot guarantee that traffic will be correctly proxied.", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "app.error": "Something went wrong!", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Questions?", + "about.title": "About", + "account.add.password": "Add Account Password", + "account.agree.terms": "I understand that losing my password means losing\naccount access. Lantern cannot help you recover\nyour password.", + "account.agree.terms.error": "Must first agree to terms", + "account.cancel": "Cancel Pro Account", + "account.created": "Account Created!", + "account.create.pro.account.header": "Create Pro Account", + "account.create.pro.account.text": "Lantern is changing the way user accounts are handled. From now on Pro users will need to create a username and password. These credentials will be used to sign in to other devices, and provide access to new features.", + "account.have.a.account": "Have an Account?", + "account.link.username.pro": "Link username to Pro Account", + "account.recovery": "Account Recovery", + "account.recovery.link.device": "Link Device", + "account.recovery.device.code": "Device Linking Code", + "account.recovery.device.enter.code": "Enter or Paste Device Linking Pin", + "account.recovery.device.instructions.header": "To link this device to your Pro account:", + "account.recovery.device.instructions.step.one": "1. Choose the ‘Link a Device’ option from the Account Management screen item on your Desktop Pro device, or From the menu on you Mobile Pro Device.", + "account.recovery.device.instructions.step.two": "2. Enter the device linking code, and submit.", + "account.recovery.device.instructions.part.three": "*Ensure both devices are running the most recent version of Lantern", + "account.recovery.method": "Please Choose a method to recover your account", + "account.recovery.send.email": "Send Email", + "account.recovery.submit": "Submit", + "account.recovery.success": "Linking Success!", + "account.pro_management": "Pro Account Management", + "account.free_management": "Account Management", + "account.free.cap": "{{mb}} MB of free data remaining. Resets at {{reset}}", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To Authorize this device to use your Pro account:", + "account.freelink.step1": "1. Choose the 'Link a Device' option from the Menu on your Pro Device", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Ensure both devices are running the most recent version of Lantern", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade_pro": "Upgrade to Pro", + "account.upgrade": "Upgrade", + "account.upgrade_platinum": "Upgrade to Platinum", + "account.create": "Create Account", + "account.email": "Email", + "account.confirm.password": "Confirm Password", + "account.password": "Password", + "account.pro.email": "Email:", + "account.pro.expiration": "Pro Account Expiration", + "account.platinum.expiration": "Platinum Account Expiration", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Lantern Pro Devices (up to 3)", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "Renew Pro Account", + "account.platinum.renew": "Renew Platinum Account", + "account.pro.renew_CN": "Renew", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "account.signin": "Sign In", + "account.signout": "Sign Out", + "account.submit": "Submit", + "account.username": "Username", + "account.switch.to.register": "Switch to Create Account", + "account.switch.to.signin": "Switch to Sign In", + "account.invalid.username": "Username is invalid", + "account.invalid.email": "Email is invalid", + "account.password.mismatch": "Confirm Password doesn't match password", + "account.password.short": "Password is too short", + "account.password.lowercase": "Password must contain at least one lowercase letter", + "account.password.uppercase": "Password must contain at least one uppercase letter", + "account.password.number": "Password must contain at least one number", + "account.password.compromised": "Password appears on a list of compromised passwords", + "modal.register.free.header": "Register or Sign in to access Yinbi Wallet", + "modal.register.pro.header": "Add account password to access Yinbi Wallet", + "modal.register.pro.signin.header": "Sign in to access Yinbi Wallet", + "modal.register.free.text": "To use the Yinbi Wallet you must have a Lantern Account, please Register or\nSign in to Continue.", + "modal.register.pro.text": "To use the Yinbi wallet you must add a password to your Lantern account.", + "modal.register.pro.signin.text": "To use the Yinbi wallet you must sign in to your Lantern account", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Cancel", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Card Number", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "android.download": "Lantern Android", + "android.download.title": "Download Lantern Android", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Device Linking", + "authorize.step1.email_linking": "Email Linking", + "authorize.device_linking_explanation": "Use this method if you are signed into another device and have it with you", + "authorize.device_email_explanation": "Use this method if you want a Device linking pin sent to your email", + "authorize.link_device": "Link Device", + "authorize.step1.choose": "Please choose a method to Link your account", + "authorize.step1.or": "or", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step1.description": "Enter your email and if the account exists we will send an email with a device linking code", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An email with a recovery code has been sent to {{email}} if this account exists. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.continue.lantern": "Continue to Lantern", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Device Authorized", + "button.account": "Account", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade to Lantern Pro", + "button.copy_your_code": "Copy your code", + "button.try_again": "Try again", + "button.continue": "Continue", + "button.continue_to": "Continue to {{planType}}", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "Cancel", + "confirm": "Confirm", + "norecoveryyinbi": "*Does not recover Yinbi Wallet", + "email.recovery.check.email": "Check your email for a message with a Recovery Code", + "email.recovery.code.label": "Enter or Paste Recovery Code", + "email.recovery.no.code": "Didnt get a Code?", + "email.recovery.text": "Enter your email, and we will send you a code to reset your password.\nIf you have a Yinbi Wallet, this will NOT recover your Yinbi wallet, to recover your Yinbi Wallet enter your Yinbi Recovery Phrase.", + "email.recovery.desc": "Use this method if you want a recovery code sent to your email", + "device.recovery.desc": "Use this method if you are signed in to another device and have it with you", + "google_search": "Google Search", + "giveaway.upgrade": "Upgrade to receive today's free distribution", + "giveaway.title_released_today": "{{formattedTokens}} YNB being released today", + "giveaway.what_is_it": "What is the Yinbi Giveaway?", + "giveaway.description1": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro.", + "giveaway.description2": "YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern.", + "giveaway.learn_more": "Learn More", + "link_device": "Already have a Pro account? Link device", + "email.recovery": "Email Recovery", + "email_taken": "Email already registered", + "username_taken": "Username already registered", + "err.unknown_error": "Unknown error", + "err.internal_error": "Internal error", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "User exists", + "err.no_such_user": "No such user", + "err.user_already_verified": "User already verified", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "err.wrong_link_code": "Wrong link code", + "err.invalid_credentials": "The supplied user credentials were invalid", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Faster Speed", + "feature.faster": "Faster Data Centers", + "feature.unlimited": "Unlimited Data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.yinbi.tooltip": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro. YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern!", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "home.get_lantern_platinum": "Upgrade your plan", + "home.welcome_popup_subheader": "Welcome to the new Lantern!", + "home.welcome_popup_content_1": "We have been hard at work, updating Lantern and adding new features.", + "home.welcome_popup_content_2": "In our new UI, you will find a search bar that allows you to search shared files on the Lantern network. You can also contribute content by posting a file yourself. This is a Beta feature, so try it out, and tell us what you think, we will continue to make improvements based on your feedback.", + "home.welcome_popup_button": "Try it out", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "input.existing_email": "Existing email", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Please try again", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue. Due to volume, we cannot respond to most issues, but we assure you we are working hard to improve Lantern based on your reports.", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Languages", + "lantern.email": "Lantern Email", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "About", + "nav.account": "Account Management", + "nav.authorize": "Add Device", + "nav.authorized": "Device Authorized", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "Language", + "nav.lantern": "Lantern", + "nav.mobile": "Get Mobile Version", + "nav.report_issue": "Report an Issue", + "nav.settings": "Settings", + "nav.support": "Support", + "nav.verify": "Account Verification", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Retry", + "notifications": "Notifications", + "notifications.whatisnew": "What's New?", + "password.change": "Change Password", + "password.changed": "Password Changed", + "continue.to.pro": "Continue to Pro", + "username": "Username", + "password.new": "New Password", + "password.requirements": "
Password must contain the following:
  • 8 or more characters
  • 1 lowercase letter
  • 1 uppercase letter
  • At least 1 number
  • Not on a list of compromised passwords
", + "password.reset": "Reset Password", + "paxful.buy": "Buy", + "paxful.payment": "Payment method", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Online Wallets", + "paxful.bank": "Bank Transfers", + "paxful.gamer_card": "Game Cards", + "paxful.gift_card": "Gift Cards", + "paxful.cash": "Cash Payment", + "paxful.digital_currency": "Digital Currencies", + "paxful.button": "Show Best Deals", + "payment.close": "Close", + "payment.redirectErrorTitle": "Error connecting to payment server", + "payment.redirectErrorText": "We are currently working on resolving this issue. Please check back later.", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment.moreOptions": "More Options", + "payment.fewerOptions": "Fewer Options", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.most_popular": "Most Popular!", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.choose_method": "Choose Payment Method", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.bonus_months": "+ {{bonusMonths}} months", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Select", + "plan.two_year": "Two Year", + "plan.one_year": "One Year", + "plan.savings": "Save {{formattedDiscount}} %", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here.", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.payment.btc": "Pay with ₿", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Select", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Activation Code", + "promotion.activation.instructions": "Enter your email and the 25 digit activation code received from the reseller to register your account.", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Register for Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "referral.description_free": "Share your code with your friends, and get 1 month of Lantern Pro service for free when they purchase Pro!", + "referral.description_pro": "Share your code with your friends and get 1 month of Additional Lantern Pro service for free when they purchase Pro!", + "register": "Register", + "renew.subtitle_early": "Renew for 3 free months!", + "renew.subtitle_last_day": "Renew for 3 free months!", + "renew.subtitle_expired": "Renew for 45 free days!", + "renew.details_early": "Your Lantern Pro membership is ending soon. Renew now and enjoy up to three months free!", + "renew.details_last_day": "Your Lantern Pro membership ends today! Renew now and enjoy up to three months free!", + "renew.details_expired": "Your Lantern Pro membership has expired. Renew now and enjoy up to forty-five days free!", + "renew.asterisk_early": "* This limited time offer is only valid for early renewals.", + "renew.asterisk_last_day": "* This is your last chance to receive this special offer!", + "renew.asterisk_expired": "* This is a limited time offer!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_title_30_days_platinum": "Renew Platinum now for huge savings!", + "renew.notification_text_30_days": "Your {{planName}} account expires in {{remainingDays}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "{{planName}} discount ends tomorrow!", + "renew.notification_text_2_days": "Your {{planName}} account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your {{planName}} account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.favorite": "Favorite", + "replica.added_to_favorites": "Added to Favorites", + "replica.filedrop_error": "Error uploading this file", + "replica.filedrop_error.file-too-large": "Maximum allowed file size is {{fileSize}}", + "replica.filedrop_error.file-too-small": "File is too small", + "replica.filedrop_error.too-many-files": "Too many files", + "replica.filedrop_error.file-invalid-type": "This file type is not currently supported", + "replica.filedrop_remove_file": "Remove from queue", + "replica.post": "Upload File", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.documents": "Documents", + "replica.audio": "Audio", + "replica.application": "Apps", + "replica.image": "Images", + "replica.video": "Videos", + "replica.web": "Web", + "replica.news": "News", + "replica.upload_alert.dont_show": "Don't show this again", + "replica.upload_alert.cancel": "Cancel Upload", + "replica.upload_alert.resume": "Resume Upload", + "replica.upload_alert.info": "Important Information!", + "replica.upload_alert.desc1": "Files uploaded to Lantern are distributed and decentralized. Once they are accessed by another user they cannot be deleted from the network by anyone, including Lantern, even if they are deleted from your 'My Files' list.", + "replica.upload_alert.desc2": "Please refrain from using personal identifying information in the file or filename when uploading sensitive content.", + "replica.add_details": "Add details", + "replica.cannot_edit": "Filenames cannot be edited once published.", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.selectAll": "Select All", + "replica.search_replica": "Search", + "replica.search_results_info": "This tab only shows Lantern results.", + "replica.search_results_info_message": "Lantern results are comprised of content uploaded by users to the Lantern network.", + "replica.no_files_found": "No Results", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this file type", + "replica.no_description": "No description provided", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Close", + "replica.files": "Files", + "replica.upload_history": "Upload history", + "replica.my_favorites": "Favorites", + "replica.no_uploads": "No Uploads Yet", + "replica.no_favorites": "No Favorites Yet", + "replica.mime_type": "File type: {{mime}}", + "replica.image_loading_error": "Error loading image", + "replica.play": "Play", + "replica.pause": "Pause", + "replica.scrub": "Scrub", + "replica.skip_forward": "Skip forward", + "replica.skip_backwards": "Skip backwards", + "replica.trending_videos": "Trending Videos", + "replica.file_uploaded": "Uploaded: {{days}} days ago", + "replica.file_size": "Size", + "replica.duration": "Duration", + "replica.filename": "File Name", + "replica.filename_required": "Name Your File", + "replica.description_optional": "Add Description", + "replica.expand": "Expand details", + "replica.filetype": "File type", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Cancel", + "replica.progress_current_upload": "Upload of", + "replica.progress_files": "files", + "replica.progress_of": "of", + "replica.progress_upload_complete": "Complete", + "replica.progress_upload_failure": "Upload failed please try again.", + "replica.upload_in_progress": "Upload in progress", + "replica.upload_pending": "Upload pending", + "replica.upload_error": "Upload error", + "replica.upload_cancel": "Cancel upload", + "replica.upload_confirm": "Are you sure you want to cancel the upload?", + "replica.progress_view": "View", + "replica.delete": "Delete", + "replica.remove": "Remove", + "replica.delete_file": "Delete File", + "replica.remove_favorite": "Remove from Favorites", + "replica.failed_to_delete": "Failed to delete", + "replica.failed_to_remove": "Failed to remove", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.remove_favorite_confirmation_1": "Are you sure you want to remove", + "replica.remove_favorite_confirmation_2": "from your favorites", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Download", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drop file to begin upload!", + "replica.empty_uploads_text1": "Click", + "replica.empty_uploads_text2": "here", + "replica.empty_uploads_text3": "to make your first post.", + "replica.error_header": "Oops", + "replica.error": "There was an error processing your request. Please try again.", + "replica.serp_empty": "Google has not returned any results for this query.", + "replica.disclaimer": "Lantern anonymizes your searches and protects them from third parties", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.lantern_ads": "Show Lantern Ads", + "settings.lantern_ads_tooltip": "Lantern shows you ads on some websites to help support our service. No user information is collected or passed to our servers. If you turn this option off, you may still see ads, but they will not be from the Lantern network.", + "settings.proxyAll": "Proxy all traffic", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "Settings", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Language", + "settings.diagnostics": "Attach Diagnostic Information", + "settings.diagnostics_tooltip": "Attaching diagnostic information will send the Lantern team data captured from your connection. This will increase our ability to identify and solve your issue.", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connecting...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "support.forum": "Lantern User Forum", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "terms_of_service.replica": "By Searching, uploading or using our products in any way, you agree to our Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Enter or Paste Device Linking Pin", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_2": "To Link a Device to your Pro Account:", + "verify.howto_3": "1. Choose ‘Authorize Device for Pro from the Menu of your other device.", + "verify.howto_4": "2. Enter the linking pin obtained from step 1, and submit.", + "verify.reminder": "*Ensure both devices are running the most recent version of Lantern", + "verify.enter_pin": "Enter or Paste Device Linking Pin", + "verify.submit": "Submit", + "verify.title": "Account Verification", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.title": "Welcome To Lantern Pro", + "welomeToPro.title_exclamation": "Welcome to Lantern Pro!", + "purchase.failed": "Purchase failed. Please try again later.", + "purchase.success": "Purchase Success", + "purchase.success_title": "Welcome to Lantern {{planType}}!", + "purchase.success_content_pro": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "purchase.success_content_platinum": "You now have unlimited access using our dedicated lines and fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.description": "You now have unrestricted access to blocked sites and services", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Invite Friends", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time.", + "auth.email": "Email", + "auth.username": "Username", + "auth.username.or.email": "Username or Email", + "auth.signin": "Sign In", + "current.password": "Current Password", + "new.password": "New Password", + "auth.change.password": "Change Password", + "confirm.new.password": "Confirm New Password", + "auth.password": "Password", + "auth.have.recovery.phrase": "Have a Recovery Phrase?", + "auth.forgot.password": "Forgot or do not have password?", + "auth.create.account": "Create Account", + "auth.missing.username": "Missing username", + "auth.missing.current.password": "Missing current password", + "auth.missing.new.password": "Missing new password", + "auth.missing.confirm.password": "Missing confirm password", + "invalid_credentials": "Invalid Credentials", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Create Wallet", + "new.to.yinbi": "New to Yinbi?", + "setup.wallet": "Yes, lets set up a new wallet!", + "web.wallet": "No, I have a Wallet on the Yin.bi Website", + "yinbi.next": "Next", + "yinbi.amount": "Amount", + "yinbi.missing.address": "No destination address provided", + "yinbi.missing.amount": "No amount specified", + "yinbi.missing.email": "No email address specified", + "yinbi.missing.username": "No username specified", + "yinbi.missing.password": "No password specified", + "yinbi.invalid.address": "{{destination}} is not a valid Stellar address", + "yinbi.send": "Send", + "yinbi.to": "To:", + "yinbi.try_again": "Try again?", + "yinbi.success.transaction": "Transaction Successful!", + "yinbi.failure.transaction": "Transaction Failed", + "yinbi.confirm.transaction": "Confirm Transaction", + "yinbi.sent.details": "You sent {{amount}} YNB to {{destination}}", + "yinbi.sent.failure.details": "Your Transaction failed for the following reasons:", + "yinbi.recipient": "Recipient", + "yinbi.available.send": "You have {{balance}} YNB available to send", + "yinbi.wallet.header": "Wallet", + "yinbi.send.header": "Send Yinbi", + "yinbi.recovery.phrase": "Yinbi Recovery Phrase", + "yinbi.recover.account": "Enter or Paste your Yinbi Recovery Phrase to recover your Yinbi Wallet, and Lantern account", + "yinbi.recovery.desc": "Use this method if you want to sign in to a Yinbi Wallet in addition to your Lantern account", + "yinbi.redeem.codes": "Redeem Bulk Yinbi Codes", + "yinbi.obtain.codes": "Bulk Yinbi Redemption codes can be obtained from reseller.lantern.io", + "yinbi.receive.header": "Receive Yinbi", + "yinbi.this.is.your.wallet": "This is your Yinbi wallet address where people can send you YNB.", + "yinbi.your.address": "Your Address", + "yinbi.no.activity.header": "No Activity", + "yinbi.upgrade.pro.button": "Upgrade to Pro and Get Free Yinbi", + "yinbi.renew.pro.button": "Renew Pro and Get Free Yinbi", + "yinbi.wallet.activity_header": "Activity", + "yinbi.wallet.send": "Send", + "yinbi.wallet.receive": "Receive", + "yinbi.wallet.balance": "Balance", + "yinbi.wallet.getlantern.pro": "Get Lantern Pro + Free Yinbi", + "yinbi.redemption.codes": "Yinbi Redemption Codes", + "redeem_codes.title": "Redeem Yinbi Codes", + "redeem_codes.redeem_button_text": "Redeem", + "redeem_codes.cancel_button_text": "Cancel", + "redeem_codes.success": "Success", + "redeem_codes.errors.missing_codes": "No valid codes entered", + "redeem_codes.errors.invalid_codes": "Error, please check the highlighted codes. Crossed out codes are expired and can no longer be redeemed.", + "yinbi.new.account.text": "Once you send or receive Yinbi your transactions will appear here.", + "yinbi.createAccount": "Create Account", + "yinbi.confirm.account.text": "To make sure that you wrote the phrase down correctly, please enter the following words from your recovery phrase", + "create_account.invalid_words.error": "The words entered didn't match those of the recovery passphrase", + "yinbi.recovery_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet\nin case of a forgotten password. Use a password manager or make a hard copy when\nstoring this phrase.", + "yinbi.recovery_confirm_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet in case of a forgotten password. Use a password manager or make a hard copy when storing this phrase.", + "yinbi.import.wallet": "Import Wallet", + "yinbi.setup.wallet": "Set up Wallet", + "yinbi.importWallet": "Import Yin.bi Wallet", + "yinbi.import.wallet.continue": "Continue to Your Wallet", + "yinbi.import.wallet.success": "Import Wallet Success!", + "yinbi.wallet.text": "To access the Yinbi Wallet, you can Create an Account, Sign In or\nImport your wallet from Yin.bi if you have signed up on the Yin.bi\nwebsite before.", + "yinbi.wallet.pro.text": "To access the Yinbi Wallet, you can Create an Account, Import your wallet from Yin.bi if you have signed up before.", + "yinbi.recovery_subheader": "Yinbi Wallet Recovery Phrase", + "yinbi.import_wallet.subheader": "Import Yinbi Wallet", + "yinbi.import_wallet.text": "Sign in using your Yin.bi credentials to transfer your wallet to Lantern", + "yinbi.import_wallet.success": "Your Wallet has been imported successfully please add your email to complete account registration.", + "yinbi.import_wallet.success_subheader": "Import Success!", + "yinbi.import_wallet.button": "Import Yin.bi Wallet", + "yinbi.import_wallet.success_button": "Complete Registration", + "yinbi.recovery_passphrase.label_text": "Recovery Phrase", + "yinbi.recovery_passphrase.copy_button_text": "Copy", + "terms_of_service.notice": "Notice", + "terms_of_service.i_agree": "I agree", + "platinum": "Platinum", + "platinum.one_year": "1 year pricing", + "platinum.two_years": "2 year pricing", + "platinum.save": "Up to {{savings}}% savings!", + "platinum.unlimited": "Unlimited Data", + "platinum.logs": "No logs", + "platinum.devices": "Connect up to 3 devices", + "platinum.everything_in_pro": "Everything included in Pro", + "platinum.faster_data": "Faster data centers", + "platinum.dedicated": "Dedicated line", + "platinum.reliability": "Increased Reliability", + "platinum.platinum_one_year": "Lantern Platinum 1 year", + "platinum.platinum_two_years": "Lantern Platinum 2 years", + "platinum.pro_one_year": "Lantern Pro 1 year", + "platinum.pro_two_years": "Lantern Pro 2 years", + "platinum.total": "Total", + "platinum.free": "Free", + "platinum.credit.days": " + {{ days }} days", + "platinum.credit.months": "{{ months }} month(s)", + "platinum.upgrade": "Upgrade to Platinum", + "platinum.upgrade_details": "Dedicated Line + Faster Data centers!", + "platinum.unused_time_disclaimer": "Pro users upgrading to Platinum will see their converted Pro subscription listed as added time above.", + "p2p.opt_in_description": "Use your internet to help people access the internet uncensored", + "p2p.active_sharing_description": "Your internet sharing is on", + "p2p.dialog.title": "Share internet access", + "p2p.dialog.text.1": "Help others with restricted access to the internet by sharing your connection. By allowing access to your internet, you will be part of a network of volunteers that makes the internet more open.", + "p2p.dialog.text.2": "Sharing will not compromise your identity or safety. You can stop sharing your internet whenever you want.", + "p2p.dialog.yes_button": "YES, START SHARING", + "p2p.dialog.no_button": "CANCEL", + "p2p.banner.introducing": "INTRODUCING", + "top_sites.top_sites": "Top Sites" +} diff --git a/locale/translation/es.json b/locale/translation/es.json new file mode 100644 index 000000000..fd753e3d2 --- /dev/null +++ b/locale/translation/es.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Estado: %v", + "TRAY_CONNECT": "Conectar", + "TRAY_DISCONNECT": "Desconectar", + "TRAY_SHOW": "Mostrar %s", + "TRAY_UPGRADE_TO_PRO": "Actualice a PRO", + "TRAY_QUIT": "Salir de %s", + "BACKEND_DATA_TITLE": "No hay más datos de alta velocidad de %s", + "BACKEND_DATA_MESSAGE": "¡Pásese a la versión Pro para seguir usando %s a toda velocidad!", + "BACKEND_DATA_PERCENT_TITLE": "Ha alcanzado %s de sus %s de datos", + "BACKEND_DATA_PERCENT_MESSAGE": "Ha usado %s de sus %s de datos de alta velocidad. ¡Pásese a una versión superior!", + "BACKEND_CLICK_LABEL": "Abrir", + "BACKEND_CLICK_LABEL_OPEN": "Abrir", + "BACKEND_CLICK_LABEL_HELP": "Ayuda", + "BACKEND_CLICK_LABEL_GOT_IT": "Lo tengo", + "BACKEND_AUTOUPDATED_TITLE": "Pasar %s a la versión %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Se ha descargado %s %s. Reinicie %s para usarlo.", + "BACKEND_MITM_INSTALL_CERT": "%s quiere instalar un certificado personalizado para mejorar el rendimiento", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Por favor, permita a %v efectuar cambios en su sistema", + "BACKEND_ALERT_TITLE": "Hay una alerta crítica que debe atender", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s necesita su permiso para instalar herramientas de diagnóstico. Esto nos ayudará a mejorar su experiencia con %s.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "No se ha podido guardar la configuración", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "No se ha podido guardar la configuración. %s no puede garantizar que el tráfico se dirija mediante proxy correctamente.", + "about.content": "Lantern es una aplicación que proporciona acceso a la Internet abierta rápido, fiable y seguro.", + "app.error": "¡Algo salió mal!", + "about.faq": "Lea las Preguntas Frecuentes (FAQ) de Lantern", + "about.open": "Internet abierta para todos", + "about.questions": "¿Preguntas?", + "about.title": "Acerca de", + "account.add.password": "Añadir la contraseña de la cuenta", + "account.agree.terms": "Soy consciente de que, si pierdo mi contraseña, perderé\ntambién el acceso a la cuenta. Lantern no puede ayudarle\na recuperar la contraseña.", + "account.agree.terms.error": "Primero, debe aceptar las condiciones", + "account.cancel": "Cancelar cuenta Pro", + "account.created": "¡Cuenta creada!", + "account.create.pro.account.header": "Crear cuenta Pro", + "account.create.pro.account.text": "Lantern está cambiando la forma de gestionar las cuentas de usuario. A partir de ahora, los usuarios Pro tendrán que crear un nombre de usuario y una contraseña. Dichas credenciales se usarán para iniciar sesión en otros dispositivos y para acceder a características nuevas.", + "account.have.a.account": "¿Tiene cuenta?", + "account.link.username.pro": "Vincular nombre de usuario con cuenta Pro", + "account.recovery": "Recuperación de cuenta", + "account.recovery.link.device": "Vincular dispositivo", + "account.recovery.device.code": "Código de vinculación del dispositivo", + "account.recovery.device.enter.code": "Introduzca o pegue el PIN de vinculación del dispositivo", + "account.recovery.device.instructions.header": "Para vincular este dispositivo a su cuenta Pro:", + "account.recovery.device.instructions.step.one": "1. Seleccione la opción \"Vincular un dispositivo\" en el elemento de la pantalla Administración de cuenta de su dispositivo de escritorio Pro o en el menú de su dispositivo móvil Pro.", + "account.recovery.device.instructions.step.two": "2. Introduzca el código de vinculación del dispositivo, y envíelo.", + "account.recovery.device.instructions.part.three": "* Asegúrese de que ambos dispositivos tienen la versión más reciente de Lantern", + "account.recovery.method": "Elija un método para recuperar su cuenta", + "account.recovery.send.email": "Enviar correo electrónico", + "account.recovery.submit": "Enviar", + "account.recovery.success": "¡Vinculación completada!", + "account.pro_management": "Gestión de cuenta Pro", + "account.free_management": "Administración de cuenta", + "account.free.cap": "{{mb}} MB de datos gratuitos restantes. Se restablecen a las {{reset}}", + "account.free.cap.upgrade": "Actualice a Pro para datos de alta velocidad ilimitados", + "account.freelink.validFor": "válido para %s", + "account.freelink.desc": "Para autorizar a este dispositivo a utilizar su cuenta Pro:", + "account.freelink.step1": "1. Elija la opción \"Vincular un dispositivo\" en el menú de su dispositivo Pro", + "account.freelink.step2": "2. Introduzca el código de vinculación del dispositivo, y envíelo.", + "account.freelink.reminder": "* Asegúrese de que ambos dispositivos tienen la versión más reciente de Lantern", + "account.freelink.errorTitle": "Error al vincular", + "account.freelink.errorText": "¿Está seguro de que introdujo el código en su dispositivo Pro?", + "account.freelink.headerDesc": "Vincule este dispositivo a su cuenta Pro", + "account.freelink.title": "Código de vinculación del dispositivo", + "account.pro.charge": "Su cuenta será cargada automáticamente por otro año de Lantern Pro al final de su ciclo de facturación.", + "account.upgrade_pro": "Actualice a PRO", + "account.upgrade": "Cambiar a plan superior", + "account.upgrade_platinum": "Actualizar a Platinum", + "account.create": "Crear cuenta", + "account.email": "Correo electrónico", + "account.confirm.password": "Confirmar contraseña", + "account.password": "Contraseña", + "account.pro.email": "Correo electrónico:", + "account.pro.expiration": "Caducidad de la cuenta Pro", + "account.platinum.expiration": "Caducidad de la cuenta Platinum", + "account.pro.expired": "Su cuenta Pro ha caducado. Renuévela ahora para datos mensuales ilimitados.", + "account.pro.expiry": "Su cuenta pro caduca en %s días el %s.", + "account.pro.bonusMonths": "¡Esto incluye sus {{bonusMonths}} meses de bonus!", + "account.pro.thisdevice": "(Este dispositivo)", + "account.pro.logout": "CERRAR SESIÓN", + "account.pro.removedevice": "ELIMINAR", + "account.pro.devices": "Dispositivos Lantern Pro (hasta 3)", + "account.pro.device.confirm.title": "Dispositivo desautorizado", + "account.pro.device.confirm": "¿Está seguro de que quiere eliminar el dispositivo \"{{device}}\" de su cuenta de Lantern Pro?", + "account.pro.device.one.title": "Sólo un dispositivo", + "account.pro.device.one": "Lo sentimos, pero no puede eliminar su último dispositivo autorizado.", + "account.pro.linkingcode": "Código de vinculación de dispositivo:", + "account.pro.renew": "Renovar cuenta Pro", + "account.platinum.renew": "Renovar la cuenta Platinum", + "account.pro.renew_CN": "Renovar", + "account.prolink.errorTitle": "Error al vincular", + "account.prolink.errorText": "¿Está seguro de que copió el código correctamente desde su otro dispositivo?", + "account.prolink.successTitle": "Se ha vinculado el dispositivo", + "account.prolink.successText": "¡Ha vinculado con éxito su dispotivo! Por favor, espere un momento a que su otro dispositivo se transforme en pro automáticamente.", + "account.signin": "Iniciar sesión", + "account.signout": "Cerrar sesión", + "account.submit": "Enviar", + "account.username": "Nombre de usuario", + "account.switch.to.register": "Cambiar a Crear cuenta", + "account.switch.to.signin": "Cambiar a Iniciar sesión", + "account.invalid.username": "El nombre de usuario no es válido", + "account.invalid.email": "El correo electrónico no es válido", + "account.password.mismatch": "Las contraseñas no coinciden", + "account.password.short": "La contraseña es demasiado corta", + "account.password.lowercase": "La contraseña debe contener, al menos, una letra minúscula", + "account.password.uppercase": "La contraseña debe contener, al menos, una letra mayúscula", + "account.password.number": "La contraseña debe contener, al menos, un número", + "account.password.compromised": "La contraseña aparece en la lista de contraseñas no seguras", + "modal.register.free.header": "Regístrese o inicie sesión para acceder a la cartera Yinbi", + "modal.register.pro.header": "Añada la contraseña de la cuenta para acceder a la cartera Yinbi", + "modal.register.pro.signin.header": "Inicie sesión para acceder a la cartera Yinbi", + "modal.register.free.text": "Para usar la cartera Yinbi debe tener una cuenta en Lantern. Regístrese o\ninicie sesión para continuar.", + "modal.register.pro.text": "Para usar la cartera Yinbi debe añadir una contraseña a su cuenta de Lantern.", + "modal.register.pro.signin.text": "Para usar la cartera Yinbi, debe iniciar sesión con su cuenta de Lantern", + "adyen.paymentMethods.title": "Métodos de pago", + "adyen.paymentMethods.storedMethods": "Sus métodos de pago", + "adyen.paymentMethods.otherMethods": "Seleccione otro método de pago", + "adyen.paymentMethods.moreMethodsButton": "Mas métodos de pago", + "adyen.payButton": "Pagar", + "adyen.payButton.formatted": "Pagar %@", + "adyen.cancelButton": "Cancelar", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Guardar para mi próximo pago", + "adyen.payment.redirecting": "Se le redirigirá", + "adyen.payment.processing": "Su pago está siendo procesado", + "adyen.creditCard.title": "Datos de la tarjeta", + "adyen.creditCard.holderName": "Nombre del titular de la tarjeta", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Número de tarjeta", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Número de tarjeta no válido", + "adyen.creditCard.expiryDateField.title": "Fecha de caducidad", + "adyen.creditCard.expiryDateField.placeholder": "MM/AA", + "adyen.creditCard.expiryDateField.invalid": "Fecha de caducidad no válida", + "adyen.creditCard.expiryDateField.month": "Mes", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "AA", + "adyen.creditCard.expiryDateField.year": "Año", + "adyen.creditCard.cvcField.title": "CVC/CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Número de cuotas", + "adyen.creditCard.storeDetailsButton": "Guardar esta tarjeta para mi próximo pago", + "adyen.creditCard.oneClickVerification.title": "Verifique su tarjeta", + "adyen.creditCard.oneClickVerification.message": "Introduzca el código CVC para %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC no válido", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Por favor ingrese un CVC válido para continuar", + "adyen.sepaDirectDebit.ibanField.title": "Número de cuenta (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Número de cuenta no válido", + "adyen.sepaDirectDebit.nameField.title": "Nombre del titular", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Acepto que el importe que figura a continuación se cargue en mi cuenta bancaria.", + "adyen.sepa.ownerName": "Nombre del titular", + "adyen.sepa.ibanNumber": "Número de cuenta (IBAN)", + "adyen.giropay.searchField.placeholder": "Nombre del banco / BIC / Código bancario", + "adyen.giropay.minimumLength": "Mínimo 3 caracteres", + "adyen.giropay.noResults": "No hay resultados de búsqueda", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "La redirección falló", + "adyen.error.subtitle.payment": "El pago falló", + "adyen.error.subtitle.refused": "Pago rechazado", + "adyen.error.message.unknown": "Se produjo un error desconocido", + "adyen.error.message.cannotConnectToInternet": "Fallo de conexión a Internet: compruebe su conexión a Internet.", + "adyen.error.message.cannotConnectToHost": "Fallo de conexión a nuestro servidor de pagos.", + "adyen.error.retryButton": "Pruebe de nuevo", + "adyen.idealIssuer.selectField.title": "Banco", + "adyen.idealIssuer.selectField.placeholder": "Seleccione su banco", + "adyen.creditCard.success": "El pago se ha completado", + "adyen.oneClick.confirmationAlert.title": "Confirmar el pago con %@", + "adyen.redirect.cannotOpenApp.title": "No se puede abrir la aplicación", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Esta aplicación no se pudo abrir porque no está instalada en este dispositivo.", + "adyen.holderName": "Nombre del titular de la tarjeta", + "adyen.countryCode": "Código de país", + "adyen.telephone.number": "Número de teléfono", + "android.download": "Lantern para Android", + "android.download.title": "Descargar Lantern para Android", + "authorize.title": "Autorizar dispositivo para Pro", + "authorize.step1.have_pro_device": "Tengo otro dispositivo Lantern Pro", + "authorize.step1.link": "Vinculación de dispositivo", + "authorize.step1.email_linking": "Vinculación de correo electrónico", + "authorize.device_linking_explanation": "Use este método si ha iniciado sesión con otro dispositivo y lo tiene a mano", + "authorize.device_email_explanation": "Use este método si quiere recibir un PIN de vinculación de dispositivo por correo electrónico", + "authorize.link_device": "Vincular dispositivo", + "authorize.step1.choose": "Elija un método para vincular su cuenta", + "authorize.step1.or": "o", + "authorize.step1.recover": "Necesito recuperar mi cuenta de Lantern Pro", + "authorize.step1.start": "iniciar recuperación", + "authorize.step1.no_mail": "¿No recuerda su dirección de correo electrónico?", + "authorize.step1.description": "Introduzca su correo electrónico y, si la cuenta ya existe, le enviaremos un mensaje con un código de vinculación de dispositivo", + "authorize.step2b.enter_code": "Introduzca su código de recuperación de cuenta", + "authorize.step2b.code": "Código de recuperación de cuenta", + "authorize.step2b.instruction": "Si la cuenta {{email}} existe, habrá recibido un código de recuperación. El correo electrónico puede tardar varias horas en llegar. Si no lo encuentra, mire en su carpeta de correo no deseado.", + "authorize.step2b.no_mail": "No recibí el correo", + "authorize.step3.recovery": "Recuperación de cuenta", + "authorize.step3.no_email": "¡Uups! Estamos teniendo problemas para encontrar esa dirección de correo electrónico. Por favor, proporcione más información debajo para ayudarnos a encontrar su cuenta.", + "authorize.step3.no_code_received": "¿Está teniendo problemas para recibir el correo de recuperación? Introduzca la información de debajo y contactaremos con usted en las próximas 48 horas.", + "authorize.step3.your_email": "Su dirección de correo electrónico", + "authorize.step3.payment_method": "Método de pago", + "authorize.step3.payment_method_hint": "Seleccione el método de pago que usó para adquirir Pro", + "authorize.step3.credit_card": "Tarjeta de crédito", + "authorize.step3.alipay": "Alipay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Recibí Pro por referir a un amigo", + "authorize.step3.payment_account": "Cuenta de pago", + "authorize.step3.payment_account_hint": "Introduzca la información de su cuenta de Alipay", + "authorize.step3.referral_code": "Su código de referencia", + "authorize.step3.purchase_date": "Fecha de compra", + "authorize.step3.note": "Por favor, anote cualquier otra información que pueda ayudarnos a encontrar su cuenta.", + "authorize.step4.title": "Recuperación de cuenta en-marcha", + "authorize.step4.text1": "¡Gracias! Hemos recibido su petición de recuperación de cuenta.", + "authorize.step4.text2": "Por favor, permítanos 48 horas para recuperar la información de su cuenta Pro.", + "authorize.step4.text3": "Enviaremos información a la dirección de correo electrónico introducida en la pantalla anterior.", + "authorized.continue": "Continuar hacia Pro", + "authorized.continue.lantern": "Continuar con Lantern", + "authorized.text": "¡Este dispositivo ahora está autorizado para usar su cuenta Lantern Pro!", + "authorized.title": "Dispositivo autorizado", + "button.account": "Cuenta", + "button.renew": "Renovar", + "button.upgrade": "Actualizar", + "button.upgrade_now": "Actualizar ahora", + "button.upgrade_to_lantern_pro": "Actualizar a Lantern Pro", + "button.copy_your_code": "Copiar su código", + "button.try_again": "Pruebe de nuevo", + "button.continue": "Continuar", + "button.continue_to": "Continuar a {{planType}}", + "bullet.click_button": "Haga clic en el botón de debajo", + "bullet.paste_code": "Pegue el código y el enlace de descarga en un mensaje", + "bullet.send_to_friends": "Envíelo a sus amigos", + "cancel": "Cancelar", + "confirm": "Confirmar", + "norecoveryyinbi": "* No recupera la cartera Yinbi", + "email.recovery.check.email": "Revise su correo electrónico para ver si hay un mensaje con un código de recuperación", + "email.recovery.code.label": "Introduzca o pegue el código de recuperación", + "email.recovery.no.code": "¿No ha recibido ningún código?", + "email.recovery.text": "Introduzca su correo electrónico y le enviaremos un código para restablecer su contraseña.\nSi ya cuenta con una cartera Yinbi, NO la recuperará de esta forma. Para ello, deberá introducir su frase de recuperación de Yinbi.", + "email.recovery.desc": "Use este método si quiere recibir un código de recuperación por correo electrónico", + "device.recovery.desc": "Use este método si ha iniciado sesión con otro dispositivo y lo tiene a mano", + "google_search": "Búsqueda en Google", + "giveaway.upgrade": "Mejore su versión para recibir la distribución gratuita de hoy", + "giveaway.title_released_today": "{{formattedTokens}} YNB emitidos hoy", + "giveaway.what_is_it": "¿En qué consiste el sorteo de Yinbi?", + "giveaway.description1": "La fundación Yinbi sortea 888 000 millones de YNB en criptomoneda exclusivamente a través de Lantern a quienes adquieran Lantern Pro.", + "giveaway.description2": "Los YNB se distribuirán al final de cada día en función de la cantidad de Yinbi emitidos ese día, el número de personas que mejoran su versión o la renuevan, y el número de años o cuentas que se adquieren. Los YNB se ingresarán directamente en su cartera Yinbi de Lantern.", + "giveaway.learn_more": "Más información", + "link_device": "¿Tiene ya una cuenta Pro? Vincule el dispositivo", + "email.recovery": "Recuperación de correo electrónico", + "email_taken": "Correo electrónico ya registrado", + "username_taken": "El nombre de usuario ya está registrado", + "err.unknown_error": "Error desconocido", + "err.internal_error": "Error interno", + "err.bad_input": "Entrada errónea", + "err.not_authorized": "No autorizado", + "err.user_exists": "El usuario existe", + "err.no_such_user": "No existe tal usuario", + "err.user_already_verified": "El usuario ya está verificado", + "err.invalid_user_verification": "Verificación de usuario no válida", + "err.user_unverified": "Usuario no verificado", + "err.operation_temporarily_unavailable": "Operación temporalmente no disponible", + "err.wrong_or_inexistent_plan": "Plan erróneo o inexistente", + "err.user_has_active_subscription": "El usuario tiene una suscripción activa", + "err.payment_error": "Error en el pago", + "err.no_codes_left": "No se han dejado códigos de referencia", + "err.wrong_code": "Código de referencia erróneo", + "err.redeeming_own_code_not_allowed": "Los códigos de cupón de uno mismo no están permitidos", + "err.wrong_charge_id": "Identificador (ID) de cargo erróneo", + "err.wrong_link_code": "Código de vinculación erróneo", + "err.invalid_credentials": "Las credenciales de usuario introducidas no eran válidas", + "footer.reseller": "¡Haga negocio! Conviértase en un proveedor de Lantern Pro. Haga clic aquí", + "footer.reseller.email_subject": "¡Hábleme sobre el Programa de Proveedores de Lantern!", + "footer.reseller.email_body": "Cuando se convierta en un Proveedor de Lantern tendrá la oportunidad de cargar hasta un 25% adicional en cada venta de una suscripción a Lantern Pro. Cuéntenos debajo un poco acerca de por qué quiere convertirse en un proveedor.", + "feature.faster_speed": "Mayor velocidad", + "feature.faster": "Centros de datos más rápidos", + "feature.unlimited": "Datos ilimitados", + "feature.nologs": "No hay registros", + "feature.devices": "Conecte hasta 3 dispositivos", + "feature.noads": "Sin publicidad", + "feature.yinbi.tooltip": "La fundación Yinbi va a regalar 888 000 millones de criptomonedas YNB exclusivamente a través de Lantern a todas aquellas personas que adquieran Lantern Pro. Los YNB se distribuirán al final de cada día, en función de la cantidad de Yinbi emitidos ese día, el número de personas que mejoran su versión o la renuevan, y el número de años o cuentas que se adquieren. ¡Los YNB se depositarán directamente en su cartera Yinbi en Lantern!", + "feature.antiblock": "Resistente al bloqueo", + "feature.data_center": "Mejores centros de datos", + "feature.free_yinbi": "¡Criptomonedas Yinbi gratis!", + "free.title": "Lantern Pro", + "free.desc": "Más rápido. Más robusto. Ilimitado. Seguro.", + "free.link_account": "¿Ya tiene una cuenta Pro? Enlace su cuenta.", + "home.get_lantern_pro": "Consiga Lantern Pro", + "home.get_lantern_platinum": "Cambiar a un plan superior", + "home.welcome_popup_subheader": "¡Bienvenido al nuevo Lantern!", + "home.welcome_popup_content_1": "Hemos trabajado duro para actualizar Lantern e incorporar características nuevas.", + "home.welcome_popup_content_2": "Puede usar la barra de búsqueda de nuestra nueva IU para encontrar los archivos compartidos de la red Lantern. También puede publicar un archivo usted mismo para aportar contenido. Se trata de una característica Beta, así que pruébela y díganos qué le parece. Tendremos en cuenta sus comentarios para seguir mejorando.", + "home.welcome_popup_button": "Probar", + "input.email": "Correo electrónico", + "input.your_email": "Su dirección de correo electrónico", + "input.confirm_email": "Confirmar direcciones de correo electrónico", + "input.enter_email": "Introduzca su correo electrónico", + "input.use_valid_email": "Escriba una dirección de correo electrónico válida", + "input.email_not_match": "Los campos de correo electrónico no coinciden", + "input.existing_email": "Correo electrónico existente", + "issue.your_email": "Su dirección de correo electrónico", + "issue.attach_image_failure": "No se puede adjuntar la imagen", + "issue.try_again": "Por favor, inténtelo de nuevo", + "issue.select_issue": "Por favor, seleccione un problema", + "issue.selected_issue": "Seleccione un problema", + "issue.select_issue_hint": "Seleccione un problema del menú desplegable", + "issue.note": "Describa su problema", + "issue.description": "Descripción del problema", + "issue.error": "Problema al informar de error", + "issue.submit": "Enviar informe", + "issue.report_screenshot": "Arrastre la imagen o haga clic para subir la captura de pantalla", + "issue.reported": "Gracias por informarnos sobre su problema. Nos pondremos en contacto con usted por correo electrónico en cuanto podamos", + "issue.report_sent": "Informe enviado", + "issue.type.no_access": "No se puede acceder a sitios bloqueados", + "issue.type.payment_fail": "No se puede completar el pago", + "issue.type.cannot_login": "No se puede iniciar sesión", + "issue.type.always_spinning": "El indicador de carga gira permanentemente", + "issue.type.slow": "Lento", + "issue.type.cannot_link_device": "No se pueden vincular dispositivos", + "issue.type.crashes": "Lantern se cae", + "issue.type.other": "Otro", + "languages.title": "Idiomas", + "lantern.email": "Correo electrónico de Lantern", + "mobile.link": "Use el enlace para descargar Lantern en su dispositivo Android:", + "mobile.title": "Obtenga la versión Android", + "nav.about": "Acerca de", + "nav.account": "Administración de cuenta", + "nav.authorize": "Añadir dispositivo", + "nav.authorized": "Dispositivo autorizado", + "nav.unauthorized_link": "Autorizar dispositivo para Pro", + "nav.language": "Idioma", + "nav.lantern": "Lantern", + "nav.mobile": "Obtener versión móvil", + "nav.report_issue": "Informar de un problema", + "nav.settings": "Configuración", + "nav.support": "Soporte", + "nav.verify": "Verificación de cuenta", + "nav.yinbi": "Canje de Yinbi", + "nav.home": "Principal", + "nav.discover": "Descubrir", + "nav.wallet": "Cartera", + "nav.yinbi_wallet": "Cartera Yinbi", + "notification.retry": "Reintentar", + "notifications": "Notificaciones", + "notifications.whatisnew": "¿Qué novedades hay?", + "password.change": "Cambiar contraseña", + "password.changed": "Contraseña cambiada", + "continue.to.pro": "Continuar hacia Pro", + "username": "Nombre de usuario", + "password.new": "Nueva contraseña", + "password.requirements": "
La contraseña debe:
  • Tener 8 o más caracteres
  • Incluir 1 letra minúscula
  • Incluir 1 letra mayúscula
  • Contener al menos un número
  • No constar en una lista de contraseñas no seguras
", + "password.reset": "Restablecer contraseña", + "paxful.buy": "Comprar", + "paxful.payment": "Método de pago", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Carteras en línea", + "paxful.bank": "Transferencias bancaria", + "paxful.gamer_card": "Tarjetas de juego", + "paxful.gift_card": "Tarjetas regalo", + "paxful.cash": "Pago en efectivo", + "paxful.digital_currency": "Divisas digitales", + "paxful.button": "Mostrar las mejores ofertas", + "payment.close": "Cerrar", + "payment.redirectErrorTitle": "Error al conectarse al servidor de pago", + "payment.redirectErrorText": "Estamos trabajando para resolver el problema. Vuelva a comprobarlo más tarde.", + "payment.wait_for_pro": "¡Gracias por su compra de Lantern Pro! Por favor, espere un momento para que su Lantern cambie automáticamente a Pro.", + "payment.moreOptions": "Más opciones", + "payment.fewerOptions": "Menos opciones", + "payment_methods.select_name": "Seleccione método de pago", + "payment_methods.alipay": "Tarjeta de crédito/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Para adquirir Lantern Pro", + "payment_methods.shetab.details.body": "Cuando haga clic en Continuar con la compra, se le redirigirá a un sitio externo para completar el pago y obtener su código de activación.", + "payment_methods.shetab.details.tutorial_header": "Tutorial persa", + "payment_methods.shetab.details.purchase_voucher_button": "Continuar con la compra", + "payment_methods.shetab.details.input_code_button": "Introduzca el código de activación", + "plan.step1": "Paso 1", + "plan.apply": "Aplicar", + "plan.step2": "Paso 2", + "plan.most_popular": "¡El preferido!", + "plan.step3": "Paso 3", + "plan.choose_plan": "Elegir plan", + "plan.enter_email": "Introducir correo electrónico", + "plan.choose_method": "Elegir método de pago", + "plan.bestValue": "¡La mejor oferta!", + "plan.per_month": "al mes", + "plan.yinbi_2x": "¡Más el doble de Yinbi!", + "plan.oneYear": "1 año", + "plan.add_referral": "Añadir código de referencia", + "plan.years": "Años del plan: {{years}}", + "plan.desc": "Una sola factura de {{price}}", + "plan.bonus_months": "{{bonusMonths}} meses más", + "plan.price.cny": "%.02f ¥", + "plan.price.usd": "%.02f $", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/Año", + "plan.select": "Seleccionar", + "plan.two_year": "Dos años", + "plan.one_year": "Un año", + "plan.savings": "Ahorrar un {{formattedDiscount}} %", + "plans.title": "Tarifas de Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Para Windows, Android, Mac y Ubuntu.", + "plans.from_reseller": "¿Tiene un código de activación de Lantern Pro? Haga clic aquí.", + "plans.with_voucher_code": "¿Tiene un código de activación? Haga clic aquí.", + "pro.apply": "Sus créditos se aplicarán a su cuenta en el próximo ciclo de facturación.", + "pro.title": "Invite a amigos, obtenga más Pro de forma gratuita", + "pro.subtitle": "Cuando su amigo adquiera la tarifa bianual ambos obtendrán 3 meses adicionales de Pro, la tarifa anual les proporciona a ambos 1 mes gratis.", + "pro.share": "¡Comparta su código con amigos para comenzar a ganar más créditos!", + "promotion.title": "Registro de Lantern Pro", + "promotion.title.activation": "Activación de Lantern Pro", + "promotion.enter_and_confirm_email": "Por favor, introduzca y confirme su correo electrónico", + "promotion.code.hint": "Introduzca el código de referencia de su amigo (opcional)", + "promotion.code.label": "Código de referencia", + "promotion.payment": "Continuar hacia el pago", + "promotion.payment.btc": "Pagar con ₿", + "promotion.loading": "Cargando...", + "promotion.howto_1y": "Si un amigo compartió su código de referencia con usted, introduzca el código para recibir un mes de Lantern Pro gratis tras registrarse.", + "promotion.howto_2y": "Si un amigo compartió su código de referencia con usted, introduzca el código para recibir tres meses de Lantern Pro gratis tras registrarse.", + "promotion.pay": "A pagar {{amount}}", + "promotion.select": "Seleccionar", + "promotion.promotion_applied_1y": "1 mes más de bonificación", + "promotion.promotion_applied_2y": "3 meses más de bonificación", + "promotion.too_many_referrals": "El código de referencia ya ha sido añadido. Regístrese ahora para recibir sus meses extra.", + "promotion.activation.enter_and_confirm_email": "Por favor, introduzca y confirme su dirección de correo electrónico para registrar su cuenta de Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Código de Activación", + "promotion.activation.instructions": "Introduzca su correo electrónico y el código de activación de 25 dígitos que le haya mandado el distribuidor para crear una cuenta.", + "promotion.activation.howto": "Por favor, introduzca arriba su código de activación de Lantern Pro de 25 caracteres. Si no tiene un código, por favor, adquiera Pro en la siguiente pantalla o busque un proveedor de Lantern Pro en línea.", + "promotion.activation.continue": "Regístrese en Pro", + "promotion.voucher.hint": "Código de Activación", + "promotion.voucher.howto": "Introduzca el código de activación de 12 caracteres de Fast World Pay que se muestra arriba", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error al canjear su código de activación.", + "promotion.voucher.error.invalid_code": "Código de activación invalido", + "promotion.voucher.error.invalid_plan": "Código de activación asociado a un plan no válido", + "promotion.voucher.error.already_redeemed": "El código de activación ya ha sido canjeado", + "referral.code": "Código de referencia", + "referral.text": "¡Use mi código %s y recibirá 3 meses gratis cuando se registre!", + "referral.description_free": "¡Dele su código a sus amigos y obtenga un mes del servicio Lantern Pro gratis cuando compren la versión Pro!", + "referral.description_pro": "¡Dele su código a sus amigos y obtenga un mes más del servicio Lantern Pro gratis cuando compren la versión Pro!", + "register": "Registrarse", + "renew.subtitle_early": "¡Renueve por 3 meses gratis!", + "renew.subtitle_last_day": "¡Renueve por 3 meses gratis!", + "renew.subtitle_expired": "¡Renuévese por 45 días libres!", + "renew.details_early": "Tu membresía de Lantern Pro terminará pronto. ¡Renuévela ahora y disfrute de hasta tres meses gratis!", + "renew.details_last_day": "¡Tu membresía de Lantern Pro termina hoy! ¡Renuévela ahora y disfrute de hasta tres meses gratis!", + "renew.details_expired": "Su membresía de Lantern Pro ha expirado. ¡Renuévela ahora y disfrute de hasta cuarenta y cinco días gratis!", + "renew.asterisk_early": "* Esta oferta de tiempo limitado sólo es válida para renovaciones anticipadas.", + "renew.asterisk_last_day": "* ¡Esta es tu última oportunidad de recibir esta oferta especial!", + "renew.asterisk_expired": "* ¡Esta es una oferta por tiempo limitado!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 MES GRATIS", + "renew.plan_renewal_bonus_months": "$%d%s + %d MESES GRATIS", + "renew.plan_renewal_bonus_days": "$%d%s + %d DÍAS GRATIS", + "renew.next": "siguiente", + "renew.decline": "Declinar oferta", + "renew.decline_question": "¿Está seguro de que quiere declinar esta oferta?", + "renew.decline_yes": "Renovar más tarde", + "renew.decline_dismiss": "Renovar ahora", + "renew.notification_title_30_days": "¡Renueve Pro ahora para obtener enormes descuentos!", + "renew.notification_title_30_days_platinum": "¡Renueve Platinum ahora para obtener enormes descuentos!", + "renew.notification_text_30_days": "Su cuenta de {{planName}} caduca en {{remainingDays}} días. Renueve ahora y obtenga hasta 3 meses gratis.", + "renew.notification_title_2_days": "¡El descuento para {{planName}} finaliza mañana!", + "renew.notification_text_2_days": "Su cuenta de {{planName}} caduca mañana. No deje pasar este fantástico descuento.", + "renew.notification_title_last_day": "¡Última oportunidad para obtener un descuento!", + "renew.notification_text_last_day": "Su cuenta de {{planName}} ha caducado. Renueve hoy y obtenga hasta 3 meses gratis.", + "replica.upload": "Subir", + "replica.favorite": "Marcar favorito", + "replica.added_to_favorites": "Añadido a favoritos", + "replica.filedrop_error": "Error al subir este archivo", + "replica.filedrop_error.file-too-large": "El tamaño máximo de archivo permitido es {{fileSize}}", + "replica.filedrop_error.file-too-small": "El archivo es demasiado pequeño", + "replica.filedrop_error.too-many-files": "Demasiados archivos", + "replica.filedrop_error.file-invalid-type": "No se admite este tipo de archivo en este momento", + "replica.filedrop_remove_file": "Eliminar de la cola", + "replica.post": "Subir archivo", + "replica.relevance": "Relevancia", + "replica.upload_date": "Fecha de subida", + "replica.gallery_view": "Vista de galería", + "replica.list_view": "Vista de lista", + "replica.copy_lantern_link": "Copiar enlace de Lantern", + "replica.documents": "Documentos", + "replica.audio": "Audio", + "replica.application": "Aplicaciones", + "replica.image": "Imágenes", + "replica.video": "Vídeos", + "replica.web": "Web", + "replica.news": "Noticias", + "replica.upload_alert.dont_show": "No volver a mostrar", + "replica.upload_alert.cancel": "Cancelar subida", + "replica.upload_alert.resume": "Reanudar subida", + "replica.upload_alert.info": "¡Información importante!", + "replica.upload_alert.desc1": "Los archivos subidos a Lantern se distribuyen y no están centralizados. Una vez que otro usuario accede a ellos, nadie puede borrarlos de la red, ni siquiera a Lantern, incluso si se borran de su lista de \"Mis archivos\".", + "replica.upload_alert.desc2": "No utilice información de identificación personal en el archivo ni en el nombre de archivo al subir contenido confidencial.", + "replica.add_details": "Añadir datos", + "replica.cannot_edit": "Una vez que se publican los nombres de los archivos, ya no se pueden modificar.", + "replica.next": "Siguiente", + "replica.previous": "Anterior", + "replica.selectAll": "Seleccionar todo", + "replica.search_replica": "Buscar", + "replica.search_results_info": "Esta pestaña solo muestra los resultados de Lantern.", + "replica.search_results_info_message": "Los resultados de Lantern pueden incluir contenidos subidos a la red Lantern por usuarios.", + "replica.no_files_found": "No hay resultados", + "replica.or_content": "su propio contenido para que otras personas lo encuentren", + "replica.try_again": "Pruebe con una palabra clave diferente o", + "replica.upload_success": "¡Subida completada!", + "replica.cannot_preview": "No hay vista previa para este tipo de archivo", + "replica.no_description": "No se ha facilitado ninguna descripción", + "replica.size": "Tamaño", + "replica.uploaded": "Subido", + "replica.invalid_link": "Enlace no válido", + "replica.close": "Cerrar", + "replica.files": "Archivos", + "replica.upload_history": "Historial de subida", + "replica.my_favorites": "Favoritos", + "replica.no_uploads": "Aún no se ha subido nada", + "replica.no_favorites": "Aún no hay favoritos", + "replica.mime_type": "Tipo de archivo: {{mime}}", + "replica.image_loading_error": "Error al cargar la imagen", + "replica.play": "Reproducir", + "replica.pause": "Pausar", + "replica.scrub": "Limpiar", + "replica.skip_forward": "Saltar hacia delante", + "replica.skip_backwards": "Saltar hacia atrás", + "replica.trending_videos": "Vídeos populares", + "replica.file_uploaded": "Subida: hace {{days}} días", + "replica.file_size": "Tamaño", + "replica.duration": "Duración", + "replica.filename": "Nombre del archivo", + "replica.filename_required": "Póngale un nombre a su archivo", + "replica.description_optional": "Añadir descripción", + "replica.expand": "Expandir datos", + "replica.filetype": "Tipo de archivo", + "replica.sortby": "Ordenar por", + "replica.link": "Enlace de la réplica", + "replica.collapse": "Cerrar", + "replica.publish": "Publicar", + "replica.cancel": "Cancelar", + "replica.progress_current_upload": "Subida de", + "replica.progress_files": "archivos", + "replica.progress_of": "de", + "replica.progress_upload_complete": "Finalizar", + "replica.progress_upload_failure": "Error de subida. Por favor, inténtelo de nuevo.", + "replica.upload_in_progress": "Subida en curso", + "replica.upload_pending": "Subida pendiente", + "replica.upload_error": "Error de subida", + "replica.upload_cancel": "Cancelar subida", + "replica.upload_confirm": "¿Seguro que quiere cancelar la subida?", + "replica.progress_view": "Ver", + "replica.delete": "Borrar", + "replica.remove": "Eliminar", + "replica.delete_file": "Eliminar archivo", + "replica.remove_favorite": "Eliminar de favoritos", + "replica.failed_to_delete": "No se ha podido eliminar", + "replica.failed_to_remove": "No se ha podido eliminar", + "replica.link_lookup_failure": "No se encontró el enlace", + "replica.delete_file_confirmation_1": "¿Seguro que quiere borrar", + "replica.delete_file_confirmation_2": "de sus subidas", + "replica.remove_favorite_confirmation_1": "¿Seguro que quiere eliminar esto", + "replica.remove_favorite_confirmation_2": "de sus favoritos?", + "replica.share_file": "Compartir archivo", + "replica.download_and_view": "Descargar/Ver", + "replica.download": "Descargar", + "replica.copy_link": "Copiar enlace de réplica", + "replica.find_file": "Buscar archivo", + "replica.file_drop_prompt": "¡Suelte el archivo para iniciar la subida!", + "replica.empty_uploads_text1": "Haz clic", + "replica.empty_uploads_text2": "aquí", + "replica.empty_uploads_text3": "para elaborar tu primera publicación.", + "replica.error_header": "Vaya", + "replica.error": "Se ha producido un problema al procesar su solicitud. Inténtelo de nuevo.", + "replica.serp_empty": "Google no ha arrojado ningún resultado para esta consulta.", + "replica.disclaimer": "Lantern hace anónimas sus búsquedas y las protege de terceras partes", + "settings.general": "General", + "settings.feedback": "Comentarios", + "settings.autoLaunch": "Ejecutar Lantern en el arranque del sistema", + "settings.autoReport": "Enviar de forma segura las estadísticas de uso para contribuir a Lantern", + "settings.lantern_ads": "Mostrar anuncios de Lantern", + "settings.lantern_ads_tooltip": "Lantern pondrá anuncios en algunos sitios web, ya que esto nos ayuda a financiar nuestro servicio. La información de los usuarios no se recopila ni se almacena en nuestros servidores. Si desactiva esta opción, es posible que siga viendo anuncios, pero no serán los de la red Lantern.", + "settings.proxyAll": "Proxyficar todo", + "settings.proxyAllHelpTitle": "¿QUÉ HACE \"PROXYFICAR TODO\"?", + "settings.proxyAllHelp1": "Si está habilitado, todo el tráfico se enviará a través de Lantern (opción más segura).", + "settings.proxyAllHelp2": "Si está deshabilitado, sólo el tráfico bloqueado se enviará a través de Lantern (opción más rápida, la más común).", + "settings.show_advanced": "Mostrar configuración avanzada", + "settings.hide_advanced": "Ocultar configuración avanzada", + "settings.systemProxy": "Administrar proxy de sistema", + "settings.title": "Configuración", + "settings.http_proxy": "Proxy HTTP(S):", + "settings.socks_proxy": "Proxy SOCKS:", + "settings.caution": "Cuidado:", + "settings.caution_text": "Cuando desmarca \"Administrar proxy de sistema\" su navegador y aplicaciones no podrán usar Lantern automáticamente. Si sabe cómo configurar manualmente estos ajustes, indique la información arriba.", + "settings.select_language": "Seleccionar idioma", + "settings.diagnostics": "Adjuntar información de diagnóstico", + "settings.diagnostics_tooltip": "Si adjunta la información de diagnóstico, el equipo de Lantern recibirá los datos que se hayan recopilado de su conexión. De este modo, usted tendrá más posibilidades de identificar y resolver su problema.", + "status.lantern": "Lantern es", + "status.click_reconnect": "Haga clic aquí para volver a conectarse", + "status.server_location": "Ubicación del servidor", + "status.tooltip1": "Lantern utiliza selección inteligente de servidor para conectarle a nuestros mejores centros de datos.", + "status.tooltip2": "Pásese a Lantern Pro para una mayor velocidad con una selección optimizada de servidores de nuestros exclusivos centros de datos Lantern Pro.", + "status.protected_connection": "Su conexión está protegida", + "status.please_wait": "Puede tardar uno o dos minutos...", + "status.connecting": "Conectando...", + "status.no_internet": "Desconectado", + "status.no_internet_connection": "No hay conexión a Internet", + "status.connected": "Conectado", + "status.disconnected": "Desconectado", + "status.throttled": "Velocidad contenida (tope de datos)", + "status.no_system_proxy": "{{status}}, no se gestiona el proxy del sistema", + "status.fail_to_set_system_proxy": "No se ha podido establecer Lantern como proxy del sistema", + "status.fail_to_open_browser": "No se ha abierto la ventana del navegador para mostrar la interfaz de usuario de Lantern", + "support.forum": "Foro de Lantern", + "support.faq": "Preguntas frecuentes (FAQ)", + "terms_of_service.acknowledgment": "Al hacer clic en {{buttonText}}, acepta nuestras condiciones del servicio", + "terms_of_service.replica": "Al buscar contenido, subir archivos o utilizar nuestros productos de cualquier manera, acepta nuestras condiciones del servicio, nuestra política de privacidad y nuestra política de DMCA", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "YouTube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Introduzca o pegue el PIN de vinculación del dispositivo", + "verify.code": "Código de vinculación del dispositivo", + "verify.howto_1": "Si tiene una cuenta Lantern Pro en otro dispositivo, por favor, introduzca su dirección de correo electrónico aquí para reciibir un código con el que autorizar el dispositivo.", + "verify.howto_1a": "Actualmente usted es un usuario Pro no autorizado. Por favor, introduzca su dirección de correo electrónico para autorizar su cuenta Pro. Esto le habilitará para vincular múltiples dispositivos.", + "verify.howto_2": "Para vincular un dispositivo a su cuenta Pro:", + "verify.howto_3": "1. Seleccione \"Autorizar dispositivo para Pro\" en el menú del otro dispositivo.", + "verify.howto_4": "2. Introduzca el PIN de vinculación obtenido en el paso 1 y envíelo.", + "verify.reminder": "* Asegúrese de que ambos dispositivos tienen la versión más reciente de Lantern", + "verify.enter_pin": "Introduzca o pegue el PIN de vinculación del dispositivo", + "verify.submit": "Enviar", + "verify.title": "Verificación de cuenta", + "welcomeToPro.continue": "Continuar hacia Pro", + "welcomeToPro.invite": "Invite a amigos, y por cada uno ambos recibirán 3 meses gratis cuando este adquiera la tarifa bianual, por la tarifa anual ambos recibirán 1 mes gratis. ¡Empiece a invitar!", + "welcomeToPro.thanks": "Ahora dispone de acceso ilimitado con nuestros centros de datos más rápidos. Puede vincular hasta tres dispositivos a su cuenta.", + "welcomeToPro.title": "Bienvenido a Lantern Pro", + "welomeToPro.title_exclamation": "¡Bienvenido a Lantern Pro!", + "purchase.failed": "Error de compra. Inténtelo de nuevo.", + "purchase.success": "Compra realizada", + "purchase.success_title": "¡Le damos la bienvenida a Lantern {{planType}}!", + "purchase.success_content_pro": "Ahora dispone de acceso ilimitado con nuestros centros de datos más rápidos. Puede vincular hasta tres dispositivos a su cuenta.", + "purchase.success_content_platinum": "Ahora dispone de acceso ilimitado con nuestras líneas dedicadas y centros de datos más rápidos. Puede vincular hasta tres dispositivos a su cuenta.", + "welcomeToPro.description": "Ahora tiene acceso sin restricciones a sitios y servicios bloqueados", + "messages.copied_to_clipboard": "Código copiado. ¡Compártalo con sus amigos!", + "messages.datacap": "Ha usado sus datos gratuitos de alta velocidad. Actualice a Pro para datos de alta velocidad ilimitados.", + "messages.fatal_error": "Lo sentimos, estamos teniendo problemas al contactar con los servidores de Lantern. Por favor, compruebe su conexión a Internet e inténtelo de nuevo.", + "messages.backend_gone": "Lo sentimos, Lantern parece que ya no se está ejecutando. Por favor, reinicie Lantern e inténtelo de nuevo.", + "messages.get_help": "Obtener ayuda", + "freeProCredits.title": "Invitar amigos", + "freeProCredits.shareWithFriends": "¡Comparta su código con amigos para obtener meses gratis!", + "freeProCredits.shareWithFriendsDesc": "Cuando su amigo adquiera la tarifa de dos años ambos obtendrán 3 meses gratis, con la tarifa de un año ambos obtendrán 1 mes gratis.", + "cards.serverLocation.unknown": "Desconocido", + "cards.serverLocation.description": "Ubicación optimizada del servidor", + "cards.serverLocation.description-free": "Ubicación del servidor", + "cards.serverLocation.description-upgrade": "Actualice para obtener servidores más rápidos", + "cards.serverLocation.title": "Ubicación actual:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern utiliza selección inteligente de servidor para encontrarle automáticamente la conexión más rápida posible desde nuestros centros de datos en Tokyo, Singapur, Hong Kong, San Francisco, Nueva York, Amsterdam, Bangalore y otros.", + "cards.serverLocation.text-free": "Lantern utiliza selección inteligente de servidor para conectarle a nuestros mejores centros de datos.", + "cards.serverLocation.upgrade-link": "Actualice a Lantern Pro para una velocidad más rápida con selección optimizada de servidor desde nuestros exclusivos centros de datos de Lantern Pro.", + "cards.httpsUpgrades.description": "Actualizaciones a HTTPS", + "cards.httpsUpgrades.title": "Actualizaciones a HTTPS: %d", + "cards.httpsUpgrades.text": "Lantern actualiza automáticamente las conexiones HTTP no seguras a conexiones HTTPS cifradas cuando sea posible para mantener privada su información mientras navega por la web.", + "cards.adsBlocked.description": "Publicidad bloqueada", + "cards.adsBlocked.title": "Publicidad bloqueada: %d", + "cards.adsBlocked.text": "Lantern bloquea publicidad intrusiva para acortar el tiempo de carga de la web, ahorrar ancho de banda, y darle una experiencia de navegación más suave.", + "cards.dataUsage.description": "Uso de datos", + "cards.dataUsage.upgrade": "Actualizar ahora", + "cards.dataUsage.mb-used": "Ha usado %d/%dMB de sus datos de alta velocidad mensuales.", + "cards.dataUsage.upgrade-link": "¡Actualice ahora para un servicio de alta velocidad ilimitado!", + "cards.subscription.description": "Suscripción Pro", + "cards.subscription.renew": "Renovar", + "cards.subscription.months": "Aún tiene %d meses de Lantern Pro en su suscripción.", + "cards.subscription.days": "Aún tiene %d días de Lantern Pro en su suscripción.", + "cards.subscription.unit.months": "MM", + "cards.subscription.unit.days": "DD", + "cards.subscription.renew-link": "Renueve su suscripción para añadir más tiempo.", + "auth.email": "Correo electrónico", + "auth.username": "Nombre de usuario", + "auth.username.or.email": "Nombre de usuario o correo electrónico", + "auth.signin": "Iniciar sesión", + "current.password": "Contraseña actual", + "new.password": "Nueva contraseña", + "auth.change.password": "Cambiar contraseña", + "confirm.new.password": "Confirmar nueva contraseña", + "auth.password": "Contraseña", + "auth.have.recovery.phrase": "¿Tiene una frase de recuperación?", + "auth.forgot.password": "¿Olvidó la contraseña o no tiene ninguna?", + "auth.create.account": "Crear cuenta", + "auth.missing.username": "Falta el nombre de usuario", + "auth.missing.current.password": "Falta la contraseña actual", + "auth.missing.new.password": "Falta la nueva contraseña", + "auth.missing.confirm.password": "Falta la confirmación de la contraseña", + "invalid_credentials": "Credenciales no válidas", + "yinbi.wallet": "Cartera Yinbi", + "create.wallet": "Crear cartera", + "new.to.yinbi": "¿Es la primera vez que usa Yinbi?", + "setup.wallet": "Sí. ¡Vamos a crear una cartera!", + "web.wallet": "No, tengo ninguna cartera en el sitio web Yin.bi", + "yinbi.next": "Siguiente", + "yinbi.amount": "Cantidad", + "yinbi.missing.address": "No se ha facilitado ninguna dirección de destino", + "yinbi.missing.amount": "No se ha especificado ninguna cantidad", + "yinbi.missing.email": "No se ha especificado ninguna dirección de correo electrónico", + "yinbi.missing.username": "No se ha especificado ningún nombre de usuario", + "yinbi.missing.password": "No se ha especificado ninguna contraseña", + "yinbi.invalid.address": "{{destination}} no es una dirección de Stellar válida", + "yinbi.send": "Enviar", + "yinbi.to": "Para:", + "yinbi.try_again": "¿Intentar de nuevo?", + "yinbi.success.transaction": "¡Transacción completada!", + "yinbi.failure.transaction": "La transacción falló", + "yinbi.confirm.transaction": "Confirmar transacción", + "yinbi.sent.details": "Ha enviado {{amount}} YNB a {{destination}}", + "yinbi.sent.failure.details": "Su transacción falló por las siguientes razones:", + "yinbi.recipient": "Destinatario", + "yinbi.available.send": "Tiene {{balance}} YNB que puede enviar", + "yinbi.wallet.header": "Cartera", + "yinbi.send.header": "Enviar Yinbi", + "yinbi.recovery.phrase": "Frase de recuperación de Yinbi", + "yinbi.recover.account": "Introduzca o pegue su frase de recuperación de Yinbi para recuperar su cartera Yinbi y su cuenta de Lantern", + "yinbi.recovery.desc": "Use este método si quiere acceder a una cartera Yinbi además de su cuenta de Lantern", + "yinbi.redeem.codes": "Canjear códigos de Yinbi en bloque", + "yinbi.obtain.codes": "Los códigos de canje de Yinbi en bloque pueden obtenerse en reseller.lantern.io", + "yinbi.receive.header": "Recibir Yinbi", + "yinbi.this.is.your.wallet": "Esta es la dirección de su cartera Yinbi donde la gente puede enviarle YNB.", + "yinbi.your.address": "Su dirección", + "yinbi.no.activity.header": "No hay actividad", + "yinbi.upgrade.pro.button": "Pásese a Pro y consiga Yinbi gratis", + "yinbi.renew.pro.button": "Renueve Pro y consiga Yinbi gratis", + "yinbi.wallet.activity_header": "Actividad", + "yinbi.wallet.send": "Enviar", + "yinbi.wallet.receive": "Recibir", + "yinbi.wallet.balance": "Saldo", + "yinbi.wallet.getlantern.pro": "Consiga Lantern Pro + Yinbi gratis", + "yinbi.redemption.codes": "Códigos de canje de Yinbi", + "redeem_codes.title": "Canjear códigos de Yinbi", + "redeem_codes.redeem_button_text": "Canjear", + "redeem_codes.cancel_button_text": "Cancelar", + "redeem_codes.success": "Operación completada", + "redeem_codes.errors.missing_codes": "Los códigos introducidos no son válidos", + "redeem_codes.errors.invalid_codes": "Error. Compruebe los códigos resaltados. Los códigos tachados han caducado y ya no pueden ser canjeados.", + "yinbi.new.account.text": "Una vez que envíe o reciba Yinbi, sus operaciones aparecerán aquí.", + "yinbi.createAccount": "Crear cuenta", + "yinbi.confirm.account.text": "Para asegurarse de que ha escrito la frase correctamente, introduzca las siguientes palabras de su frase de recuperación", + "create_account.invalid_words.error": "Las palabras introducidas no coincidían con las de la frase de recuperación", + "yinbi.recovery_text": "Esta es su frase de recuperación de la cartera Yinbi. Es la ÚNICA forma de recuperar su catrera Yinbi\nen caso de que no se acuerde de la contraseña. Use un administrador de contraseñas o anótela en papel para\nguardarla.", + "yinbi.recovery_confirm_text": "Esta es su frase de recuperación de la cartera Yinbi. Es la ÚNICA forma de recuperar su catrera Yinbi en caso de que no se acuerde de la contraseña. Use un administrador de contraseñas o anótela en papel para guardarla.", + "yinbi.import.wallet": "Importar cartera", + "yinbi.setup.wallet": "Configurar cartera", + "yinbi.importWallet": "Importar cartera de Yin.bi", + "yinbi.import.wallet.continue": "Continuar con su cartera", + "yinbi.import.wallet.success": "¡Importación de cartera completada!", + "yinbi.wallet.text": "Para acceder a la cartera Yinbi, puede crear una cuenta, iniciar sesión o\nimportar la cartera de Yin.bi si ya se ha registrado en el sitio web Yin.bi.", + "yinbi.wallet.pro.text": "Para acceder a la cartera Yinbi, puede crear una cuenta e importar la cartera de Yin.bi si ya se ha registrado en el sitio web Yin.bi.", + "yinbi.recovery_subheader": "Frase de recuperación de la cartera Yinbi", + "yinbi.import_wallet.subheader": "Importar cartera Yinbi", + "yinbi.import_wallet.text": "Inicie sesión con sus credenciales de Yin.bi para transferir su cartera a Lantern", + "yinbi.import_wallet.success": "Su cartera se ha importado. Añada su correo electrónico para terminar de registrar la cuenta.", + "yinbi.import_wallet.success_subheader": "¡Importación completada!", + "yinbi.import_wallet.button": "Importar cartera de Yin.bi", + "yinbi.import_wallet.success_button": "Completar registro", + "yinbi.recovery_passphrase.label_text": "Frase de recuperación", + "yinbi.recovery_passphrase.copy_button_text": "Copiar", + "terms_of_service.notice": "Aviso", + "terms_of_service.i_agree": "Acepto", + "platinum": "Platinum", + "platinum.one_year": "Precio por 1 año", + "platinum.two_years": "Precio por 2 años", + "platinum.save": "Descuento de hasta el {{savings}} %", + "platinum.unlimited": "Datos ilimitados", + "platinum.logs": "No hay registros", + "platinum.devices": "Conecte hasta 3 dispositivos", + "platinum.everything_in_pro": "Todo lo incluido con Pro", + "platinum.faster_data": "Centros de datos más rápidos", + "platinum.dedicated": "Línea dedicada", + "platinum.reliability": "Mayor fiabilidad", + "platinum.platinum_one_year": "1 año de Lantern Platinum", + "platinum.platinum_two_years": "2 años de Lantern Platinum", + "platinum.pro_one_year": "1 año de Lantern Pro", + "platinum.pro_two_years": "2 años de Lantern Pro", + "platinum.total": "Total", + "platinum.free": "Gratis", + "platinum.credit.days": "+ {{ days }} días", + "platinum.credit.months": "{{ months }} mes(es)", + "platinum.upgrade": "Actualizar a Platinum", + "platinum.upgrade_details": "Línea dedicada y centros de datos más rápidos", + "platinum.unused_time_disclaimer": "Los usuarios Pro que cambien a Platinum verán su suscripción a Pro convertida a tiempo añadido arriba.", + "p2p.opt_in_description": "Utilice su conexión para que otras personas puedan acceder a Internet sin censura", + "p2p.active_sharing_description": "Su uso compartido de Internet está activado", + "p2p.dialog.title": "Comparta el acceso a Internet", + "p2p.dialog.text.1": "Comparta su conexión para ayudar a personas que tengan acceso restringido a Internet. Al permitir que estas disfruten de su conexión a Internet, pasará a formar parte de una red de voluntarios que hace de Internet un lugar más abierto.", + "p2p.dialog.text.2": "El uso compartido no pondrá en peligro su identidad ni su seguridad. Además, puede dejar de compartir su conexión a Internet cuando quiera.", + "p2p.dialog.yes_button": "SÍ, INICIAR EL USO COMPARTIDO", + "p2p.dialog.no_button": "CANCELAR", + "p2p.banner.introducing": "INTRODUCCIÓN", + "top_sites.top_sites": "Los mejores sitios" +} \ No newline at end of file diff --git a/locale/translation/et.json b/locale/translation/et.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/et.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/fa.json b/locale/translation/fa.json new file mode 100644 index 000000000..699274b61 --- /dev/null +++ b/locale/translation/fa.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "لنترن", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "وضعیت: %v", + "TRAY_CONNECT": "متصل", + "TRAY_DISCONNECT": "قطع شدن", + "TRAY_SHOW": "نمایش %s", + "TRAY_UPGRADE_TO_PRO": "ارتقاء به نسخه ویژه (پرو)", + "TRAY_QUIT": "خروج از %s", + "BACKEND_DATA_TITLE": "داده‌های سرعت بالای %s دیگری وجود ندارد", + "BACKEND_DATA_MESSAGE": "لطفاً برای ادامه استفاده از %s با بیشترین سرعت، به Pro ارتقا دهید!", + "BACKEND_DATA_PERCENT_TITLE": "مصرف شما به %s از %s حجم داده رسیده است", + "BACKEND_DATA_PERCENT_MESSAGE": "%s از داده پرسرعت %s خود را مصرف کرده‌اید. اکنون طرحتان را ارتقا دهید!", + "BACKEND_CLICK_LABEL": "باز کنید", + "BACKEND_CLICK_LABEL_OPEN": "باز کنید", + "BACKEND_CLICK_LABEL_HELP": "کمک", + "BACKEND_CLICK_LABEL_GOT_IT": "فهمیدم/گرفتم", + "BACKEND_AUTOUPDATED_TITLE": "%s را به نسخه %s ارتقا دهید", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s دانلود شد. لطفاُ برای استفاده از آن، %s را مجدداً راه‌اندازی کنید.", + "BACKEND_MITM_INSTALL_CERT": "%s می‌خواهد برای بهبود عملکرد، گواهینامه‌ای سفارشی را نصب کند", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "لطفا اجازه دهیدتا ٪ v در سیستم شما تغییر ایجاد کند.", + "BACKEND_ALERT_TITLE": "هشدار مهم نیازمند توجه شماست", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s برای نصب ابزارهای عیب‌یابی به مجوز شما نیاز دارد. این کار به ما در بهبود تجربه %s شما کمک می‌کند.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "امکان ذخیره تنظیمات پیکربندی وجود ندارد", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "امکان ذخیره تنظیمات پیکربندی وجود ندارد. %s نمی تواند تضمین کند که ترافیک به درستی پروکسی می شود.", + "about.content": "لنترن یک برنامه‌ای است که اتصال دائم، پر سرعت و امن را با اینترنت ازاد فراهم می‌کند.", + "app.error": "خطایی رخ داده است!", + "about.faq": "پرسشهای متداول لنترن را بخوانید", + "about.open": "اینترنت بدون فیلتر برای همه", + "about.questions": "پرسش ها", + "about.title": "‫‫درباره‬", + "account.add.password": "افزودن گذرواژه حساب", + "account.agree.terms": "می‌دانم درصورت گم کردن گذرواژه‌ام، دیگر به حسابم دسترسی نخواهم داشت. Lantern نمی‌تواند در بازیابی گذرواژه‌تان به شما کمک کند.", + "account.agree.terms.error": "ابتدا باید با شرایط موافقت کنید", + "account.cancel": "لغو حساب ویژه (پرو)", + "account.created": "حساب ایجاد شد!", + "account.create.pro.account.header": "ایجاد حساب Pro", + "account.create.pro.account.text": "Lantern درحال تغییر مدیریت حساب‌های کاربر است. ازحالا به بعد، کاربران Pro باید نام کاربری و گذرواژه ایجاد کنند. از این اطلاعات کاربری برای ورود به سیستم سایر دستگاه‌ها و ارائه دسترسی به ویژگی‌های جدید استفاده خواهد شد.", + "account.have.a.account": "حساب دارید؟", + "account.link.username.pro": "پیوند کردن نام کاربری به حساب Pro", + "account.recovery": "بازیابی حساب", + "account.recovery.link.device": "پیوند دادن دستگاه", + "account.recovery.device.code": "کد اتصال دستگاه‌", + "account.recovery.device.enter.code": "پین پیوند دستگاه را وارد یا پیست کنید", + "account.recovery.device.instructions.header": "برای ارتباط این دستگاه با حساب ویژه (پرو) خود:", + "account.recovery.device.instructions.step.one": "1. گزینه «پیوند دادن دستگاه» را از مورد روی صفحه «مدیریت حساب» در دستگاه Desktop Pro یا از منو در دستگاه Mobile Pro انتخاب کنید.", + "account.recovery.device.instructions.step.two": "کد اتصال دستگاه را وارد و تسلیم کنید.", + "account.recovery.device.instructions.part.three": "*مطمئن شوید هر دو دستگاه از جدیدترین نسخه Lantern استفاده می‌کنند", + "account.recovery.method": "لطفاً روشی را برای بازیابی حساب انتخاب کنید", + "account.recovery.send.email": "ارسال ایمیل", + "account.recovery.submit": "ثبت اطلاعات", + "account.recovery.success": "پیوند دادن با موفقیت انجام شد!", + "account.pro_management": "مدیریت حساب نسخه حرفه‌ای", + "account.free_management": "مدیریت حساب", + "account.free.cap": "{{mb}} مگابایت داده رایگان باقی مانده است. در {{reset}} بازنشانی می‌شود", + "account.free.cap.upgrade": "برای مصرف نامحدود اینترنت پرسرعت به لنترن ویژه (پرو) بپیوندید.", + "account.freelink.validFor": "معتبر برای %s", + "account.freelink.desc": "برای این که به این دستگاه اجازه استفاده از حساب Pro خود را بدهید، کارهای زیر را انجام دهید:", + "account.freelink.step1": "1. گزینه «Link a Device» (پیوند به یک دستگاه) را از منوی موجود در دستگاه Pro خود انتخاب کنید", + "account.freelink.step2": "کد اتصال دستگاه را وارد و تسلیم کنید.", + "account.freelink.reminder": "*مطمئن شوید که هر دو دستگاه دارای آخرین نسخه Lantern هستند", + "account.freelink.errorTitle": "خطا در پیونددِهی", + "account.freelink.errorText": "آیا مطمئن هستید که کد را در دستگاه ویژه خود وارد کردید؟", + "account.freelink.headerDesc": "این دستکاه را به حساب ویژه (پرو) خود متصل کنید", + "account.freelink.title": "کد اتصال دستگاه‌", + "account.pro.charge": "بعد از پایان حساب سالیانه لنترن ویژه (پرو)، حساب کاربری شما به طور خودکار برای یک سال دیگر شارژ می‌شود.", + "account.upgrade_pro": "ارتقاء به نسخه ویژه (پرو)", + "account.upgrade": "ارتقا‌‌ء", + "account.upgrade_platinum": "ارتقا به نسخه Platinum", + "account.create": "ایجاد حساب", + "account.email": "ایمیل", + "account.confirm.password": "تأیید گذرواژه", + "account.password": "رمز ورود", + "account.pro.email": "ایمیل:", + "account.pro.expiration": "انقضای حساب Pro", + "account.platinum.expiration": "انقضای حساب Platinum", + "account.pro.expired": "حساب کاربری شما منقضی شده است .اکنون برای اطلاعات ماهانه ی نامحدود تجدید کنید.", + "account.pro.expiry": "حساب کاربری حرفه ای شما در%s روز منقضی و در %sبه پایان می رسد.", + "account.pro.bonusMonths": " این شامل پاداش {{bonusMonths}} ماهانه شما می‌شود!", + "account.pro.thisdevice": "(این دستگاه)", + "account.pro.logout": "خروج", + "account.pro.removedevice": "حذف", + "account.pro.devices": "دستگاه‌های Lantern Pro (تا 3 دستگاه)", + "account.pro.device.confirm.title": "لغو مجوز دستگاه", + "account.pro.device.confirm": "مطمئن هستید می‌خواهید «{{device}}» را از حساب Lantern Pro خود بردارید؟", + "account.pro.device.one.title": "فقط یک دستگاه", + "account.pro.device.one": "متاسفانه نمی توانید آخرین دستگاه مجاز خود را حذف کنید.", + "account.pro.linkingcode": "کد اتصال دستگاه‌", + "account.pro.renew": "حساب ویژه  خود را تجدید کنید", + "account.platinum.renew": "تمدید حساب Platinum", + "account.pro.renew_CN": "تمید مجدد", + "account.prolink.errorTitle": "خطا در پیونددِهی", + "account.prolink.errorText": "آیا مطمئن هستید که خود کد درست را از دستگاه دیگر کپی کرده‌اید؟", + "account.prolink.successTitle": "دستگاه متصل شده", + "account.prolink.successText": "شما با موفقیت دستگاه خود را به لنترن وصل کردید! لطفا چند لحظه صبر کنید تا دستگاه‌های دیگرتان به صورت خودکار به لنترن ویژه (پرو) ارتقاء یابند.", + "account.signin": "وارد شوید", + "account.signout": "خروج از سیستم", + "account.submit": "ثبت اطلاعات", + "account.username": "نام کاربر", + "account.switch.to.register": "رفتن به «ایجاد حساب»", + "account.switch.to.signin": "رفتن به «ورود به سیستم»", + "account.invalid.username": "نام کاربری نامعتبر است", + "account.invalid.email": "ایمیل نامعتبر است", + "account.password.mismatch": "گذرواژه واردشده برای تأیید با گذرواژه اول مطابقت ندارد", + "account.password.short": "گذرواژه خیلی کوتاه است", + "account.password.lowercase": "گذرواژه باید حداقل یک حرف کوچک داشته باشد", + "account.password.uppercase": "گذرواژه باید حداقل یک حرف بزرگ داشته باشد", + "account.password.number": "گذرواژه باید حداقل یک عدد داشته باشد", + "account.password.compromised": "گذرواژه در فهرستی از گذرواژه‌های لورفته نشان داده می‌شود", + "modal.register.free.header": "ثبت‌نام یا ورود به سیستم برای دسترسی به «کیف پول Yinbi»", + "modal.register.pro.header": "افزودن گذرواژه حساب برای دسترسی به «کیف پول Yinbi»", + "modal.register.pro.signin.header": "برای دسترسی به «کیف پول Yinbi»، به سیستم وارد شوید", + "modal.register.free.text": "برای استفاده از «کیف پول Yinbi»، باید حساب Lantern داشته باشید؛ لطفاً «ثبت‌نام کنید» یا\n«برای ادامه وارد سیستم شوید».", + "modal.register.pro.text": "برای استفاده از «کیف پول Yinbi»، باید گذرواژه‌ای را به حساب Lantern خود اضافه کنید.", + "modal.register.pro.signin.text": "برای استفاده از کیف پول Yinbi، باید به حساب Lantern خود وارد شوید", + "adyen.paymentMethods.title": "روشهای پرداخت", + "adyen.paymentMethods.storedMethods": "روشهای پرداخت شما", + "adyen.paymentMethods.otherMethods": "سایر روشها را انتخاب کنید", + "adyen.paymentMethods.moreMethodsButton": "سایر روشهای پرداخت", + "adyen.payButton": "پرداخت", + "adyen.payButton.formatted": "پرداخت %@", + "adyen.cancelButton": "انصراف", + "adyen.dismissButton": "بسیار خوب", + "adyen.storeDetails": "برای پرداخت بعدی من ذخیره کن", + "adyen.payment.redirecting": "شما منتقل خواهید شد", + "adyen.payment.processing": "پرداخت شما در حال انجام است", + "adyen.creditCard.title": "جزئیات کارت", + "adyen.creditCard.holderName": "نام دارنده کارت", + "adyen.creditCard.holderName.placeholder": "جی. اسمیت", + "adyen.creditCard.numberField.title": "شماره کارت", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "شماره کارت نادرست است", + "adyen.creditCard.expiryDateField.title": "تاریخ انقضا", + "adyen.creditCard.expiryDateField.placeholder": "سال/ماه", + "adyen.creditCard.expiryDateField.invalid": "تاریخ انقضا نادرست است", + "adyen.creditCard.expiryDateField.month": "ماه", + "adyen.creditCard.expiryDateField.month.placeholder": "ماه", + "adyen.creditCard.expiryDateField.year.placeholder": "سال", + "adyen.creditCard.expiryDateField.year": "سال", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "تعداد اقساط", + "adyen.creditCard.storeDetailsButton": "این کارت را برای پرداخت بعدی من بخاطر بسپار", + "adyen.creditCard.oneClickVerification.title": "کارت خود را وریفای کنید", + "adyen.creditCard.oneClickVerification.message": "لطفا کد CVC را برای %@ وارد کنید", + "adyen.creditCard.oneClickVerification.invalidInput.title": "کد CVC نادرست است", + "adyen.creditCard.oneClickVerification.invalidInput.message": "لطفا برای ادامه، کد CVC معتبر را وارد کنید", + "adyen.sepaDirectDebit.ibanField.title": "شماره حساب (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "شماره حساب نادرست است", + "adyen.sepaDirectDebit.nameField.title": "نام صاحب حساب", + "adyen.sepaDirectDebit.nameField.placeholder": "جی. اسمیت", + "adyen.sepaDirectDebit.consentButton": "من موافق کسر مبلغ زیر از حساب بانکی خود هستم.", + "adyen.sepa.ownerName": "نام صاحب حساب", + "adyen.sepa.ibanNumber": "شماره حساب (IBAN)", + "adyen.giropay.searchField.placeholder": "نام بانک / Bankleitzahl / BIC", + "adyen.giropay.minimumLength": "حداقل 3 کاراکتر", + "adyen.giropay.noResults": "جستجو نتیجه ای در بر نداشت", + "adyen.error.title": "خطا", + "adyen.error.subtitle.redirect": "انتقال ناموفق", + "adyen.error.subtitle.payment": "پرداخت ناموفق", + "adyen.error.subtitle.refused": "پرداخت پذیرفته نشد", + "adyen.error.message.unknown": "یک خطای نامعلوم رخ داد", + "adyen.error.message.cannotConnectToInternet": "اتصال به اینترنت انجام نشد: لطفا اتصال اینترنت خود را بررسی کنید.", + "adyen.error.message.cannotConnectToHost": "اتصال به سرور پرداخت ما انجام نشد.", + "adyen.error.retryButton": "دوباره امتحان کنید", + "adyen.idealIssuer.selectField.title": "بانک", + "adyen.idealIssuer.selectField.placeholder": "بانک خود را انتخاب کنید", + "adyen.creditCard.success": "پرداخت موفق", + "adyen.oneClick.confirmationAlert.title": "پرداخت %@ را تایید کنید", + "adyen.redirect.cannotOpenApp.title": "اپلیکیشن باز نمی شود", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "این اپلیکیشن نمی تواند باز شود، زیرا بر روی این دستگاه نصب نشده است.", + "adyen.holderName": "نام دارنده کارت", + "adyen.countryCode": "کد کشور", + "adyen.telephone.number": "شماره تلفن", + "android.download": "فانوس آندروید", + "android.download.title": "بارگیری Lantern Android", + "authorize.title": "تایید دستگاه برای نسخه حرفه ای", + "authorize.step1.have_pro_device": "من یک دستگاه لنترن حرفه ای دیگر دارم", + "authorize.step1.link": "پیوند به دستگاه", + "authorize.step1.email_linking": "پیوند به ایمیل", + "authorize.device_linking_explanation": "از این روش درصورتی استفاده کنید که وارد دستگاه دیگری شده‌اید و آن را با خود دارید", + "authorize.device_email_explanation": "از این روش در صورتی استفاده کنید که می‌خواهید پین پیوند دستگاه به ایمیلتان ارسال شود", + "authorize.link_device": "پیوند دادن دستگاه", + "authorize.step1.choose": "لطفاً روشی را برای پیوند حسابتان انتخاب کنید", + "authorize.step1.or": "یا", + "authorize.step1.recover": "لازم دارم که حساب لنترن حرفه ام را بازیابی کنم", + "authorize.step1.start": "شروع به بازیابی کن", + "authorize.step1.no_mail": "ایمیل خود را به یاد نمی آورید؟", + "authorize.step1.description": "ایمیل خود را وارد کنید و اگر حساب وجود دارد، یک ایمیل حاوی کد پیوند دستگاه را برایتان ارسال خواهیم کرد", + "authorize.step2b.enter_code": "کد بازیابی حساب خود را وارد کنید", + "authorize.step2b.code": "کد بازیابی حساب", + "authorize.step2b.instruction": "کد بازیابی در ایمیلی به نشانی ایمیل {{email}} ارسال شده است، البته اگر چنین ایمیلی وجود داشته باشد. ممکن است چند ساعت طول بکشد تا این ایمیل را دریافت کنید. اگر این ایمیل را پیدا نکردید، لطفاً پوشه هرزنامه‌تان را بررسی کنید.", + "authorize.step2b.no_mail": "ایمیلی دریافت نگردید", + "authorize.step3.recovery": "بازیابی حساب", + "authorize.step3.no_email": "آخ! برای پیدا کردن آن نشانی ایمیل به مشکل برخوردیم. لطفاً اطلاعاتی بیشتری در بخش زیر ارائه نموده تا در یافتن حساب شما به ما کمک کند", + "authorize.step3.no_code_received": "مشکلی در دریافت ایمیل بازیابی دارید؟ اطلاعات را در بخش زیر وارد نموده و ما ظرف 48 ساعت به شما تماس می گیریم.", + "authorize.step3.your_email": "ایمیل شما", + "authorize.step3.payment_method": "روش پرداخت", + "authorize.step3.payment_method_hint": "روش پرداختی که برای دریافت نسخه حرفه ای استفاده کردید را انتخاب کنید", + "authorize.step3.credit_card": "کارت اعتباری", + "authorize.step3.alipay": "علیپی", + "authorize.step3.android_pay": "پرداخت اندروید", + "authorize.step3.by_referral": "به واسطه ارجاع یک دوست، نسخه حرفه را گرفته", + "authorize.step3.payment_account": "حساب پرداخت", + "authorize.step3.payment_account_hint": "اطلاعات حساب علیپی خود را وارد کنید", + "authorize.step3.referral_code": "کد ارجاع شما", + "authorize.step3.purchase_date": "تاریخ خرید", + "authorize.step3.note": "لطفاً هر گونه اطلاعاتی که ممکن است در یافتن حساب شما به ما کمک کند را یادداشت کنید.", + "authorize.step4.title": "بازیابی حساب رو به پیشرفت است", + "authorize.step4.text1": "متشکریم! درخواست بازیابی حساب شما را دریافت کرده ایم.", + "authorize.step4.text2": "لطفاً برای بازیابی اطلاعات حساب حرفه ای خود تا 48 ساعت زمان بگذارید", + "authorize.step4.text3": "ما اطلاعات را به نشانی ایمیل وارد شده در صفحه قبلی ارسال خواهیم کرد.", + "authorized.continue": "به استفاده از لنترن ویژه ادامه دهید!", + "authorized.continue.lantern": "ادامه و رفتن به Lantern", + "authorized.text": "این دستگاه اکنون مجاز است که از حساب حرفه ای شما استفاده نماید!", + "authorized.title": "دستگاه مجاز", + "button.account": "حساب کاربری", + "button.renew": "تمدید مجدد", + "button.upgrade": "ارتقا‌‌ء", + "button.upgrade_now": "همین حالاارتقا بدهید", + "button.upgrade_to_lantern_pro": "رتقاء به نسخه Pro فانوس", + "button.copy_your_code": "کد خود را کپی کنید", + "button.try_again": "دوباره امتحان کنید", + "button.continue": "ادامه", + "button.continue_to": "ادامه و رفتن به {{planType}}", + "bullet.click_button": "بر روی دکمه زیر کلیک کنید", + "bullet.paste_code": "لینک دانلود و کد را در یک پیغام وارد کنید", + "bullet.send_to_friends": "به دوستان خود بفرستید", + "cancel": "انصراف", + "confirm": "تایید", + "norecoveryyinbi": "*«کیف پول Yinbi» را بازیابی نمی‌کند", + "email.recovery.check.email": "ایمیل خود را برای پیامی حاوی «کد بازیابی» بررسی کنید", + "email.recovery.code.label": "«کد بازیابی» را وارد یا جای‌گذاری کنید", + "email.recovery.no.code": "کدی دریافت نکردید؟", + "email.recovery.text": "ایمیل خود را وارد کنید و کدی برای بازنشانی گذروا‌ژه برایتان ارسال خواهیم کرد.\nاگر «کیف پول Yinbi» دارید، با این کار «کیف پول Yinbi» بازیابی نخواهد شد، برای بازیابی «کیف پول Yinbi»، «عبارت بازیابی Yinbi» را وارد کنید.", + "email.recovery.desc": "اگر می‌خواهید کد بازیابی به ایمیل شما ارسال شود، از این روش استفاده کنید", + "device.recovery.desc": "اگر در دستگاه دیگری به سیستم وارد شده‌اید و آن را در اختیار دارید، از این روش استفاده کنید", + "google_search": "جستجو در گوگل", + "giveaway.upgrade": "برای دریافت توزیع رایگان امروز، ارتقا دهید", + "giveaway.title_released_today": "‎{{formattedTokens}} YNB امروز منتشر می‌شود", + "giveaway.what_is_it": "«هدیه Yinbi» چیست؟", + "giveaway.description1": "بنیاد Yinbi به‌طور انحصاری 888 میلیارد رمز ارز YNB را از طریق Lantern به خریداران Lantern Pro اعطا می‌کند.", + "giveaway.description2": "YNB در پایان هر روز براساس تعداد کیف پول Yinbi عرضه‌شده در ان روز، تعداد افرادی که حسابشان را تمدید می‌کنند یا ارتقا می‌دهد و تعداد سال‌ها یا حساب‌هایی که خریداری می‌کنید، توزیع خواهد شد.", + "giveaway.learn_more": "بیشتر بدانید", + "link_device": "آیا در حال حاضر حساب کاربری Proدارید؟ لینک دستگاه", + "email.recovery": "بازیابی از طریق ایمیل", + "email_taken": "ایمیل از قبل ثبت شده است", + "username_taken": "نام کاربری از قبل ثبت شده است", + "err.unknown_error": "خطای ناشناخته", + "err.internal_error": "خطای داخلی", + "err.bad_input": "ورودی بد", + "err.not_authorized": "مجاز نیست", + "err.user_exists": "کاربر وجود دارد", + "err.no_such_user": "همچون کاربری موجود نیست", + "err.user_already_verified": "کاربر در حال حاضر تایید شده است", + "err.invalid_user_verification": "تایید کاربر نامعتبر", + "err.user_unverified": "کاربر تایید نشده", + "err.operation_temporarily_unavailable": "موقتا عملیات در دسترس نیست", + "err.wrong_or_inexistent_plan": "نقشه غلط و یا ناموجود", + "err.user_has_active_subscription": "کاربر دارای اشتراک فعال است", + "err.payment_error": "خطای پرداخت", + "err.no_codes_left": "کد ارجاعی باقی نمانده", + "err.wrong_code": "کد ارجاع اشتباه است", + "err.redeeming_own_code_not_allowed": "بازخرید کدها برای خود شخص مجاز نیست", + "err.wrong_charge_id": "شناسه شارژ اشتباه", + "err.wrong_link_code": "کد پیوند نادرست است", + "err.invalid_credentials": "اطلاعات کاربری ارائه‌شده نامعتبر بود", + "footer.reseller": "درآمد سازی کنید! جهت پیوستن به نمایندگان فروش لنترن، اینجا کلیک کنید.", + "footer.reseller.email_subject": "درباره برنامه فروش نمایندگی لنترن توضیح بیشتری بده!", + "footer.reseller.email_body": "وقتی شما عضو نمایندگان فروش لنترن شوید، می توانید با فروش هر لنترن پرو تا حداکثر 25% کمیسیون دریافت کنید. در پایین کمی درباره چرایی پیوستن به نمایندگان لنترن توضیح دهید.", + "feature.faster_speed": "سرعت بیشتر", + "feature.faster": "مراکز داده پرسرعت", + "feature.unlimited": "ترافیک نامحدود", + "feature.nologs": "بدون گزارش وقایع", + "feature.devices": "اتصال تا حداکثر 3 دستگاه", + "feature.noads": "بدون تبلیغ", + "feature.yinbi.tooltip": "بنیاد Yinbi ‏888 میلیارد ارز رمزنگاری‌شده YNB را منحصراً ازطریق Lantern به خریداران Lantern Pro اعطا می‌کند. YNB در پایان هر روز، بر اساس مقدار Yinbi منتشرشده در آن روز، تعداد افرادی که نسخه خود را به‌روزرسانی/تمدید می‌کنند، و تعداد سال‌ها یا حساب‌هایی که شما خریداری می‌کنید توزیع می‌شود. YNB مستقیماً در «کیف پول Yinbi» شما در Lantern واریز می‌شود.", + "feature.antiblock": "مقاومت در برابر فیلتر", + "feature.data_center": "مراکز داده بهتر", + "feature.free_yinbi": "رمزارز Yinbi رایگان!", + "free.title": "فانوس حرفه ای", + "free.desc": "سریعتر، قوی تر، نامحدود، ایمن.", + "free.link_account": "آیا در حال حاضر حساب کاربری ویژه (پرو) دارید؟ حساب کاربری خود را متصل کنید.", + "home.get_lantern_pro": "دریافت فانوس حرفه ای", + "home.get_lantern_platinum": "ارتقای طرح", + "home.welcome_popup_subheader": "به Lantern خوش آمدید!", + "home.welcome_popup_content_1": "سخت درتلاشیم تا Lantern را به‌روزرسانی کنیم و ویژگی‌های جدید اضافه کنیم.", + "home.welcome_popup_content_2": "در رابط کاربری جدید، نوار جستجویی وجود دارد که با کمک آن می‌توانید فایل‌های اشتراک‌گذاری‌شده در شبکه Lantern را پیدا کنید. همچنین می‌توانید با پست کردن فایل، به ایجاد محتوا کمک کنید. این یک ویژگی بتا است، پس آن را امتحان کنید و نظرتان را به ما بگویید، براساس نظرات شما به‌طور مستمر تلاش می‌کنیم خدماتتمان را بهبود ببخشیم.", + "home.welcome_popup_button": "اکنون امتحان کنید", + "input.email": "ایمیل", + "input.your_email": "آدرس ایمیل شما", + "input.confirm_email": "تکرار آدرس ایمیل", + "input.enter_email": "ایمیل خود را وارد کنید", + "input.use_valid_email": "یک ایمیل معتبر وارد کنید", + "input.email_not_match": "ایمیل وارد شده یکسان نمی باشد", + "input.existing_email": "ایمیل موجود", + "issue.your_email": "ایمیل شما", + "issue.attach_image_failure": "نمی‌توانید تصویر را پیوست کنید", + "issue.try_again": "لطفا دوباره تلاش کنید", + "issue.select_issue": "لطفاً یک مشکل را انتخاب کنید", + "issue.selected_issue": "مشکل‌تان را انتخاب کنید", + "issue.select_issue_hint": "یک مشکل را از فهرست کشویی انتخاب نمایید", + "issue.note": "مشکل‌ خود را شرح دهید", + "issue.description": "شرح مشکل", + "issue.error": "گزارش یک مشکل", + "issue.submit": "مشکل را گزارش دهید", + "issue.report_screenshot": "تصویر را به اینجا بکشید یا برای آپلود تصویر صفحه کلیک کنید", + "issue.reported": "سپاسگزاریم که مشکل‌تان را گزارش دادید. ما به محض اینکه بتوانیم با ایمیل به شما پاسخ خواهیم داد.", + "issue.report_sent": "گزارش فرستاده‌شد.", + "issue.type.no_access": "عدم امکان دسترسی به سایت های بسته شده", + "issue.type.payment_fail": "عدم امکان تکمیل نمودن پرداخت", + "issue.type.cannot_login": "عدم امکان ورود", + "issue.type.always_spinning": "نماد چرخنده بارگذاری به طور بی پایان می چرخد", + "issue.type.slow": "کند", + "issue.type.cannot_link_device": "عدم امکان ارتباط دستگاه ها", + "issue.type.crashes": "لنترن متوقف شد", + "issue.type.other": "غیره", + "languages.title": "زبان ها", + "lantern.email": "ایمیل Lantern", + "mobile.link": "از لینک زیر جهت دریافت لنترن در آندروید استفاده کنید:", + "mobile.title": "دریافت نسخه اندروید", + "nav.about": "‫‫درباره‬", + "nav.account": "مدیریت حساب", + "nav.authorize": "افزودن دستگاه جدید", + "nav.authorized": "دستگاه مجاز", + "nav.unauthorized_link": "تایید دستگاه برای استفاده از نسخه ویژه (پرو)", + "nav.language": "زبان", + "nav.lantern": "‫لنترن", + "nav.mobile": "دریافت نسخه موبایل", + "nav.report_issue": "گزارش یک مشکل", + "nav.settings": "تنظیمات", + "nav.support": "پشتیبانی", + "nav.verify": "تایید حساب", + "nav.yinbi": "بازخرید Yinbi", + "nav.home": "خانه", + "nav.discover": "یافتن", + "nav.wallet": "کیف پول", + "nav.yinbi_wallet": "کیف پول Yinbi", + "notification.retry": "دوباره امتحان کنید", + "notifications": "اعلان‌ها", + "notifications.whatisnew": "ویژگی‌های جدید", + "password.change": "تغییر گذرواژه", + "password.changed": "گذرواژه تغییر کرد", + "continue.to.pro": "به استفاده از لنترن ویژه ادامه دهید!", + "username": "نام کاربر", + "password.new": "گذرواژه جدید", + "password.requirements": "
گذرواژه باید حاوی این موارد باشد:
  • 8 نویسه یا بیشتر
  • 1 حرف کوچک
  • 1 حرف بزرگ
  • حداقل 1 عدد
  • در فهرست گذرواژه‌های لورفته نباشد
", + "password.reset": "بازنشانی گذرواژه", + "paxful.buy": "خرید", + "paxful.payment": "روش پرداخت", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "کیف‌های پول آنلاین", + "paxful.bank": "انتقال‌های بانکی", + "paxful.gamer_card": "کارت‌های بازی", + "paxful.gift_card": "کارت‌های هدیه", + "paxful.cash": "پرداخت نقدی", + "paxful.digital_currency": "ارزهای دیجیتالی", + "paxful.button": "نمایش بهترین حراج‌ها", + "payment.close": "بستن", + "payment.redirectErrorTitle": "خطا در اتصال به سرور پرداخت", + "payment.redirectErrorText": "در حال حاضر روی حل این مشکل کار می کنیم. لطفاً چند وقت دیگر دوباره بررسی کنید.", + "payment.wait_for_pro": "با تشکر از خرید شما از فانوس Pro ! لطفا کمی منتظر بمانید تا به طور خودکار به فانوس Pro ارتقا یابید", + "payment.moreOptions": "انتخاب‌های بیشتر", + "payment.fewerOptions": "انتخاب‌های کمتر", + "payment_methods.select_name": "روش پرداخت را انتخاب کنید", + "payment_methods.alipay": "کارت اعتباری / Alipay", + "payment_methods.shetab": "پرداخت جهانی سریع (شتاب)", + "payment_methods.shetab.details.header": "برای خرید فانوس pro", + "payment_methods.shetab.details.body": "هنگامی که دکمه تکمیل خرید را کلیک می کنید، برای تکمیل پرداخت و دریافت کد فعالسازی به یک سایت خارجی منتقل می شوید.", + "payment_methods.shetab.details.tutorial_header": "آموزش فارسی", + "payment_methods.shetab.details.purchase_voucher_button": "تکمیل خرید", + "payment_methods.shetab.details.input_code_button": "کد فعالسازی را وارد کنید", + "plan.step1": "مرحله 1", + "plan.apply": "اعمال", + "plan.step2": "مرحله 2", + "plan.most_popular": "محبوب‌ترین!", + "plan.step3": "مرحله 3", + "plan.choose_plan": "انتخاب طرح", + "plan.enter_email": "وارد کردن ایمیل", + "plan.choose_method": "روش پرداخت را انتخاب کنید", + "plan.bestValue": "بهترین معامله!", + "plan.per_month": "هر ماه", + "plan.yinbi_2x": "+ 2 برابر Yinbi!", + "plan.oneYear": "1 سال", + "plan.add_referral": "افزودن کد ارجاع شده", + "plan.years": "طرح داده {{years}} ساله", + "plan.desc": "هربار صورت‌حسابی به مبلغ {{price}} صادر می‌شود", + "plan.bonus_months": "+ {{bonusMonths}} ماه", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(یوان)", + "plan.currency.usd": "(دلار آمریکا)", + "plan.time_unit": "/سال", + "plan.select": "انتخاب", + "plan.two_year": "دو ساله", + "plan.one_year": "یک ساله", + "plan.savings": "تخفیف {{formattedDiscount}} %", + "plans.title": "طرح های حرفه ای لنترن", + "plans.lantern_pro": "فانوس حرفه ای", + "plans.platforms": "برای ویندوز، اندروید، مک، اوبونتو.", + "plans.from_reseller": "کد فعال‌سازی Lantern Pro دارید؟ اینجا کلیک کنید.", + "plans.with_voucher_code": "آیا کد فعالسازی دارید؟ اینجا کلیک کنید.", + "pro.apply": "اعتبار شما در دوره بعدی صورتحساب به حساب شما اعمال خواهد شد.", + "pro.title": "با دعوت از دوستان، به اعتبار نسخه ویژه (پرو) خود اضافه کنید.", + "pro.subtitle": "هنگامی که دوست‌تان یک بسته‌ی خدماتی دو ساله خریداری کند، شما سه ماه اضافی رایگان دریافت می‌کنید و بسته‌ی یک ساله به شما یک ماه رایگان خواهد داد.", + "pro.share": "کد خود را با دوستان‌تان به اشتراک بگذارید تا ماه‌های رایگان بیشتری به دست آورید.", + "promotion.title": "پرداخت لنترن پرو", + "promotion.title.activation": "فعال سازی لنترن پرو", + "promotion.enter_and_confirm_email": "لطفا وارد کنید و آدرس ایمیل خود را تأیید کنید.", + "promotion.code.hint": "کد ارجاعی دوست‌تان را وارد کنید.(دلخواه)", + "promotion.code.label": "کد ارجاع شده", + "promotion.payment": "ادامه برای پرداخت", + "promotion.payment.btc": "با ₿ پرداخت کنید", + "promotion.loading": "در حال بارگذاری ...", + "promotion.howto_1y": "اگر یک دوست کد ارجاع شان را با شما به اشتراک گذاشته، کد را وارد نمایید تا بعد از صندوق پرداخت یک ماه لنترن حرفه ای دریافت نمایید.", + "promotion.howto_2y": "اگر دوستی کد ارجاعی به شما داده است، این کد را در اینجا وارد کنید، تا پس از پرداخت صورت‌حساب سه ماه استفاده‌ی رایگان از لنترن پرو بهره ببرید.", + "promotion.pay": "پرداخت {{amount}}", + "promotion.select": "انتخاب", + "promotion.promotion_applied_1y": "+1 ماه پاداش", + "promotion.promotion_applied_2y": "+3 ماه پاداش", + "promotion.too_many_referrals": "این کد ارجاعی پیش از این اضافه شده بود. سری به ماه‌های اضافی‌تان بزنید تا از آنها استفاده کنید.", + "promotion.activation.enter_and_confirm_email": "لطفا وارد کنید و آدرس ایمیل خود را برای ثبت لنترن پرو تأیید کنید.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "کد فعالسازی", + "promotion.activation.instructions": "ایمیل خود و کد فعال‌سازی 25 رقمی دریافت‌شده از توزیع‌کننده را وارد کنید تا حسابتان ثبت شود.", + "promotion.activation.howto": "لطفا کد فعال سازی 25 رقمی فانوس Pro خود را در بالا وارد کنید. اگر کد ندارید، لطفا Pro را از صفحه قبلی خریداری کنید یا به نمایندگی فروش Pro در اینترنت جستجو کنید.", + "promotion.activation.continue": "ثبت‌نام برای Pro", + "promotion.voucher.hint": "کد فعالسازی", + "promotion.voucher.howto": "لطفا کد فعالسازی 12 رقمی Fast World Pay را در بالا وارد کنید", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "خطا هنگام پس‌خرید کردن کد فعال‌سازی.", + "promotion.voucher.error.invalid_code": "کد فعالسازی نامعتبر است", + "promotion.voucher.error.invalid_plan": "کد فعالسازی مربوط به یک برنامه نامعتبر است.", + "promotion.voucher.error.already_redeemed": "کد فعالسازی قبلا وارد شده است.", + "referral.code": "کد ارجاع", + "referral.text": "از کد my code %s استفاده کنید واز وقتی ثبت نام می کنید 3 ماه رایگان داشته باشید!", + "referral.description_free": "کدتان را با دوستانتان به اشتراک بگذارید، اگر هریک از آن‌ها اشتراک Pro را خریداری کنند، از ۱ ماه سرویس رایگان Lantern Pro برخوردار می‌شوید!", + "referral.description_pro": "کدتان را با دوستانتان به اشتراک بگذارید، اگر هریک از آن‌ها اشتراک Pro را خریداری کنند، از ۱ ماه سرویس رایگان Lantern Pro دیگر برخوردار می‌شوید!", + "register": "ثبت نام", + "renew.subtitle_early": "تمدید کنید و ۳ ماه رایگان استفاده کنید!", + "renew.subtitle_last_day": "تمدید کنید و ۳ ماه رایگان استفاده کنید!", + "renew.subtitle_expired": "تمدید کنید و ۴۵ روز اشتراک رایگان دریافت کنید!", + "renew.details_early": "عضویت Lantern Pro شما به‌زودی پایان می‌یابد. اکنون آن را تمدید کنید و از اشتراک حداکثر سه ماه رایگان بهره‌مند شوید!", + "renew.details_last_day": "عضویت Lantern Pro شما امروز به پایان می‌رسد! اکنون حسابتان را بررسی کنید و تا سه ماه رایگان از آن لذت ببرید!", + "renew.details_expired": "عضویت Lantern Pro شما منقضی شده است. اکنون آن را تمدید کنید و تا چهل و پنج روز دیگر از آن به‌صورت رایگان استفاده کنید!", + "renew.asterisk_early": "* این پیشنهاد دارای محدودیت زمانی فقط برای افرادی دردسترس است که زودتر اشتراکشان را تمدید کنند.", + "renew.asterisk_last_day": "* این آخرین فرصت شما برای دریافت این پیشنهاد ویژه است!", + "renew.asterisk_expired": "* این یک پیشنهاد دارای محدودیت زمانی است!", + "renew.plan_label": "فانوس Pro %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 ماه رایگان ", + "renew.plan_renewal_bonus_months": "$%d%s + %d چند ماه رایگان", + "renew.plan_renewal_bonus_days": "$%d%s + %d چند روز رایگان", + "renew.next": "بعدی", + "renew.decline": "پیشنهاد را رد کنید", + "renew.decline_question": "آیا مطمئن هستید که میخواهید این پیشنهاد را رد کنید؟", + "renew.decline_yes": "بعدا تجدید کنید.", + "renew.decline_dismiss": "اکنون تجدیدکنید", + "renew.notification_title_30_days": "برای صرفه جویی بیشترPro را حالا تمدید کنید", + "renew.notification_title_30_days_platinum": "برای تخفیف بیشتر، Platinum را حالا تمدید کنید!", + "renew.notification_text_30_days": "حساب {{planName}} شما {{remainingDays}} دیگر منقضی می‌شود. اکنون آن را تمدید کنید و تا 3 ماه رایگان از آن استفاده کنید.", + "renew.notification_title_2_days": "تخفیف {{planName}} فردا به پایان می‌رسد!", + "renew.notification_text_2_days": "حساب {{planName}} شما فردا منقضی می‌شود. این فرصت تخفیف بزرگ را ازدست ندهید.", + "renew.notification_title_last_day": "آخرین شانس برای تخفیف!", + "renew.notification_text_last_day": "حساب {{planName}} شما منقضی شده است. امروز تمدید کنید و تا 3 ماه رایگان استفاده کنید.", + "replica.upload": "آپلود", + "replica.favorite": "پسندیدن", + "replica.added_to_favorites": "به «موارد دلخواه» اضافه شد", + "replica.filedrop_error": "خطا هنگام بارگذاری این فایل", + "replica.filedrop_error.file-too-large": "حداکثر حجم فایل مجاز {{fileSize}} است", + "replica.filedrop_error.file-too-small": "فایل خیلی کوچک است", + "replica.filedrop_error.too-many-files": "تعداد فایل‌ها خیلی زیاد است", + "replica.filedrop_error.file-invalid-type": "این نوع فایل درحال‌حاضر پشتیبانی نمی‌شود", + "replica.filedrop_remove_file": "برداشتن از صف", + "replica.post": "بارگذاری فایل", + "replica.relevance": "رابطه", + "replica.upload_date": "تاریخ آپلود", + "replica.gallery_view": "نمای گالری", + "replica.list_view": "نمای لیستی", + "replica.copy_lantern_link": "کپی لینک Lantern", + "replica.documents": "اسناد", + "replica.audio": "صدا", + "replica.application": "برنامه‌ها", + "replica.image": "تصاویر", + "replica.video": "ویدیوها", + "replica.web": "وب", + "replica.news": "اخبار", + "replica.upload_alert.dont_show": "دیگر این را نشان نده", + "replica.upload_alert.cancel": "لغو آپلود", + "replica.upload_alert.resume": "ازسرگیری آپلود", + "replica.upload_alert.info": "اطلاعات مهم!", + "replica.upload_alert.desc1": "فایل‌های آپلود شده به Lantern پراکنده و غیرمتمرکز هستند. هنگامی که کاربر دیگری به آن‌ها دسترسی می‌یابد، توسط هیچ کسی از جمله Lantern از روی شبکه قابل حذف نیستند، حتی اگر از لیست «My Files» (فایل‌های من) حذف گردند.", + "replica.upload_alert.desc2": "لطفاً هنگام آپلود محتوای حساس، از اطلاعات هویتی شخصی در فایل یا نام فایل استفاده نکنید.", + "replica.add_details": "افزودن جزئیات", + "replica.cannot_edit": "نام فایل‌ها، پس از انتشار قابل ویرایش نیست. ", + "replica.next": "بعدی", + "replica.previous": "قبلی", + "replica.selectAll": "انتخاب همه", + "replica.search_replica": "جستجو", + "replica.search_results_info": "این برگه فقط نتایج Lantern را نشان می‌دهد.", + "replica.search_results_info_message": "نتایج Lantern، محتواهایی هستند که کاربران در شبکه Lantern بارگذاری کردند.", + "replica.no_files_found": "نتیجه‌ای وجود ندارد", + "replica.or_content": "محتوای شما برای بقیه افراد تا آن را پیدا کنند!", + "replica.try_again": "کلیدواژه دیگری امتحان کنید، یا", + "replica.upload_success": "با موفقیت آپلود شد!", + "replica.cannot_preview": "بدون پیش‌نمایش برای نوع فایل", + "replica.no_description": "توضیحی داده نشده است. ", + "replica.size": "ابعاد", + "replica.uploaded": "آپلود شد", + "replica.invalid_link": "لینک نامعتبر", + "replica.close": "بستن", + "replica.files": "فایل‌ها", + "replica.upload_history": "تاریخ آپلود", + "replica.my_favorites": "پسندیده ها", + "replica.no_uploads": "هنوز موردی بارگذاری نشده است", + "replica.no_favorites": "هنوز موردی به «موارد دلخواه» اضافه نشده است", + "replica.mime_type": "نوع فایل: {{mime}}", + "replica.image_loading_error": "خطای بار کردن تصویر", + "replica.play": "پخش", + "replica.pause": "توقف موقت", + "replica.scrub": "تمیز کردن", + "replica.skip_forward": "رد شدن به جلو", + "replica.skip_backwards": "رد شدن به عقب", + "replica.trending_videos": "ویدیوهای پرطرفدار", + "replica.file_uploaded": "آپلودشده: {{days}} روز قبل", + "replica.file_size": "ابعاد", + "replica.duration": "مدت زمان", + "replica.filename": "نام فایل", + "replica.filename_required": "نامی برای فایل انتخاب کنید", + "replica.description_optional": "افزودن توضیحات ", + "replica.expand": "باز شدن توضیحات ", + "replica.filetype": "نوع فایل", + "replica.sortby": "مرتب‌سازی بر اساس", + "replica.link": "لینک المثنی", + "replica.collapse": "جمع شدن", + "replica.publish": "انتشار", + "replica.cancel": "انصراف", + "replica.progress_current_upload": "بارگذاری از", + "replica.progress_files": "فایل‌ها", + "replica.progress_of": "از", + "replica.progress_upload_complete": "تکمیل", + "replica.progress_upload_failure": "بارگذاری انجام نشد، لطفاً دوباره امتحان کنید.", + "replica.upload_in_progress": "بارگذاری درحال انجام", + "replica.upload_pending": "بارگذاری درحالت تعلیق", + "replica.upload_error": "خطای بارگذاری", + "replica.upload_cancel": "لغو بارگذاری", + "replica.upload_confirm": "مطمئنید می‌خواهید بارگذاری را لغو کنید؟", + "replica.progress_view": "مشاهده", + "replica.delete": "حذف", + "replica.remove": "حذف", + "replica.delete_file": "حذف فایل", + "replica.remove_favorite": "برداشتن از «موارد دلخواه»", + "replica.failed_to_delete": "حذف نشد", + "replica.failed_to_remove": "برداشته نشد", + "replica.link_lookup_failure": "لینک یافت نشد", + "replica.delete_file_confirmation_1": "مطمئنید که می‌خواهید از آپلودهای", + "replica.delete_file_confirmation_2": "خود حذف کنید", + "replica.remove_favorite_confirmation_1": "مطمئنید که می‌خواهید برداشته شود؟", + "replica.remove_favorite_confirmation_2": "از موارد دلخواه", + "replica.share_file": "اشتراک‌گذاری فایل", + "replica.download_and_view": "دانلود/مشاهده", + "replica.download": "دانلود", + "replica.copy_link": "کپی لینک المثنی", + "replica.find_file": "یافتن فایل", + "replica.file_drop_prompt": "برای شروع بارگذاری، فایل را بکشید!", + "replica.empty_uploads_text1": "برای ایجاد اولین پستتان،", + "replica.empty_uploads_text2": "اینجا", + "replica.empty_uploads_text3": "کلیک کنید.", + "replica.error_header": "وای", + "replica.error": "هنگام پردازش درخواستتان، خطایی رخ داد. لطفاً دوباره امتحان کنید.", + "replica.serp_empty": "این جستجو در Google هیچ نتیجه‌ای دربرنداشت.", + "replica.disclaimer": "Lantern جستجوهای شما را ناشناس کرد و از آنها در برابر اشخاص ثالث محافظت می کند", + "settings.general": "عمومی", + "settings.feedback": "بازخورد", + "settings.autoLaunch": "لنترن را به صورت خودکار در زمان شروع به کار سیستم اجرا کن", + "settings.autoReport": "آمار استفاده از لنترن را به شکلی مطمئن و امن گزارش کنید تا به لنترن کمک کنم.", + "settings.lantern_ads": "نمایش تبلیغات Lantern", + "settings.lantern_ads_tooltip": "Lantern برای کمک به پشتیبانی از خدمات ما، در برخی وب‌سایت‌ها به شما تبلیغات نشان می‌دهد. هیچ اطلاعات کاربری جمع‌آوری نمی‌شود و به سرورهای ما ارسال نمی‌شود. اگر این گزینه را خاموش کنید، ممکن است همچنان تبلیغات را ببینید اما دیگر تبلیغی از شبکه Lantern به شما نشان داده نخواهد شد.", + "settings.proxyAll": "پروکسی تمام ترافیک", + "settings.proxyAllHelpTitle": "\"تمام ترافیک پروکسی\" چه کاری انجام می دهد؟", + "settings.proxyAllHelp1": "در صورت فعال بودن، تمام ترافیک از طریق فانوس ارسال خواهد شد (گزینه امن ترین).", + "settings.proxyAllHelp2": "اگر غیرفعال باشد، فقط ترافیک مسدود شده از طریق فان,s ارسال خواهد شد (سریعترین گزینه، رایج ترین).", + "settings.show_advanced": "نمایش تنظیمات پیشرفته", + "settings.hide_advanced": "مخفی کردن تنظیمات پیشرفته", + "settings.systemProxy": "مدیریت پراکسی سیستم", + "settings.title": "تنظیمات", + "settings.http_proxy": "پروکسی اچ تی تی پی (اس):", + "settings.socks_proxy": "پروکسی ساکس:", + "settings.caution": "احتیاط:", + "settings.caution_text": "وقتی تیک «مدیریت پروکسی سیستم» را بر می دارید، مرورگر و برنامه های شما قادر نخواهند بود که به طور خودکار از لنترن استفاده نمایند. اگر شما می دانید که چگونه به صورت دستی این تنظیمات را اعمال نمایید به اطلاعات بالا مراجعه نمایید.", + "settings.select_language": "انتخاب زبان", + "settings.diagnostics": "پیوست کردن اطلاعات عیب‌یابی", + "settings.diagnostics_tooltip": "وقتی اطلاعات عیب‌یابی را پیوست می‌کنید، داده‌های ثبت‌شده مربوط به اتصال شما به تیم Lantern ارسال خواهد شد. این کار باعث افزایش توانایی ما در تشخیص و حل مشکلات می‌شود.", + "status.lantern": "Lantern", + "status.click_reconnect": "برای اتصال مجدد، اینجا کلیک کنید", + "status.server_location": "موقعیت سرور", + "status.tooltip1": "فانوس از انتخاب سرور هوشمند برای اتصال شما به بهترین مراکز داده استفاده می کند.", + "status.tooltip2": "برای سرعت بالاتر با انتخاب سرور بهینه از مراکز داده منحصربه‌فرد Lantern Pro، به نسخه Lantern Pro ارتقا دهید", + "status.protected_connection": "اتصال شما محافظت می‌شود", + "status.please_wait": "این کار یک دقیقه یا بیشتر طول می‌کشد...", + "status.connecting": "درحال اتصال...", + "status.no_internet": "خاموش", + "status.no_internet_connection": "ارتباط اینترنی وجود ندارد", + "status.connected": "روشن", + "status.disconnected": "خاموش", + "status.throttled": "سرعت کاهش یافته (محدودیت ظرفیت اطلاعات)", + "status.no_system_proxy": "{{status}}، پراکسی سیستم مدیریت نمی‌شود", + "status.fail_to_set_system_proxy": "ناتوانی در تنظیم فانوس به عنوان پراکسی سیستم", + "status.fail_to_open_browser": "ناتوانی در باز کردن پنجره مرورگر برای نشان دادن رابط کاربر فانوس", + "support.forum": "تالار گفتمان کاربران لنترن", + "support.faq": "‫سوالات متداول", + "terms_of_service.acknowledgment": "با کلیک بر روی {{buttonText}}، شما شرایط استفاهد از خدمات ما را می‌پذیرید", + "terms_of_service.replica": "با جستجو، آپلود یا استفاده از محصولات ما به هر روشی، موافقت خود را با شرایط خدمات، خط مشی حریم خصوصی، و خط مشی DMCA ما اعلام می‌کنید", + "top_sites.google": "Google", + "top_sites.twitter": "توییتر", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "فیسبوک", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "پین پیوند دستگاه را وارد یا پیست کنید", + "verify.code": "کد اتصال دستگاه‌", + "verify.howto_1": "اگر شما یک حساب کاربری ویژه (پرو) در دستگاه دیگری دارید، لطفاً ایمیل خود را وارد کنید تا یک کد دریافت کنید که به دستگاه شما اجازه می‌دهد تا به سیستم وصل شود.", + "verify.howto_1a": "شما مجوز استفاده از یک حساب کاربری ویژه (پرو) ندارید، لطفاً ایمیل خود را وارد کنید تا مجوز لازم را به دست آورید تا بتوانید به چند دستگاه مختلف وصل شوید.", + "verify.howto_2": "برای پیوند دادن دستگاهی با حساب Pro:", + "verify.howto_3": "1. «مجاز کردن دستگاه برای Pro» را از منوی دستگاه دیگر انتخاب کنید.", + "verify.howto_4": "2. پین پیوند به‌دست آمده از مرحله 1 را وارد کنید و ارسال کنید.", + "verify.reminder": "*مطمئن شوید هر دو دستگاه از جدیدترین نسخه Lantern استفاده می‌کنند", + "verify.enter_pin": "پین پیوند دستگاه را وارد یا پیست کنید", + "verify.submit": "ثبت اطلاعات", + "verify.title": "تایید حساب", + "welcomeToPro.continue": "به استفاده از لنترن ویژه ادامه دهید!", + "welcomeToPro.invite": "دوستان‌تان را دعوت کنید و هنگامی که یک بسته‌ی دو ساله خریداری می‌شود، سه ماه رایگان اضافی دریافت کنید. بسته‌ی یک ساله یک ماه رایگاه همراه خواهد داشت. پس شروع به دعوت از دیگران کنید!", + "welcomeToPro.thanks": "حالا شما به سریعترین دیتاسنترهای ما دسترسی دارید. تا سه دستگاه را میتوانید به این اکانت وصل کنید.", + "welcomeToPro.title": "به لنترن ویژه (پرو)‌ خوش آمدید!", + "welomeToPro.title_exclamation": "به فانوس Pro خوش آمدید!", + "purchase.failed": "خرید انجام نشد، لطفاً بعداً دوباره امتحان کنید.", + "purchase.success": "خرید موفق", + "purchase.success_title": "به Lantern {{planType}} خوش آمدید!", + "purchase.success_content_pro": "حالا شما به سریع‌ترین مراکز داده ما دسترسی نامحدود دارید. تا سه دستگاه را می‌توانید به حسابتان وصل کنید.", + "purchase.success_content_platinum": "حالا شما به سریع‌ترین مراکز داده و خطوط اختصاصی ما دسترسی نامحدود دارید. تا سه دستگاه را می‌توانید به حسابتان وصل کنید.", + "welcomeToPro.description": "اکنون دسترسی بدون محدودیتی به سایت‌ها و سرویس‌‌های مسدودشده دارید", + "messages.copied_to_clipboard": "کد ارجاعی کپی شد. آن را با دوستان‌تان به اشتراک بگذارید.", + "messages.datacap": "شما حجم اینترنت پر سرعت خود را مصرف کرده‌اید. برای مصرف نامحدود اینترنت پرسرعت به لنترن ویژه (پرو) بپیوندید.", + "messages.fatal_error": "متأسفیم!‌ در حال حاضر وصل شدن به خدمات لنترن ممکن نیست. لطفاً ارتباط اینترنتی خود را بررسی کنید و دوباره تلاش کنید.", + "messages.backend_gone": "متأسفیم!‌ لنترن در حال حاضر کار نمی‌کند. لطفاً آن را خاموش و مجدداً روشن کنید و دوباره تلاش کنید.", + "messages.get_help": "کمک بگیر", + "freeProCredits.title": "دعوت از دوستان", + "freeProCredits.shareWithFriends": "کد خود را با دوستان‌تان به اشتراک بگذارید تا ماه‌های رایگان بیشتری به دست آورید.", + "freeProCredits.shareWithFriendsDesc": "هنگامی که دوست‌تان یک بسته‌ی خدماتی دو ساله خریداری کند، شما سه ماه اضافی رایگان دریافت می‌کنید و بسته‌ی یک ساله به شما یک ماه رایگان خواهد داد.", + "cards.serverLocation.unknown": "ناشناخته", + "cards.serverLocation.description": "بهینه سازی موقعیت سرور", + "cards.serverLocation.description-free": "موقعیت سرور", + "cards.serverLocation.description-upgrade": "ارتقا برای سرورهای سریعتر", + "cards.serverLocation.title": "موقعیت فعلی:", + "cards.serverLocation.location": "%s%s", + "cards.serverLocation.text": "فانوس از انتخاب سرور هوشمند استفاده می کند تا به طور خودکار سریع ترین ارتباط را از مراکز داده ما در توکیو، سنگاپور، هنگ کنگ، سان فرانسیسکو، نیویورک، آمستردام، بنگلور و غیره پیدا کند.", + "cards.serverLocation.text-free": "فانوس از انتخاب سرور هوشمند برای اتصال شما به بهترین مراکز داده استفاده می کند.", + "cards.serverLocation.upgrade-link": "برای سرعت سریعترو انتخاب سرور بهینه از مرکز دیتای منحصر به فرد فانوس به نسخه فانوس Pro ارتقا یابید.", + "cards.httpsUpgrades.description": "ارتقاء های HTTPS", + "cards.httpsUpgrades.title": "HTTPS به روز رسانی: %d", + "cards.httpsUpgrades.text": "فانوس به طور خودکار ارتباطات HTTP غیر امن را به اتصالات HTTPS رمزگذاری شده ارتقا می دهد تا بتواند اطلاعات خود را در حین گشت و گذار در وب حفظ کند.", + "cards.adsBlocked.description": "تبلیغات مسدود شده", + "cards.adsBlocked.title": "تبلیغات مسدود شده %d", + "cards.adsBlocked.text": "فانوس تبلیغات مزاحم را برای سرعت بخشیدن به زمان بارگذاری صفحه وب، صرفه جویی در پهنای باند، و برای داشتن تجربه مرور راحت تر متوقف می کند.", + "cards.dataUsage.description": "داده های استفاده شده", + "cards.dataUsage.upgrade": "همین حالاارتقا بدهید", + "cards.dataUsage.mb-used": "شما از%d%d مگابایت دیتای ماهانه با سرعت خود استفاده کرده اید.", + "cards.dataUsage.upgrade-link": "برای خدمات با سرعت بالا ی نامحدود همین حالا آپدیت شوید", + "cards.subscription.description": "اشتراک پرو", + "cards.subscription.renew": "تمدید مجدد", + "cards.subscription.months": "شما %dچندماه از فانوس Pro در حسابتان باقی مانده است.", + "cards.subscription.days": "شما%d چندروز از فانوس Pro در حسابتان باقی مانده است.", + "cards.subscription.unit.months": "Mo", + "cards.subscription.unit.days": "روز", + "cards.subscription.renew-link": "تمدید اشتراک جهت اضافه کردن زمان بیشتر به حساب", + "auth.email": "ایمیل", + "auth.username": "نام کاربر", + "auth.username.or.email": "نام کاربری یا ایمیل", + "auth.signin": "وارد شوید", + "current.password": "گذرواژه فعلی", + "new.password": "گذرواژه جدید", + "auth.change.password": "تغییر گذرواژه", + "confirm.new.password": "تأیید گذرواژه جدید", + "auth.password": "رمز ورود", + "auth.have.recovery.phrase": "«عبارت بازیابی» دارید؟", + "auth.forgot.password": "گذرواژه را فراموش کرده‌اید یا گذرواژه ندارید؟", + "auth.create.account": "ایجاد حساب", + "auth.missing.username": "نام کاربری وجود ندارد", + "auth.missing.current.password": "گذرواژه فعلی وجود ندارد", + "auth.missing.new.password": "گذرواژه جدید وجود ندارد", + "auth.missing.confirm.password": "تأیید گذرواژه وجود ندارد", + "invalid_credentials": "اطلاعات کاربری نامعتبر است", + "yinbi.wallet": "کیف پول Yinbi", + "create.wallet": "ایجاد کیف پول", + "new.to.yinbi": "به‌تازگی استفاده از Yinbi را شروع کرده‌اید؟", + "setup.wallet": "بله، بیایید کیف پول جدیدی راه‌اندازی کنیم!", + "web.wallet": "نه، کیف پولی در وب‌سایت Yin.bi دارم", + "yinbi.next": "بعدی", + "yinbi.amount": "مقدار", + "yinbi.missing.address": "نشانی مقصدی ارائه نشده است", + "yinbi.missing.amount": "مقداری مشخص نشده است", + "yinbi.missing.email": "نشانی ایمیلی مشخص نشده است", + "yinbi.missing.username": "نام کاربری مشخص نشده است", + "yinbi.missing.password": "گذرواژه‌ای مشخص نشده است", + "yinbi.invalid.address": "{{destination}} نشانی Stellar معتبری نیست", + "yinbi.send": "ارسال", + "yinbi.to": "به:", + "yinbi.try_again": "دوباره امتحان می‌کنید", + "yinbi.success.transaction": "تراکنش انجام شد!", + "yinbi.failure.transaction": "تراکنش انجام نشد", + "yinbi.confirm.transaction": "تأیید تراکنش", + "yinbi.sent.details": "{{amount}} ‏YNB به {{destination}} ارسال کردید", + "yinbi.sent.failure.details": "تراکنش شما به دلایل زیر انجام نشد:", + "yinbi.recipient": "گیرنده", + "yinbi.available.send": "{{balance}}‏ YNB در دسترس برای ارسال دارید", + "yinbi.wallet.header": "کیف پول", + "yinbi.send.header": "ارسال Yinbi", + "yinbi.recovery.phrase": "عبارت بازیابی Yinbi", + "yinbi.recover.account": "برای بازیابی «کیف پول Yinbi» و حساب Lantern، «عبارت بازیابی Yinbi» را وارد یا جای‌گذاری کنید", + "yinbi.recovery.desc": "اگر می‌خواهید علاوه بر حساب Lantern به سیستم «کیف پول Yinbi» نیز وارد شوید، از این روش استفاده کنید", + "yinbi.redeem.codes": "نقد کردن مجموعه کدهای Yinbi", + "yinbi.obtain.codes": "مجموعه کدهای بازخرید Yinbi را می‌توان از reseller.lantern.io به‌دست آورد", + "yinbi.receive.header": "دریافت Yinbi", + "yinbi.this.is.your.wallet": "این نشانی کیف پول Yinbi شما است که افراد می‌تواند به آن YNB ارسال کنند.", + "yinbi.your.address": "نشانی شما", + "yinbi.no.activity.header": "فعالیتی وجود ندارد", + "yinbi.upgrade.pro.button": "به Pro ارتقا دهید و Yinbi رایگان دریافت کنید", + "yinbi.renew.pro.button": "Pro را تمدید کنید و Yinbi رایگان دریافت کنید", + "yinbi.wallet.activity_header": "فعالیت", + "yinbi.wallet.send": "ارسال", + "yinbi.wallet.receive": "دریافت", + "yinbi.wallet.balance": "تراز", + "yinbi.wallet.getlantern.pro": "دریافت Lantern Pro + ‏Yinbi رایگان", + "yinbi.redemption.codes": "کدهای بازخرید Yinbi", + "redeem_codes.title": "مطالبه کدهای Yinbi", + "redeem_codes.redeem_button_text": "مطالبه", + "redeem_codes.cancel_button_text": "انصراف", + "redeem_codes.success": "با موفقیت انجام شد", + "redeem_codes.errors.missing_codes": "کد معتبری وارد نشده است", + "redeem_codes.errors.invalid_codes": "خطا، لطفاً کدهای برجسته‌شده را بررسی کنید. کدهای خط خورده منقضی شده‌اند و دیگر نمی‌توان آن‌ها را نقد کرد.", + "yinbi.new.account.text": "به‌محض اینکه Yinbi ارسال یا دریافت کنید، تراکنش‌های شما در اینجا نشان داده خواهند شد.", + "yinbi.createAccount": "ایجاد حساب", + "yinbi.confirm.account.text": "برای اینکه مطمئن شوید عبارت را درست نوشته‌اید، لطفاً کلمات زیر را از عبارت بازیابی وارد کنید", + "create_account.invalid_words.error": "کلمات واردشده با کلمات عبارت عبور بازیابی مطابقت نداشتند", + "yinbi.recovery_text": "عبارت بازیابی «کیف پول Yinbi» شما این است. در صورت فراموش کردن گذرواژه، تنها راه\nبازیابی «کیف پول Yinbi» این است. هنگام ذخیره کردن این عبارت، از مدیر گذرواژه استفاده کنید یا نسخه‌ای فیزیکی ایجاد کنید.", + "yinbi.recovery_confirm_text": "عبارت بازیابی «کیف پول Yinbi» شما این است. در صورت فراموش کردن گذرواژه، تنها راه بازیابی «کیف پول Yinbi» این است. هنگام ذخیره کردن این عبارت، از مدیر گذرواژه استفاده کنید یا نسخه‌ای فیزیکی ایجاد کنید.", + "yinbi.import.wallet": "وارد کردن کیف پول", + "yinbi.setup.wallet": "راه‌اندازی کیف‌پول", + "yinbi.importWallet": "وارد کردن کیف پول Yin.bi", + "yinbi.import.wallet.continue": "ادامه دادن و رفتن به «کیف پول شما»", + "yinbi.import.wallet.success": "کیف پول باموفقیت وارد شد!", + "yinbi.wallet.text": "برای دسترسی به «کیف پول Yinbi»، می‌توانید حسابی ایجاد کنید و به سیستم وارد شوید یا\nاگر قبلاً در وب‌سایت Yin.bi ثبت‌نام کرده‌اید، کیف پول را از Yin.bi وارد کنید.", + "yinbi.wallet.pro.text": "برای دسترسی به «کیف پول Yinbi»، می‌توانید حسابی ایحاد کنید یا اگر قبلاً ثبت‌نام کرده‌اید، کیف پول را از Yin.bi وارد کنید.", + "yinbi.recovery_subheader": "عبارت بازیابی «کیف پول Yinbi»", + "yinbi.import_wallet.subheader": "وارد کردن «کیف پول Yinbi»", + "yinbi.import_wallet.text": "برای انتقال کیف پول خود به Lantern، بااستفاده از اطلاعات کاربری Yin.bi به سیستم وارد شوید", + "yinbi.import_wallet.success": "کیف پول شما با موفقیت وارد شد، برای تکمیل ثبت‌نام، ایمیل خود را اضافه کنید.", + "yinbi.import_wallet.success_subheader": "وارد کردن با موفقیت انجام شد!", + "yinbi.import_wallet.button": "وارد کردن کیف پول Yin.bi", + "yinbi.import_wallet.success_button": "تکمیل ثبت‌نام", + "yinbi.recovery_passphrase.label_text": "عبارت بازیابی", + "yinbi.recovery_passphrase.copy_button_text": "کپی کردن", + "terms_of_service.notice": "اخطار", + "terms_of_service.i_agree": "موافقم", + "platinum": "Platinum", + "platinum.one_year": "قیمت یک ساله", + "platinum.two_years": "هزینه دو ساله", + "platinum.save": "تا {{savings}}% تخفیف!", + "platinum.unlimited": "ترافیک نامحدود", + "platinum.logs": "هیچ گزارشی وجود ندارد", + "platinum.devices": "اتصال تا حداکثر 3 دستگاه", + "platinum.everything_in_pro": "همه چیز در نسخه Pro گنجانده شده است", + "platinum.faster_data": "مراکز داده سریع‌تر", + "platinum.dedicated": "خط اختصاصی", + "platinum.reliability": "افزایش اطمینان", + "platinum.platinum_one_year": "Lantern Platinum ‏1 ساله", + "platinum.platinum_two_years": "Lantern Platinum ‏2 ساله", + "platinum.pro_one_year": "Lantern Pro ‏1 ساله", + "platinum.pro_two_years": "Lantern Pro ‏ 2 ساله", + "platinum.total": "مجموع", + "platinum.free": "رایگان", + "platinum.credit.days": "+ {{ days }} روز", + "platinum.credit.months": "{{ months }} ماه", + "platinum.upgrade": "ارتقا به نسخه Platinum", + "platinum.upgrade_details": "خط اختصاصی + مراکز داده سریع‌تر!", + "platinum.unused_time_disclaimer": "کاربران Pro که به نسخه Platinum ارتقا می‌دهند، اشتراک Pro تبدیل‌شده خود را به‌عنوان زمان اضافه‌شده در بالا می‌بینند.", + "p2p.opt_in_description": "از اینترنت خود جهت کمک به مردم برای دسترسی بدون سانسور به اینترنت استفاده کنید", + "p2p.active_sharing_description": "اشتراک‌گذاری اینترنت شما روشن است", + "p2p.dialog.title": "اشتراک‌گذاری دسترسی اینترنت", + "p2p.dialog.text.1": "با اشتراک‌گذاری اتصال خود، به افرادی که دسترسی محدود به اینترنت دارند کمک کنید. با دادن اجازه دسترسی به اینترنت خود، بخشی از شبکه داوطلبانی خواهید بود که اینترنت را آزادتر می‌کنند.", + "p2p.dialog.text.2": "اشتراک‌گذاری موجب به خطر افتادن هویت یا امنیت شما نمی‌شود. هر زمان خواستید می‌توانید اشتراک‌گذاری اینترنت خود را متوقف کنید.", + "p2p.dialog.yes_button": "بله، اشتراک‌گذاری شروع شود", + "p2p.dialog.no_button": "لغو", + "p2p.banner.introducing": "معرفی", + "top_sites.top_sites": "سایت‌های برتر" +} \ No newline at end of file diff --git a/locale/translation/fr.json b/locale/translation/fr.json new file mode 100644 index 000000000..83a229080 --- /dev/null +++ b/locale/translation/fr.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "État : %v", + "TRAY_CONNECT": "Se connecter", + "TRAY_DISCONNECT": "Se déconnecter", + "TRAY_SHOW": "Afficher %s", + "TRAY_UPGRADE_TO_PRO": "Passer à Lantern Pro", + "TRAY_QUIT": "Fermer %s", + "BACKEND_DATA_TITLE": "Il n’y a plus de données %s à grande vitesse", + "BACKEND_DATA_MESSAGE": "Veuillez passer à la version Pro afin de continuer à utiliser %s à pleine vitesse.", + "BACKEND_DATA_PERCENT_TITLE": "Vous avez atteint %s de vos données %s", + "BACKEND_DATA_PERCENT_MESSAGE": "Vous avez utilisé %s de vos %s de données à grande vitesse. Surclassez votre compte maintenant.", + "BACKEND_CLICK_LABEL": "Ouvrir", + "BACKEND_CLICK_LABEL_OPEN": "Ouvrir", + "BACKEND_CLICK_LABEL_HELP": "Aide", + "BACKEND_CLICK_LABEL_GOT_IT": "D’accord", + "BACKEND_AUTOUPDATED_TITLE": "Mettre %s à jour vers la version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s%s a été téléchargée. Veuillez redémarrer %s pour l’utiliser.", + "BACKEND_MITM_INSTALL_CERT": "%s veut installer un certificat personnalisé afin d’améliorer les performances", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Veuillez autoriser %v à effectuer des changements à votre système", + "BACKEND_ALERT_TITLE": "Une alerte critique demande votre attention", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s a besoin de votre autorisation afin d’installer des outils de diagnostic. Cela nous aidera à améliorer votre expérience avec %s.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Impossible d’enregistrer la configuration", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Impossible d’enregistrer la configuration de l’application. %s ne peut pas garantir que votre trafic sera relayé correctement.", + "about.content": "Lantern est une application qui fournit un accès rapide, fiable et sûr vers l’internet ouvert.", + "app.error": "Un problème est survenu !", + "about.faq": "Lire les FAQ de Lantern", + "about.open": "L’Internet ouvert pour tous", + "about.questions": "Des questions ?", + "about.title": "À propos", + "account.add.password": "Ajouter un mot de passe au compte", + "account.agree.terms": "Je comprends que la perte de mon mot de passe\nimplique la perte de l’accès au compte. Lantern ne peut\npas m’aider à récupérer mon mot de passe.", + "account.agree.terms.error": "Vous devez d’abord accepter les conditions générales", + "account.cancel": "Annuler le compte Pro", + "account.created": "Le compte a été créé", + "account.create.pro.account.header": "Créer un compte Pro", + "account.create.pro.account.text": "Lantern change la façon dont les comptes sont gérés. À partir de maintenant, les utilisateurs Pro devront créer un nom d’utilisateur et un mot de passe. Ces authentifiants seront utilisés pour se connecter à d’autres appareils et permettre l’accès à de nouvelles fonctions.", + "account.have.a.account": "Avez-vous un compte ?", + "account.link.username.pro": "Relier le nom d’utilisateur au compte Pro", + "account.recovery": "Récupération de compte", + "account.recovery.link.device": "Relier un appareil", + "account.recovery.device.code": "Code de liaison d’appareil", + "account.recovery.device.enter.code": "Saisir ou coller un code de liaison d’appareil", + "account.recovery.device.instructions.header": "Pour relier cet appareil à votre compte Pro :", + "account.recovery.device.instructions.step.one": "1. Sélectionnez l’option « Relier un appareil » dans l’élément Gestion du compte dans votre Lantern Pro pour ordinateur ou dans le menu de votre appareil Lantern mobile Pro.", + "account.recovery.device.instructions.step.two": "2. Saisissez le code de liaison d’appareil et envoyez.", + "account.recovery.device.instructions.part.three": "*Assurez-vous que la version la plus récente de Lantern est utilisée sur les deux appareils", + "account.recovery.method": "Veuillez choisir une méthode pour récupérer votre compte", + "account.recovery.send.email": "Envoyer un courriel", + "account.recovery.submit": "Envoyer", + "account.recovery.success": "La liaison est réussie", + "account.pro_management": "Gestion du compte Pro", + "account.free_management": "Gestion du compte", + "account.free.cap": "Il reste {{mb}} Mo de données gratuites. Réinitialisation à {{reset}}", + "account.free.cap.upgrade": "Passez à la version Pro et obtenez des données à grande vitesse illimitées", + "account.freelink.validFor": "valide pendant %s", + "account.freelink.desc": "Afin d’autoriser cet appareil à utiliser votre compte Pro :", + "account.freelink.step1": "1. Sélectionnez l’option « Relier un appareil » dans le menu sur votre appareil Pro", + "account.freelink.step2": "2. Saisir le code de liaison d’appareil et envoyer.", + "account.freelink.reminder": "* Assurez-vous que la version la plus récente de Lantern est utilisée sur les deux appareils", + "account.freelink.errorTitle": "Erreur de liaison", + "account.freelink.errorText": "Avez-vous vraiment saisi le code sur votre appareil Pro ?", + "account.freelink.headerDesc": "Relier cet appareil à votre compte Pro", + "account.freelink.title": "Code de liaison d’appareil", + "account.pro.charge": "Une autre année de Lantern Pro sera automatiquement imputée à votre compte à la fin de votre cycle de facturation.", + "account.upgrade_pro": "Passer à Lantern Pro", + "account.upgrade": "Passer à la version Pro", + "account.upgrade_platinum": "Passer à Platinum", + "account.create": "Créer un compte", + "account.email": "Adresse courriel", + "account.confirm.password": "Confirmer le mot de passe", + "account.password": "Mot de passe", + "account.pro.email": "Adresse courriel :", + "account.pro.expiration": "Expiration du compte Pro", + "account.platinum.expiration": "Expiration du compte Platinum", + "account.pro.expired": "Votre compte Pro est arrivé à expiration. Renouvelez-le maintenant et obtenez des données mensuelles illimitées.", + "account.pro.expiry": "Votre compte Pro arrivera à expiration dans %s jours, le %s.", + "account.pro.bonusMonths": "Cela inclut vos {{bonusMonths}} mois gratuits supplémentaires !", + "account.pro.thisdevice": "(Cet appareil)", + "account.pro.logout": "DÉCONNEXION", + "account.pro.removedevice": "RETIRER", + "account.pro.devices": "Appareils Lantern Pro (jusqu’à trois)", + "account.pro.device.confirm.title": "Desautoriser l’appareil", + "account.pro.device.confirm": "Voulez-vous vraiment supprimer « {{device}} » de votre compte Lantern Pro ?", + "account.pro.device.one.title": "Un appareil seulement", + "account.pro.device.one": "Désolé, mais vous ne pouvez pas retirer votre dernier apprareil autorisé.", + "account.pro.linkingcode": "Code de liaison d’appareil :", + "account.pro.renew": "Renouveler le compte Pro", + "account.platinum.renew": "Renouveler le compte Platinum", + "account.pro.renew_CN": "Renouveller", + "account.prolink.errorTitle": "Erreur de liaison", + "account.prolink.errorText": "Avez-vous vraiment copié le code correctement de l’autre appareil ?", + "account.prolink.successTitle": "Appareil relié", + "account.prolink.successText": "Vous avez relié votre appareil avec succès. Votre autre appareil passera automatiquement à la version Pro dans quelques instants, veuillez patienter.", + "account.signin": "Se connecter", + "account.signout": "Se déconnecter", + "account.submit": "Envoyer", + "account.username": "Nom d’utilisateur", + "account.switch.to.register": "Passer à la création de compte", + "account.switch.to.signin": "Passer à la connexion", + "account.invalid.username": "Le nom d’utilisateur est invalide", + "account.invalid.email": "L’adresse courriel est invalide", + "account.password.mismatch": "Le mot de passe de confirmation ne correspond pas", + "account.password.short": "Le mot de passe est trop court", + "account.password.lowercase": "Le mot de passe doit comporter au moins une minuscule", + "account.password.uppercase": "Le mot de passe doit comporter au moins une majuscule", + "account.password.number": "Le mot de passe doit comporter au moins un chiffre", + "account.password.compromised": "Le mot de passe fait partie d’une liste de mots de passe compromis", + "modal.register.free.header": "S’inscrire ou se connecter pour accéder à votre porte-monnaie Yinbi", + "modal.register.pro.header": "Ajouter un mot de passe au compte pour accéder à votre porte-monnaie Yinbi", + "modal.register.pro.signin.header": "Se connecter pour accéder au porte-monnaie Yinbi", + "modal.register.free.text": "Afin d’utiliser le porte-monnaie Yinbi, vous devez avoir un compte Lantern. Veuillez vous inscrire ou\nvous connecter afin de poursuivre.", + "modal.register.pro.text": "Afin d’utiliser le porte-monnaie Yinbi, vous devez ajouter un mot de passe à votre compte Lantern.", + "modal.register.pro.signin.text": "Afin d’utiliser le porte-monnaie Yinbi, vous devez vous connecter à votre compte Lantern", + "adyen.paymentMethods.title": "Modes de paiement", + "adyen.paymentMethods.storedMethods": "Vos modes de paiement", + "adyen.paymentMethods.otherMethods": "Sélectionner un autre mode", + "adyen.paymentMethods.moreMethodsButton": "Autres modes de paiement", + "adyen.payButton": "Payer", + "adyen.payButton.formatted": "Payer %@", + "adyen.cancelButton": "Annuler", + "adyen.dismissButton": "Valider", + "adyen.storeDetails": "Enregistrer pour mon prochain paiement", + "adyen.payment.redirecting": "Vous serez redirigé", + "adyen.payment.processing": "Votre paiement est en cours de traitement", + "adyen.creditCard.title": "Détails de la carte", + "adyen.creditCard.holderName": "Nom du détenteur de la carte", + "adyen.creditCard.holderName.placeholder": "É. Grenier", + "adyen.creditCard.numberField.title": "Numéro de carte", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Le numéro de carte est invalide", + "adyen.creditCard.expiryDateField.title": "Date d’expiration", + "adyen.creditCard.expiryDateField.placeholder": "MM/AA", + "adyen.creditCard.expiryDateField.invalid": "La date d’expiration est invalide", + "adyen.creditCard.expiryDateField.month": "Mois", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "AA", + "adyen.creditCard.expiryDateField.year": "Année", + "adyen.creditCard.cvcField.title": "Code de sécurité", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Nombre de versements", + "adyen.creditCard.storeDetailsButton": "Mémoriser cette carte pour mon prochain paiement", + "adyen.creditCard.oneClickVerification.title": "Vérifiez votre carte", + "adyen.creditCard.oneClickVerification.message": "Veuillez saisir le CVC pour %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Le CVC est invalide", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Veuillez saisir un code de sécurité valide pour continuer.", + "adyen.sepaDirectDebit.ibanField.title": "Numéro de compte (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Le numéro de compte est invalide", + "adyen.sepaDirectDebit.nameField.title": "Non du détenteur", + "adyen.sepaDirectDebit.nameField.placeholder": "É. Grenier", + "adyen.sepaDirectDebit.consentButton": "J’accepte que le montant ci-dessous soit débité de mon compte bancaire.", + "adyen.sepa.ownerName": "Non du détenteur", + "adyen.sepa.ibanNumber": "Numéro de compte (IBAN)", + "adyen.giropay.searchField.placeholder": "Nom de la banque / BIC", + "adyen.giropay.minimumLength": "3 caractères min.", + "adyen.giropay.noResults": "Il n’y a aucun résultat de recherche", + "adyen.error.title": "Erreur", + "adyen.error.subtitle.redirect": "Échec de réacheminement", + "adyen.error.subtitle.payment": "Échec de paiement", + "adyen.error.subtitle.refused": "Le paiement a été refusé", + "adyen.error.message.unknown": "Une erreur inconnue est survenue", + "adyen.error.message.cannotConnectToInternet": "Échec de connexion à Internet, Veuillez vérifier votre connexion à Internet.", + "adyen.error.message.cannotConnectToHost": "Échec de connexion à notre serveur de paiement.", + "adyen.error.retryButton": "Réessayer", + "adyen.idealIssuer.selectField.title": "Banque", + "adyen.idealIssuer.selectField.placeholder": "Sélectionnez votre banque", + "adyen.creditCard.success": "Le paiement est réussi", + "adyen.oneClick.confirmationAlert.title": "Confirmer le paiement de %@", + "adyen.redirect.cannotOpenApp.title": "Impossible d’ouvrir l’appli", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": ".Il est impossible d’ouvrir cette appli, car elle n’est pas installée sur cet appareil", + "adyen.holderName": "Nom du détenteur de la carte", + "adyen.countryCode": "Indicatif de pays", + "adyen.telephone.number": "Numéro de téléphone", + "android.download": "Lantern pour Android", + "android.download.title": "Télécharger Lantern pour Android", + "authorize.title": "Autoriser l’appareil à la version Pro", + "authorize.step1.have_pro_device": "J’ai un autre appareil Lantern Pro", + "authorize.step1.link": "Liaison par appareil", + "authorize.step1.email_linking": "Liaison par courriel", + "authorize.device_linking_explanation": "Utilisez cette méthode si vous êtes connecté à un autre appareil et que vous l’avez avec vous", + "authorize.device_email_explanation": "Utilisez cette méthode si vous souhaitez qu’un code de liaison d’appareil vous soit envoyé par courriel", + "authorize.link_device": "Relier un appareil", + "authorize.step1.choose": "Veuillez choisir une méthode pour relier votre compte", + "authorize.step1.or": "ou", + "authorize.step1.recover": "Je dois récupérer mon compte Lantern Pro", + "authorize.step1.start": "lancer la récupération", + "authorize.step1.no_mail": "Avez-vous oublié votre adresse courriel ?", + "authorize.step1.description": "Saisissez votre adresse courriel et si le compte existe, nous vous enverrons un courriel avec un code de liaison d’appareil", + "authorize.step2b.enter_code": "Saisissez votre code de récupération de compte", + "authorize.step2b.code": "Code de récupération de compte", + "authorize.step2b.instruction": "Un courriel comprenant un code de récupération a été envoyé à {{email}} si ce compte existe. Ce courriel pourrait prendre plusieurs heures pour vous parvenir. Veuillez vérifier votre dossier des courriels indésirables/pourriels si vous ne le trouvez pas.", + "authorize.step2b.no_mail": "Le courriel n’a pas été reçu", + "authorize.step3.recovery": "Récupération de compte", + "authorize.step3.no_email": "Oups ! Nous avons du mal à trouver votre adresse courriel. Veuillez fournir plus de renseignements ci-dessous pour nous aider à trouver votre compte.", + "authorize.step3.no_code_received": "Vous éprouvez des difficultés à recevoir le courriel de récupération ? Saisissez les renseignements ci-dessous et nous vous contacterons dans les 48 heures.", + "authorize.step3.your_email": "Votre adresse courriel", + "authorize.step3.payment_method": "Mode de paiement", + "authorize.step3.payment_method_hint": "Sélectionner le mode de paiement utilisé pour obtenir la version Pro", + "authorize.step3.credit_card": "Carte de crédit", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "J’ai reçu la version Pro en parrainant un ami", + "authorize.step3.payment_account": "Compte de paiement", + "authorize.step3.payment_account_hint": "Saisissez vos renseignements de compte Alipay", + "authorize.step3.referral_code": "Votre code de parrainage", + "authorize.step3.purchase_date": "Date d’achat", + "authorize.step3.note": "Veuillez écrire toute autre renseignement qui pourrait nous aider à trouver votre compte.", + "authorize.step4.title": "Récupération du compte en cours", + "authorize.step4.text1": "Merci. Nous avons bien reçu votre demande de récupération de compte.", + "authorize.step4.text2": "Veuillez prévoir 48 heures pour récupérer les renseignements de votre compte Pro.", + "authorize.step4.text3": "Nous enverrons les renseignements à l’adresse courriel saisie dans l’écran précédent.", + "authorized.continue": "Poursuivre vers la version Pro", + "authorized.continue.lantern": "Poursuivre vers Lantern", + "authorized.text": "Cet appareil est maintenant autorisé à utiliser votre compte Lantern Pro.", + "authorized.title": "L’appareil est autorisé", + "button.account": "Compte", + "button.renew": "Renouveller", + "button.upgrade": "Passer à la version Pro", + "button.upgrade_now": "Passer à la version Pro maintenant", + "button.upgrade_to_lantern_pro": "Passez à Lantern Pro", + "button.copy_your_code": "Copiez votre code", + "button.try_again": "Réessayer", + "button.continue": "Poursuivre", + "button.continue_to": "Poursuivre vers {{planType}}", + "bullet.click_button": "Cliquez sur le bouton ci-dessous", + "bullet.paste_code": "Collez le code et le lien de téléchargement dans un message", + "bullet.send_to_friends": "Envoyez à vos amis", + "cancel": "Annuler", + "confirm": "Confirmer", + "norecoveryyinbi": "*Ne récupère pas le porte-monnaie Yinbi", + "email.recovery.check.email": "Cherchez dans votre boîte de réception un courriel avec un code de récupération", + "email.recovery.code.label": "Saisissez ou collez le code de récupération", + "email.recovery.no.code": "N’avez-vous pas reçu un code ?", + "email.recovery.text": "Saisissez votre adresse courriel et nous vous enverrons un code afin de réinitialiser votre mot de passe.\nSi vous détenez un porte-monnaie Yinbi, ceci NE le récupérera PAS. Afin de récupérer votre porte-monnaie Yinbi, saisissez votre phrase de récupération Yinbi.", + "email.recovery.desc": "Utilisez cette méthode si vous voulez que votre code de récupération vous soit envoyé par courriel", + "device.recovery.desc": "Utilisez cette méthode si vous êtes connecté à un autre appareil et que vous l’avez avec vous", + "google_search": "Recherche Google", + "giveaway.upgrade": "Surclassez votre compte pour recevoir la distribution gratuite du jour", + "giveaway.title_released_today": "{{formattedTokens}} YNB sont mis en circulation aujourd’hui", + "giveaway.what_is_it": "Qu’est-ce que la distribution promotionnelle de yinbis ?", + "giveaway.description1": "La fondation Yinbi distribue gracieusement 888 milliards en cryptomonnaie YNB exclusivement par Lantern aux acheteurs de Lantern Pro.", + "giveaway.description2": "Les yinbis seront distribués à la fin de chaque journée, d’après la quantité de yinbis mis en circulation pendant la journée, d’après le nombre de personnes qui passeront à la version Pro ou renouvelleront, et d’après le nombre d’années ou de comptes que vous achèterez. Les yinbis seront déposés directement dans votre porte-monnaie Yinbi dans Lantern.", + "giveaway.learn_more": "En apprendre davantage", + "link_device": "Avez-vous déjà un compte Pro ? Reliez l’appareil", + "email.recovery": "Récupération par courriel", + "email_taken": "L’adresse courriel est déjà inscrite", + "username_taken": "Le nom d’utilisateur est déjà inscrit", + "err.unknown_error": "Erreur inconnue", + "err.internal_error": "Erreur interne", + "err.bad_input": "Mauvaise entrée", + "err.not_authorized": "Non autorisé", + "err.user_exists": "L’utilisateur existe", + "err.no_such_user": "Utilisateur inconnu", + "err.user_already_verified": "Utilisateur déjà vérifié", + "err.invalid_user_verification": "Vérification d’utilisateur invalide", + "err.user_unverified": "Utilisateur non vérifié", + "err.operation_temporarily_unavailable": "Opération temporairement non disponible", + "err.wrong_or_inexistent_plan": "Forfait erroné ou inexistant", + "err.user_has_active_subscription": "L’utilisateur détient un abonnement actif", + "err.payment_error": "Erreur de paiement", + "err.no_codes_left": "Plus aucun code de parrainage", + "err.wrong_code": "Code de parrainage erroné", + "err.redeeming_own_code_not_allowed": "Il est interdit d’encaisser ses propres codes", + "err.wrong_charge_id": "ID de facturation erroné", + "err.wrong_link_code": "Le code de lien est erroné", + "err.invalid_credentials": "L’identifiant utilisateur indiqué était invalide", + "footer.reseller": "Gagnez de l’argent. Devenez revendeur Lantern Pro. Cliquez ici", + "footer.reseller.email_subject": "Informez-moi sur le programme pour revendeur Lantern.", + "footer.reseller.email_body": "En devenant revendeur Lantern, vous aurez la possibilité de gagner jusqu’à 25 % sur chaque vente d’abonnement Lantern Pro. Expliquez-nous ci-dessous pourquoi vous souhaitez devenir revendeur ?", + "feature.faster_speed": "Vitesse accrue", + "feature.faster": "Des centres de traitement de données plus rapides", + "feature.unlimited": "Données illimitées", + "feature.nologs": "Aucune journalisation", + "feature.devices": "Connectez jusqu’à trois appareils", + "feature.noads": "Sans publicité", + "feature.yinbi.tooltip": "La fondation Yinbi distribue gracieusement 888 milliards en cryptomonnaie YNB exclusivement aux acheteurs de Lantern Pro. Les yinbis seront distribués à la fin de chaque journée, d’après la quantité de yinbis mis en circulation pendant la journée, le nombre de personnes qui passeront à la version Pro ou procéderont au renouvellement, et d’après le nombre d’années ou de comptes que vous achèterez. Les yinbis seront déposés directement dans votre porte-monnaie Yinbi dans Lantern !", + "feature.antiblock": "Résistance aux blocages", + "feature.data_center": "Meilleurs centres de traitement de données", + "feature.free_yinbi": "Cryptomonnaie Yinbi gratuite", + "free.title": "Lantern Pro", + "free.desc": "Plus rapide. Plus robuste. Illimité. Sécurisé.", + "free.link_account": "Avez-vous déjà un compte Pro ? Reliez votre compte.", + "home.get_lantern_pro": "Obtenir Lantern Pro", + "home.get_lantern_platinum": "Passer à l’abonnement supérieur", + "home.welcome_popup_subheader": "Bienvenue à la nouvelle Lantern !", + "home.welcome_popup_content_1": "Nous avons travaillé d’arrache-pied afin de mettre Lantern à jour et d’ajouter de nouvelles fonctions.", + "home.welcome_popup_content_2": "Dans notre nouvelle interface, vous trouverez une barre de recherche qui vous permettra de chercher les fichiers partagés sur le réseau Lantern. Vous pourrez aussi participer au contenu en publiant vous-même un fichier. C’est une fonction bêta. Essayez-la et dites-nous ce que vous en pensez. Nous continuerons à apporter des améliorations d’après vos rétroactions.", + "home.welcome_popup_button": "Essayez-la", + "input.email": "Courriel", + "input.your_email": "Votre adresse courriel", + "input.confirm_email": "Confirmez l’adresse courriel", + "input.enter_email": "Saisissez votre adresse courriel", + "input.use_valid_email": "Saisissez une adresse courriel valide", + "input.email_not_match": "Les champs d’adresse courriel ne correspondent pas", + "input.existing_email": "Adresse courriel existante", + "issue.your_email": "Votre adresse courriel", + "issue.attach_image_failure": "Impossible de joindre une image", + "issue.try_again": "Veuillez réessayer", + "issue.select_issue": "Veuillez choisir un problème", + "issue.selected_issue": "Sélectionner le problème", + "issue.select_issue_hint": "Veuillez choisir un problème dans le menu déroulant", + "issue.note": "Décrire votre problème", + "issue.description": "Description du problème", + "issue.error": "Problème de signalement d’erreur", + "issue.submit": "Envoyer le relevé", + "issue.report_screenshot": "Glisser-déposer une image ou cliquer pour téléverser une capture d’écran", + "issue.reported": "Nous vous remercions d’avoir signalé ce problème. En raison du volume, nous ne pouvons pas répondre à la plupart des problèmes, mais nous nous efforçons d’améliorer Lantern d’après vos signalements.", + "issue.report_sent": "Le relevé a été envoyé", + "issue.type.no_access": "Impossible d’accéder à des sites bloqués", + "issue.type.payment_fail": "Impossible de terminer le paiement", + "issue.type.cannot_login": "Impossible de se connecter", + "issue.type.always_spinning": "L’indicateur de chargement tourne sans fin", + "issue.type.slow": "Lent", + "issue.type.cannot_link_device": "Impossible de relier des appareils", + "issue.type.crashes": "Lantern plante", + "issue.type.other": "Autre", + "languages.title": "Langues", + "lantern.email": "Adresse courriel dans Lantern", + "mobile.link": "Utilisez le lien pour télécharger Lantern sur votre appareil Android :", + "mobile.title": "Obtenir la version pour Android", + "nav.about": "À propos", + "nav.account": "Gestion du compte", + "nav.authorize": "Ajouter un appareil", + "nav.authorized": "L’appareil est autorisé", + "nav.unauthorized_link": "Autoriser l’appareil à la version Pro", + "nav.language": "Langue", + "nav.lantern": "Lantern", + "nav.mobile": "Obtenir la version mobile", + "nav.report_issue": "Signaler un problème", + "nav.settings": "Paramètres", + "nav.support": "Soutien", + "nav.verify": "Vérification de compte", + "nav.yinbi": "Encaissement de yinbis", + "nav.home": "Accueil", + "nav.discover": "Découvrir", + "nav.wallet": "Porte-monnaie", + "nav.yinbi_wallet": "Porte-monnaie Yinbi", + "notification.retry": "Réessayer", + "notifications": "Notifications", + "notifications.whatisnew": "Qu’y a-t-il de nouveau ?", + "password.change": "Changer le mot de passe", + "password.changed": "Le mot de passe a été changé", + "continue.to.pro": "Poursuivre vers la version Pro", + "username": "Nom d’utilisateur", + "password.new": "Nouveau mot de passe", + "password.requirements": "
Le mot de passe doit comporter :
  • Au moins huit caractères
  • Une lettre minuscule
  • Une lettre majuscule
  • Au moins un chiffre
  • Le mot de passe ne doit pas figurer dans la liste des mots de passe compromis
", + "password.reset": "Réinitialiser le mot de passe", + "paxful.buy": "Acheter", + "paxful.payment": "Mode de paiement", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Porte-monnaie en ligne", + "paxful.bank": "Virements bancaires", + "paxful.gamer_card": "Cartes pour joueurs", + "paxful.gift_card": "Cartes-cadeaux", + "paxful.cash": "Paiement comptant", + "paxful.digital_currency": "Monnaies électroniques", + "paxful.button": "Afficher les meilleures offres", + "payment.close": "Fermer", + "payment.redirectErrorTitle": "Erreur de connexion au serveur de paiement", + "payment.redirectErrorText": "Nous nous efforçons actuellement de résoudre ce problème. Veuillez revérifier plus tard.", + "payment.wait_for_pro": "Nous vous remercions d’avoir acheté Lantern Pro. Vous passerez à la version Pro dans quelques instants, veuillez patienter.", + "payment.moreOptions": "Plus d’options", + "payment.fewerOptions": "Moins d’options", + "payment_methods.select_name": "Sélectionner un mode de paiement", + "payment_methods.alipay": "Carte de crédit/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Pour acheter Lantern Pro", + "payment_methods.shetab.details.body": "Après avoir cliqué sur Poursuivre l’achat, vous serez redirigé vers un site externe pour compléter votre paiement et obtenir votre code d’activation.", + "payment_methods.shetab.details.tutorial_header": "Tutoriel en persan", + "payment_methods.shetab.details.purchase_voucher_button": "Poursuivre l’achat", + "payment_methods.shetab.details.input_code_button": "Saisissez le code d’activation", + "plan.step1": "Étape 1", + "plan.apply": "Appliquer", + "plan.step2": "Étape 2", + "plan.most_popular": "Le plus populaire", + "plan.step3": "Étape 3", + "plan.choose_plan": "Choisissez un abonnement", + "plan.enter_email": "Saisissez votre adresse courriel", + "plan.choose_method": "Choisissez un mode de paiement", + "plan.bestValue": "La meilleure offre", + "plan.per_month": "par mois", + "plan.yinbi_2x": "+ 2 x Yinbi !", + "plan.oneYear": "1 an", + "plan.add_referral": "Ajouter un code de parrainage", + "plan.years": "Abonnement de {{years}} an", + "plan.desc": "{{price}} facturés une fois", + "plan.bonus_months": "+ {{bonusMonths}} mois", + "plan.price.cny": "%.02f ¥", + "plan.price.usd": "%.02f $", + "plan.currency.cny": "(CNY)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/AN", + "plan.select": "Sélectionner", + "plan.two_year": "Deux ans", + "plan.one_year": "Un an", + "plan.savings": "Économisez {{formattedDiscount}} %", + "plans.title": "Forfaits Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Pour Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Vous disposez d’un code d’activation Lantern Pro  ? Cliquez ici.", + "plans.with_voucher_code": "Avez-vous un code d’activation ? Cliquez ici.", + "pro.apply": "Vos crédits seront imputés à votre compte lors du prochain cycle de facturation.", + "pro.title": "Invitez des amis, obtenez plus de crédits Pro gratuitement", + "pro.subtitle": "Si votre ami achète le forfait de deux ans, il obtiendra trois mois supplémentaires gratuits de la version Pro, et vous aussi. Le forfait d’un an vous fera gagner un mois gratuit, ainsi qu’à votre ami.", + "pro.share": "Partagez votre code avec des amis et gagnez plus de crédits.", + "promotion.title": "Paiement de Lantern Pro", + "promotion.title.activation": "Activation de Lantern Pro", + "promotion.enter_and_confirm_email": "Veuillez saisir et confirmer votre adresse courriel.", + "promotion.code.hint": "Saisissez le code de parrainage de votre ami (facultatif)", + "promotion.code.label": "Code de parrainage", + "promotion.payment": "Poursuivre vers le paiement", + "promotion.payment.btc": "Payer en ₿", + "promotion.loading": "Chargement…", + "promotion.howto_1y": "Si un ami a partagé son code de parrainage avec vous, saisissez le code afin de recevoir un mois gratuit de Lantern Pro après votre passage en caisse.", + "promotion.howto_2y": "Si un ami a partagé son code de parrainage avec vous, saisissez le code afin de recevoir trois mois gratuits de Lantern Pro après votre passage en caisse.", + "promotion.pay": "Payer {{amount}}", + "promotion.select": "Sélectionner", + "promotion.promotion_applied_1y": "+un mois en prime", + "promotion.promotion_applied_2y": "+trois mois en prime", + "promotion.too_many_referrals": "Ce code de parrainage a déjà été ajouté. Passez à la caisse maintenant afin de recevoir vos mois supplémentaires.", + "promotion.activation.enter_and_confirm_email": "Veuillez saisir et confirmer votre adresse courriel pour enregistrer votre compte Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Code d’activation", + "promotion.activation.instructions": "Afin d’inscrire votre compte, saisissez votre adresse courriel et le code d’activation à 25 chiffres reçu du revendeur.", + "promotion.activation.howto": "Veuillez saisir ci-dessus votre code d’activation de Lantern Pro à 25 caractères. Si vous n’avez pas de code, veuillez acheter la version Pro sur l’écran précédent ou chercher un revendeur Lantern Pro en ligne.", + "promotion.activation.continue": "Passer à un compte Pro", + "promotion.voucher.hint": "Code d’activation", + "promotion.voucher.howto": "Veuillez saisir votre code d’activation Fast World Pay de 12 caractères ci-dessus", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Erreur lors de l’échange de votre code d’activation.", + "promotion.voucher.error.invalid_code": "Le code d’activation est invalide", + "promotion.voucher.error.invalid_plan": "Le code d’activation est associé à un forfait invalide", + "promotion.voucher.error.already_redeemed": "Le code d’activation a déjà été validé", + "referral.code": "Code de parrainage", + "referral.text": "Utilise mon code %s et gagne trois mois gratuits lors de ton inscription.", + "referral.description_free": "Partagez votre code avec vos amis et obtenez un mois gratuit du service Lantern Pro s’ils achètent Pro.", + "referral.description_pro": "Partagez votre code avec vos amis et obtenez un mois gratuit supplémentaire du service Lantern Pro s’ils achètent Pro", + "register": "S’inscrire", + "renew.subtitle_early": "Renouvelez votre abonnement et obtenez trois mois gratuits", + "renew.subtitle_last_day": "Renouvelez votre abonnement et obtenez trois mois gratuits", + "renew.subtitle_expired": "Renouvelez votre abonnement et obtenez 45 jours gratuits", + "renew.details_early": "Votre abonnement Lantern Pro se terminera bientôt. Renouvelez-le maintenant et obtenez jusqu’à trois mois gratuits.", + "renew.details_last_day": "Votre abonnement Lantern Pro se termine aujourd’hui. Renouvelez-le maintenant et obtenez jusqu’à trois mois gratuits.", + "renew.details_expired": "Votre abonnement Lantern Pro est expiré. Renouvelez-le maintenant et obtenez jusqu’à quarante-cinq jours gratuits.", + "renew.asterisk_early": "* Cette offre à durée limitée n’est valide que pour les renouvellements anticipés.", + "renew.asterisk_last_day": "* Ceci est votre dernière chance de recevoir cette offre spéciale.", + "renew.asterisk_expired": "* Cette offre est à durée limitée.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + UN MOIS GRATUIT", + "renew.plan_renewal_bonus_months": "$%d%s + %d MOIS GRATUITS", + "renew.plan_renewal_bonus_days": "$%d%s + %d JOURS GRATUITS", + "renew.next": "suivant", + "renew.decline": "Refuser l’offre", + "renew.decline_question": "Voulez-vous vraiment refuser cette offre ?", + "renew.decline_yes": "Renouveler ultérieurement", + "renew.decline_dismiss": "Renouveler maintenant", + "renew.notification_title_30_days": "Renouvelez votre version Pro maintenant et réalisez des économies considérables.", + "renew.notification_title_30_days_platinum": "Renouvelez votre abonnement Platinum maintenant et réalisez des économies considérables !", + "renew.notification_text_30_days": "Votre compte {{planName}} arrivera à expiration dans {{remainingDays}} jours. Renouvelez-le maintenant et obtenez jusqu’à trois mois gratuits.", + "renew.notification_title_2_days": "La remise sur {{planName}} se termine demain !", + "renew.notification_text_2_days": "Votre compte {{planName}} arrive à expiration demain. Ne ratez pas l’occasion d’obtenir une remise considérable.", + "renew.notification_title_last_day": "Dernière chance d’obtenir une remise", + "renew.notification_text_last_day": "Votre compte {{planName}} est arrivé à expiration. Renouvelez-le aujourd’hui et obtenez jusqu’à trois mois gratuits.", + "replica.upload": "Téléverser", + "replica.favorite": "Ajouter aux favoris", + "replica.added_to_favorites": "A été ajouté aux favoris", + "replica.filedrop_error": "Erreur de téléversement de ce fichier", + "replica.filedrop_error.file-too-large": "La taille maximale permise est {{fileSize}}", + "replica.filedrop_error.file-too-small": "Le fichier est trop petit", + "replica.filedrop_error.too-many-files": "Il y a trop de fichiers", + "replica.filedrop_error.file-invalid-type": "Ce type de fichier n’est pas pris en charge actuellement", + "replica.filedrop_remove_file": "Supprimer de la file", + "replica.post": "Téléverser un fichier", + "replica.relevance": "Pertinence", + "replica.upload_date": "Date de téléversement", + "replica.gallery_view": "Vue en galerie", + "replica.list_view": "Vue en liste", + "replica.copy_lantern_link": "Copier le lien Lantern", + "replica.documents": "Documents", + "replica.audio": "Son", + "replica.application": "Applis", + "replica.image": "Images", + "replica.video": "Vidéos", + "replica.web": "Web", + "replica.news": "Actualités", + "replica.upload_alert.dont_show": "Ne plus afficher", + "replica.upload_alert.cancel": "Annuler le téléversement", + "replica.upload_alert.resume": "Reprendre le téléversement", + "replica.upload_alert.info": "Renseignements importants", + "replica.upload_alert.desc1": "Les fichiers téléversés vers Lantern sont distribués et décentralisés. Une fois qu’un autre utilisateur y a accédé, personne ne peut les supprimer du réseau, pas même Lantern, même s’ils sont supprimés de votre liste « Mes fichiers ».", + "replica.upload_alert.desc2": "Si vous téléversez du contenu délicat, veuillez vous abstenir d’utiliser dans le fichier ou le nom de fichier des renseignements personnels qui permettraient de vous identifier.", + "replica.add_details": "Ajouter des détails", + "replica.cannot_edit": "Les noms des fichiers ne peuvent pas être modifiés après leur publication.", + "replica.next": "Suivante", + "replica.previous": "Précédente", + "replica.selectAll": "Tout sélectionner", + "replica.search_replica": "Recherche", + "replica.search_results_info": "Cet onglet n’affiche que les résultats de Lantern.", + "replica.search_results_info_message": "Les résultats de Lantern comprennent du contenu téléversé par les utilisateurs vers le réseau Lantern.", + "replica.no_files_found": "Aucun résultat", + "replica.or_content": "votre propre contenu afin qu’il soit trouvé par d’autres.", + "replica.try_again": "Essayez un mot-clé différent ou", + "replica.upload_success": "Le téléversement est réussi", + "replica.cannot_preview": "Il n’y a pas d’aperçu pour ce type de fichier", + "replica.no_description": "Aucune description fournie", + "replica.size": "Taille", + "replica.uploaded": "À été téléversée", + "replica.invalid_link": "Lien invalide", + "replica.close": "Fermer", + "replica.files": "Fichiers", + "replica.upload_history": "Historique de téléversement", + "replica.my_favorites": "Favoris", + "replica.no_uploads": "Pas encore de téléversements", + "replica.no_favorites": "Il n’y a pas encore de favoris", + "replica.mime_type": "Type de fichier : {{mime}}", + "replica.image_loading_error": "Erreur de chargement de l’image", + "replica.play": "Lecture", + "replica.pause": "Pause", + "replica.scrub": "Lecture dynamique", + "replica.skip_forward": "Avance rapide", + "replica.skip_backwards": "Retour rapide", + "replica.trending_videos": "Vidéos tendance", + "replica.file_uploaded": "Téléversement : il y a {{days}} jours", + "replica.file_size": "Taille", + "replica.duration": "Durée", + "replica.filename": "Nom de fichier", + "replica.filename_required": "Nommez votre fichier", + "replica.description_optional": "Ajouter une description", + "replica.expand": "Développer les détails", + "replica.filetype": "Type de fichier", + "replica.sortby": "Trier par", + "replica.link": "Lien de réplique", + "replica.collapse": "Réduire", + "replica.publish": "Publier", + "replica.cancel": "Annuler", + "replica.progress_current_upload": "Téléversement de", + "replica.progress_files": "fichiers", + "replica.progress_of": "de", + "replica.progress_upload_complete": "Terminer", + "replica.progress_upload_failure": "Le téléversement a échoué, veuillez réessayer.", + "replica.upload_in_progress": "Téléversement en cours", + "replica.upload_pending": "Téléversement en attente", + "replica.upload_error": "Erreur de téléversement", + "replica.upload_cancel": "Annuler le téléversement", + "replica.upload_confirm": "Voulez-vous vraiment annuler le téléversement ?", + "replica.progress_view": "Afficher", + "replica.delete": "Supprimer", + "replica.remove": "Retirer", + "replica.delete_file": "Supprimer le fichier", + "replica.remove_favorite": "Supprimer des favoris", + "replica.failed_to_delete": "Échec de suppression", + "replica.failed_to_remove": "Échec de suppression", + "replica.link_lookup_failure": "Échec de découverte du lien", + "replica.delete_file_confirmation_1": "Voulez-vous vraiment supprimer", + "replica.delete_file_confirmation_2": "de vos téléversements", + "replica.remove_favorite_confirmation_1": "Confirmez-vous la suppression ?", + "replica.remove_favorite_confirmation_2": "de vos favoris", + "replica.share_file": "Partager le fichier", + "replica.download_and_view": "Télécharger/visualiser", + "replica.download": "Télécharger", + "replica.copy_link": "Copier le lien de la réplique", + "replica.find_file": "Trouver un fichier", + "replica.file_drop_prompt": "Déposez un fichier pour lancer le téléversement.", + "replica.empty_uploads_text1": "Cliquez", + "replica.empty_uploads_text2": "ici", + "replica.empty_uploads_text3": "pour effectuer votre première publication.", + "replica.error_header": "Oups", + "replica.error": "Le traitement de votre interrogation a généré une erreur. veuillez réessayer", + "replica.serp_empty": "Google n’a retourné aucun résultat pour cette interrogation.", + "replica.disclaimer": "Lantern anonymise vos recherches et les protège contre les tiers", + "settings.general": "Général", + "settings.feedback": "Rétroaction", + "settings.autoLaunch": "Lancer Lantern avec le système", + "settings.autoReport": "Envoyer, en toute sécurité, des statistiques d’utilisation anonymes afin de contribuer à Lantern", + "settings.lantern_ads": "Afficher les publicités de Lantern", + "settings.lantern_ads_tooltip": "Lantern vous présente des publicités sur certains sites Web pour nous aider à financer notre service. Aucun renseignement d’utilisateur n’est recueilli ni transmis à nos serveurs. Si vous désactivez cette option, vous pourriez encore voir des publicités, mais elles ne proviendront pas du réseau Lantern.", + "settings.proxyAll": "Relayer tout le trafic", + "settings.proxyAllHelpTitle": "QUE FAIT L’OPTION « RELAYER TOUT LE TRAFIC » ?", + "settings.proxyAllHelp1": "Si cette option est activée, tout le trafic sera envoyé par Lantern (option la plus sécurisée).", + "settings.proxyAllHelp2": "Si cette option est désactivée, seul le trafic bloqué sera envoyé par Lantern (option la plus rapide, la plus habituelle).", + "settings.show_advanced": "Afficher les paramètres avancés", + "settings.hide_advanced": "Cacher les paramètres avancés", + "settings.systemProxy": "Gérer le mandataire système", + "settings.title": "Paramètres", + "settings.http_proxy": "Mandataire HTTP(S) :", + "settings.socks_proxy": "Mandataire SOCKS :", + "settings.caution": "Attention :", + "settings.caution_text": "Si vous décochez « Gérer le mandataire système », votre navigateur et les applications ne pourront plus utiliser Lantern automatiquement. Si vous savez comment configurer manuellement ces paramètres, référez-vous aux renseignements ci-dessus.", + "settings.select_language": "Sélectionner la langue", + "settings.diagnostics": "Joindre des renseignements de diagnostic", + "settings.diagnostics_tooltip": "Joindre des renseignements de diagnostic enverra à l’équipe de Lantern des données capturées de votre connexion. Cela nous permettra de mieux déterminer et résoudre votre problème.", + "status.lantern": "Lantern est", + "status.click_reconnect": "Cliquez-ici pour vous reconnecter", + "status.server_location": "Emplacement du serveur", + "status.tooltip1": "Lantern utilise une sélection intelligente des serveurs afin de vous connecter à nos meilleurs centres de traitement de données.", + "status.tooltip2": "Passez à Lantern Pro et obtenez un vitesse supérieure ainsi qu’une sélection optimisée des serveurs à partir de nos centres de traitement de données exclusifs à Lantern Pro.", + "status.protected_connection": "Votre connexion est protégée", + "status.please_wait": "Cela pourrait prendre quelques minutes…", + "status.connecting": "Connexion…", + "status.no_internet": "Désactivée", + "status.no_internet_connection": "Aucune connexion à Internet", + "status.connected": "Activée", + "status.disconnected": "Désactivée", + "status.throttled": "Vitesse limitée (plafonnement des données)", + "status.no_system_proxy": "{{status}}, le mandataire système n’est pas géré", + "status.fail_to_set_system_proxy": "Échec de définition de Lantern comme mandataire système", + "status.fail_to_open_browser": "Échec d’ouverture d’une fenêtre de navigateur pour afficher l’interface utilisateur de Lantern", + "support.forum": "Forum des utilisateurs de Lantern", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "En cliquant sur {{buttonText}}, vous acceptez nos Conditions générales d’utilisation", + "terms_of_service.replica": "En cherchant, en téléversant ou en utilisant nos produits de quelque manière que ce soit, vous acceptez nos Conditions générales d’utilisation, notre Politique de confidentialité ainsi que notre Politique DMCA", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipédia", + "verify.header": "Saisir ou coller un code de liaison d’appareil", + "verify.code": "Code de liaison d’appareil", + "verify.howto_1": "Si vous avez un compte Lantern Pro sur un autre appareil, veuillez saisir ici votre adresse courriel afin de recevoir un code pour autoriser l’appareil", + "verify.howto_1a": "Vous êtes actuellement un utilisateur Pro non autorisé. Veuillez saisir votre adresse de courriel afin d’autoriser votre compte Pro. Cela vous permettra de relier plusieurs appareils.", + "verify.howto_2": "Pour relier un appareil à votre compte Pro :", + "verify.howto_3": "1. Choisissez « Autoriser l’appareil à la version Pro » dans le menu de votre autre appareil.", + "verify.howto_4": "2. Saisissez le code de liaison obtenu à l’étape 1 et envoyez.", + "verify.reminder": "*Assurez-vous que la version la plus récente de Lantern est utilisée sur les deux appareils", + "verify.enter_pin": "Saisir ou coller un code de liaison d’appareil", + "verify.submit": "Envoyer", + "verify.title": "Vérification de compte", + "welcomeToPro.continue": "Poursuivre vers la version Pro", + "welcomeToPro.invite": "Invitez des amis et ils obtiendront trois mois gratuits s’ils achètent le forfait de deux ans, et vous aussi. Le forfait d’un an fera gagner un mois gratuit à vous et à vos amis. Lancez les invitations.", + "welcomeToPro.thanks": "Vous disposez désormais d’un accès illimité à l’aide de nos centres de données les plus rapides. Vous pouvez connecter jusqu’à trois appareils à votre compte.", + "welcomeToPro.title": "Bienvenue à Lantern Pro", + "welomeToPro.title_exclamation": "Bienvenue à Lantern Pro !", + "purchase.failed": "L’achat a échoué. Veuillez réessayer ultérieurement.", + "purchase.success": "L’achat a réussi", + "purchase.success_title": "Bienvenue à Lantern {{planType}} !", + "purchase.success_content_pro": "Vous disposez désormais d’un accès illimité à l’aide de nos centres de données les plus rapides. Vous pouvez connecter jusqu’à trois appareils à votre compte.", + "purchase.success_content_platinum": "Vous disposez désormais d’un accès illimité à l’aide de nos lignes dédiées et de nos centres de données les plus rapides. Vous pouvez connecter jusqu’à trois appareils à votre compte.", + "welcomeToPro.description": "Vous avez désormais un accès sans restrictions aux sites et aux services bloqués", + "messages.copied_to_clipboard": "Le code a été copié. Partagez-le avec vos amis.", + "messages.datacap": "Données gratuites à grande vitesse épuisées. Passez à la version Pro pour des données illimitées.", + "messages.fatal_error": "Désolé, nous n’arrivons pas à contacter les serveurs Lantern. Veuillez vérifier votre connexion Internet et réessayer.", + "messages.backend_gone": "Désolé, Lantern ne semble plus être en cours d’exécution. Veuillez redémarrer Lantern et réessayer.", + "messages.get_help": "Obtenir de l’aide", + "freeProCredits.title": "Inviter des amis", + "freeProCredits.shareWithFriends": "Partagez votre code avec des amis pour obtenir des mois gratuits.", + "freeProCredits.shareWithFriendsDesc": "Si votre ami achète le forfait de deux ans, il obtiendra trois mois gratuits et vous aussi. Le forfait d’un an vous fera gagner un mois gratuit, ainsi qu’à votre ami.", + "cards.serverLocation.unknown": "Inconnu", + "cards.serverLocation.description": "Emplacement de serveur optimisé", + "cards.serverLocation.description-free": "Emplacement de serveur", + "cards.serverLocation.description-upgrade": "Passez à Lantern Pro et accédez à des serveurs plus rapides", + "cards.serverLocation.title": "Emplacement actuel :", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern utilise une sélection intelligente des serveurs afin de trouver automatiquement pour vous la connexion la plus rapide possible à partir de nos centres de traitement de données à Tokyo, Singapour, Hong Kong, San Francisco, New York, Amsterdam, Bangalore et plus encore.", + "cards.serverLocation.text-free": "Lantern utilise une sélection intelligente des serveurs afin de vous connecter à nos meilleurs centres de traitement de données.", + "cards.serverLocation.upgrade-link": "Passez à Lantern Pro pour une vitesse supérieure et une sélection optimisée de serveurs de nos centres de traitement de données exclusifs à Lantern Pro.", + "cards.httpsUpgrades.description": "Mises à niveau HTTPS", + "cards.httpsUpgrades.title": "Mises à niveau HTTPS : %d", + "cards.httpsUpgrades.text": "Quand cela est possible, Lantern transforme automatiquement les connexions HTTP non sécurisées en des connexions HTTPS chiffrées, afin de préserver la confidentialité de vos renseignements alors que vous naviguez sur le Web.", + "cards.adsBlocked.description": "Blocage des publicictés", + "cards.adsBlocked.title": "Publicités bloquées : %d", + "cards.adsBlocked.text": "Lantern bloque les publicités envahissantes afin d’accélérer le temps de chargement des pages Web, d’économiser la bande passante et de vous offrir une expérience de navigation plus fluide.", + "cards.dataUsage.description": "Utilisation des données", + "cards.dataUsage.upgrade": "Passez à la version Pro maintenant", + "cards.dataUsage.mb-used": "Vous avez utilisé %d/%d Mo de vos données mensuelles à grande vitesse.", + "cards.dataUsage.upgrade-link": "Passez à la version Pro maintenant et obtenez un service à grande vitesse illimité.", + "cards.subscription.description": "Abonnement Pro", + "cards.subscription.renew": "Renouveller", + "cards.subscription.months": "Il vous reste %d mois de Lantern Pro dans votre abonnement.", + "cards.subscription.days": "Il vous reste %d jours de Lantern Pro dans votre abonnement.", + "cards.subscription.unit.months": " mois", + "cards.subscription.unit.days": " jours", + "cards.subscription.renew-link": "Renouvelez votre abonnement pour ajouter du temps supplémentaire.", + "auth.email": "Adresse courriel", + "auth.username": "Nom d’utilisateur", + "auth.username.or.email": "Nom d’utilisateur ou adresse courriel", + "auth.signin": "Se connecter", + "current.password": "Mot de passe actuel", + "new.password": "Nouveau mot de passe", + "auth.change.password": "Changer le mot de passe", + "confirm.new.password": "Confirmer le nouveau mot de passe", + "auth.password": "Mot de passe", + "auth.have.recovery.phrase": "Avez-vous une phrase de récupération ?", + "auth.forgot.password": "Avez-vous oublié votre mot de passe ou n’en avez-vous pas ?", + "auth.create.account": "Créer un compte", + "auth.missing.username": "Le nom d’utilisateur manque", + "auth.missing.current.password": "Le mot de passe actuel manque", + "auth.missing.new.password": "Le nouveau mot de passe manque", + "auth.missing.confirm.password": "Le mot de passe de confirmation manque", + "invalid_credentials": "Les authentifiants sont invalides", + "yinbi.wallet": "Porte-monnaie Yinbi", + "create.wallet": "Créer un porte-monnaie", + "new.to.yinbi": "Yinbi est-elle une nouveauté pour vous ?", + "setup.wallet": "Oui, configurons un nouveau porte-monnaie", + "web.wallet": "Non, j’ai un porte-monnaie sur le site Web Yin.bi", + "yinbi.next": "Suivante", + "yinbi.amount": "Montant", + "yinbi.missing.address": "Aucune adresse de destination n’a été indiquée", + "yinbi.missing.amount": "Aucun montant n’a été indiqué", + "yinbi.missing.email": "Aucune adresse courriel n’a été indiquée", + "yinbi.missing.username": "Aucun nom d’utilisateur n’a été indiqué", + "yinbi.missing.password": "Aucun mot de passe n’a été indiqué", + "yinbi.invalid.address": "{{destination}} n’est pas une adresse Stellar valide", + "yinbi.send": "Envoyer", + "yinbi.to": "À :", + "yinbi.try_again": "Réessayer ?", + "yinbi.success.transaction": "La transaction est réussie", + "yinbi.failure.transaction": "La transaction a échoué", + "yinbi.confirm.transaction": "Confirmer la transaction", + "yinbi.sent.details": "Vous avez envoyé {{amount}} YNB à {{destination}}", + "yinbi.sent.failure.details": "Votre transaction a échoué pour les raisons suivantes :", + "yinbi.recipient": "Destinataire", + "yinbi.available.send": "{{balance}} YNB sont disponibles pour l’envoi", + "yinbi.wallet.header": "Porte-monnaie", + "yinbi.send.header": "Envoyer des yinbis", + "yinbi.recovery.phrase": "Phrase de récupération Yinbi", + "yinbi.recover.account": "Saisissez ou collez votre phrase de récupération Yinbi afin de récupérer votre porte-monnaie Yinbi et votre compte Lantern", + "yinbi.recovery.desc": "Utilisez cette méthode si vous souhaitez vous connecter à votre compte Lantern et à votre porte-monnaie Yinbi", + "yinbi.redeem.codes": "Encaisser des codes Yinbi en bloc", + "yinbi.obtain.codes": "Les codes Yinbi d’encaissement en bloc peuvent être obtenus sur reseller.lantern.io", + "yinbi.receive.header": "Recevoir des yinbis", + "yinbi.this.is.your.wallet": "Ceci est votre adresse de porte-monnaie Yinbi à laquelle l’on peut vous envoyer des yinbis.", + "yinbi.your.address": "Votre adresse", + "yinbi.no.activity.header": "Aucune activité", + "yinbi.upgrade.pro.button": "Passez à Lantern Pro et obtenez gratuitement des yinbis", + "yinbi.renew.pro.button": "Renouvelez Pro et obtenez gratuitement des yinbis", + "yinbi.wallet.activity_header": "Activité", + "yinbi.wallet.send": "Envoyer", + "yinbi.wallet.receive": "Recevoir", + "yinbi.wallet.balance": "Solde", + "yinbi.wallet.getlantern.pro": "Obtenir Lantern PRO + des yinbis gratuits", + "yinbi.redemption.codes": "Codes d’encaissement de yinbis", + "redeem_codes.title": "Encaisser des codes Yinbi", + "redeem_codes.redeem_button_text": "Encaisser", + "redeem_codes.cancel_button_text": "Annuler", + "redeem_codes.success": "L’opération est réussie", + "redeem_codes.errors.missing_codes": "Aucun code valide n’a été saisi", + "redeem_codes.errors.invalid_codes": "Erreur, veuillez vérifier les codes surlignés. Les codes biffés sont expirés et ne peuvent plus être validés.", + "yinbi.new.account.text": "Une fois que vous aurez envoyé ou reçu des yinbis, vos transactions apparaîtront ici.", + "yinbi.createAccount": "Créer un compte", + "yinbi.confirm.account.text": "Afin de confirmer que vous avez correctement pris la phrase en note, veuillez saisir les mots suivants de votre phrase de récupération", + "create_account.invalid_words.error": "Les mots saisis ne correspondaient pas à ceux de votre phrase de récupération", + "yinbi.recovery_text": "Ceci est la phrase de récupération de votre porte-monnaie Yinbi. Elle constitue la SEULE manière\nde récupérer votre porte-monnaie Yinbi si vous perdiez le mot de passe. Veuillez utiliser un\ngestionnaire de mots de passe ou prendre une copie papier de cette phrase.", + "yinbi.recovery_confirm_text": "Ceci est la phrase de récupération de votre porte-monnaie Yinbi. Elle constitue la SEULE manière de récupérer votre porte-monnaie Yinbi si vous perdiez le mot de passe. Veuillez utiliser un gestionnaire de mots de passe ou prendre une copie papier de cette phrase.", + "yinbi.import.wallet": "Importer un porte-monnaie", + "yinbi.setup.wallet": "Configurer un porte-monnaie", + "yinbi.importWallet": "Importer un porte-monnaie Yin.bi", + "yinbi.import.wallet.continue": "Poursuivre vers votre porte-monnaie", + "yinbi.import.wallet.success": "Le porte-monnaie a été importé avec succès", + "yinbi.wallet.text": "Afin d’accéder au porte-monnaie Yinbi, vous pouvez créer un compte,\nvous connecter ou importer votre porte-monnaie de Yin.bi si vous vous\nêtes inscrits auparavant sur le site Web Yin.bi.", + "yinbi.wallet.pro.text": "Afin d’accéder au porte-monnaie Yinbi, vous pouvez créer un compte, importer votre porte-monnaie de Yin.bi si vous vous y êtes inscrits auparavant.", + "yinbi.recovery_subheader": "Phrase de récupération du porte-monnaie Yinbi", + "yinbi.import_wallet.subheader": "Importer un porte-monnaie Yinbi", + "yinbi.import_wallet.text": "Connectez-vous avec vos identifiants Yin.bi afin de transférer votre porte-monnaie vers Lantern", + "yinbi.import_wallet.success": "Votre porte-monnaie a été importé avec succès. Veuillez ajouter votre adresse courriel afin d’achever l’inscription de votre compte.", + "yinbi.import_wallet.success_subheader": "L’importation est réussie", + "yinbi.import_wallet.button": "Importer un porte-monnaie Yin.bi", + "yinbi.import_wallet.success_button": "Achever l’inscription", + "yinbi.recovery_passphrase.label_text": "Phrase de récupération", + "yinbi.recovery_passphrase.copy_button_text": "Copier", + "terms_of_service.notice": "Avis", + "terms_of_service.i_agree": "J’accepte", + "platinum": "Platinum", + "platinum.one_year": "Tarif pour 1 an", + "platinum.two_years": "Tarif pour 2 ans", + "platinum.save": "Jusqu’à {{savings}} % d’économies !", + "platinum.unlimited": "Données illimitées", + "platinum.logs": "Aucun journaux", + "platinum.devices": "Connectez jusqu’à trois appareils", + "platinum.everything_in_pro": "Tout ce qui est inclus dans Pro", + "platinum.faster_data": "Centres de traitement de données plus rapides", + "platinum.dedicated": "Ligne dédiée", + "platinum.reliability": "Fiabilité accrue", + "platinum.platinum_one_year": "Lantern Platinum pendant 1 an", + "platinum.platinum_two_years": "Lantern Platinum pendant 2 ans", + "platinum.pro_one_year": "Lantern Pro pendant 1 an", + "platinum.pro_two_years": "Lantern Pro pendant 2 ans", + "platinum.total": "Total", + "platinum.free": "Gratuit", + "platinum.credit.days": "+ {{ days }} jours", + "platinum.credit.months": "{{ months }} mois", + "platinum.upgrade": "Passer à Platinum", + "platinum.upgrade_details": "Ligne dédiée + centres de données plus rapides !", + "platinum.unused_time_disclaimer": "Les utilisateurs Pro qui passent à Platinium verront leur abonnement Pro converti indiqué sous forme de temps ci-dessus.", + "p2p.opt_in_description": "Utilisez votre Internet pour aider des personnes à accéder à Internet sans censure", + "p2p.active_sharing_description": "Le partage de votre Internet est activé", + "p2p.dialog.title": "Partager l’accès à Internet", + "p2p.dialog.text.1": "Partagez votre connexion pour aider des personnes disposant d’un accès limité à Internet. En autorisant l’accès à votre Internet, vous ferez partie d’un réseau de volontaires qui permettent à Internet d’être plus ouvert.", + "p2p.dialog.text.2": "Le partage ne compromettra pas votre identité ni votre sécurité. Vous pouvez arrêter de partager votre Internet lorsque vous le souhaitez.", + "p2p.dialog.yes_button": "OUI, COMMENCER LE PARTAGE", + "p2p.dialog.no_button": "ANNULER", + "p2p.banner.introducing": "PRÉSENTATION", + "top_sites.top_sites": "Les premiers sites" +} \ No newline at end of file diff --git a/locale/translation/fr_CA.json b/locale/translation/fr_CA.json new file mode 100644 index 000000000..9465166bf --- /dev/null +++ b/locale/translation/fr_CA.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Montrer Lantern", + "TRAY_QUIT": "Quitter Lantern" +} \ No newline at end of file diff --git a/locale/translation/fr_FR.json b/locale/translation/fr_FR.json new file mode 100644 index 000000000..a71a76233 --- /dev/null +++ b/locale/translation/fr_FR.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Montrer Lanterne", + "TRAY_QUIT": "Quitter Lanterne." +} \ No newline at end of file diff --git a/locale/translation/gl.json b/locale/translation/gl.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/gl.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/he.json b/locale/translation/he.json new file mode 100644 index 000000000..e3ece900e --- /dev/null +++ b/locale/translation/he.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "מעמד: %v", + "TRAY_CONNECT": "התחבר", + "TRAY_DISCONNECT": "התנתק", + "TRAY_SHOW_LANTERN": "הראה את Lantern", + "TRAY_UPGRADE_TO_PRO": "שדרג אל מקצועי", + "TRAY_QUIT": "צא מן Lantern", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "עזרה", + "BACKEND_CLICK_LABEL_GOT_IT": "הבנתי", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "שאלות?", + "about.title": "אודות", + "account.cancel": "בטל חשבון מקצועי", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "כדי לקשר מכשיר זה אל חשבון מקצועי שלך:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "שגיאה בקישור", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "קשר מכשיר זה אל חשבון מקצועי שלך", + "account.freelink.title": "קוד של קישור מכשיר", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "שדרג אל מקצועי", + "account.pro.email": "Email Address:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(מכשיר זה)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "הסר", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "רק מכשיר אחד", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "שגיאה בקישור", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "מכשיר מקושר", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "שיטות תשלום", + "adyen.paymentMethods.storedMethods": "שיטות התשלום שלך", + "adyen.paymentMethods.otherMethods": "בחר שיטה אחרת", + "adyen.paymentMethods.moreMethodsButton": "עוד שיטות תשלום", + "adyen.payButton": "שלם", + "adyen.payButton.formatted": "שלם %@", + "adyen.cancelButton": "בטל", + "adyen.dismissButton": "אישור", + "adyen.storeDetails": "שמור עבור התשלום הבא שלי", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "התשלום שלך מעובד", + "adyen.creditCard.title": "פרטי כרטיס", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "מספר כרטיס", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "מספר כרטיס בלתי תקף", + "adyen.creditCard.expiryDateField.title": "תאריך תפוגה", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "תאריך תפוגה בלתי תקף", + "adyen.creditCard.expiryDateField.month": "חודש", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "שנה", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "וודא את הכרטיס שלך", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC בלתי תקף", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "מספר חשבון (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "מספר חשבון בלתי תקף", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "מספר חשבון (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "אין תוצאות חיפוש", + "adyen.error.title": "שגיאה", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "תשלום נכשל", + "adyen.error.subtitle.refused": "תשלום סורב", + "adyen.error.message.unknown": "שגיאה בלתי ידועה התרחשה", + "adyen.error.message.cannotConnectToInternet": "נכשל בחיבור אל האינטרנט: אנא בדוק את חיבור האינטרנט שלך.", + "adyen.error.message.cannotConnectToHost": "נכשל בחיבור אל שרת התשלומים שלנו.", + "adyen.error.retryButton": "נסה שוב", + "adyen.idealIssuer.selectField.title": "בנק", + "adyen.idealIssuer.selectField.placeholder": "בחר את הבנק שלך", + "adyen.creditCard.success": "תשלום הצליח", + "adyen.oneClick.confirmationAlert.title": "אשר תשלום באמצעות %@", + "adyen.redirect.cannotOpenApp.title": "לא ניתן לפתוח יישום", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "קוד מדינה", + "adyen.telephone.number": "מספר טלפון", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "יש לי מכשיר Lantern מקצועי נוסף", + "authorize.step1.link": "קשר מכשיר זה", + "authorize.step1.or": "או", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "לא קיבלתי דוא\"ל", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "הדוא\"ל שלך", + "authorize.step3.payment_method": "שיטת תשלום", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "כרטיס אשראי", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "חשבון תשלום", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "תאריך רכישה", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "המשך אל מקצועי", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "מכשיר מורשה", + "button.renew": "חַדֵּשׁ", + "button.upgrade": "שדרג", + "button.upgrade_now": "שדרג כעת", + "button.upgrade_to_lantern_pro": "שדרג אל Lantern מקצועי", + "button.copy_your_code": "העתק את הקוד שלך", + "button.try_again": "נסה שוב", + "button.continue": "המשך", + "bullet.click_button": "לחץ על הכפתור למטה", + "bullet.paste_code": "הדבק את הקוד ואת קישור ההורדה בהודעה", + "bullet.send_to_friends": "שלח לחבריך", + "cancel": "בטל", + "confirm": "אשר", + "google_search": "חיפוש Google", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "שגיאה בלתי ידועה", + "err.internal_error": "שגיאה פנימית", + "err.bad_input": "קלט גרוע", + "err.not_authorized": "בלתי מורשה", + "err.user_exists": "משתמש קיים", + "err.no_such_user": "אין משתמש כזה", + "err.user_already_verified": "משתמש מוודא כבר", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "שגיאת תשלום", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "מהירות מהירה יותר", + "feature.faster": "Faster data centers", + "feature.unlimited": "נתונים בלתי מוגבלים", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "ללא פרסומות", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern מקצועי", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "input.email": "דוא\"ל", + "input.your_email": "כתובת הדוא\"ל שלך", + "input.confirm_email": "אשר כתובת דוא\"ל", + "input.enter_email": "הכנס את הדוא\"ל שלך", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "הדוא\"ל שלך", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "אנא נסה שוב", + "issue.select_issue": "אנא בחר סוגייה", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "שגיאה בדיווח על סוגייה", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "איטי", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "אחר", + "languages.title": "שפות", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "קבל גרסת Android", + "nav.about": "אודות", + "nav.account": "ניהול חשבון", + "nav.authorize": "הוסף מכשיר", + "nav.authorized": "מכשיר הורשה", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "שפה", + "nav.lantern": "Lantern", + "nav.mobile": "קבל גרסת טלפון נייד", + "nav.report_issue": "דווח על סוגייה", + "nav.settings": "הגדרות", + "nav.verify": "וידוא חשבון", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "נסה שוב", + "notifications.whatisnew": "What's New?", + "payment.close": "סגור", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "בחר שיטת תשלום", + "payment_methods.alipay": "כרטיס אשראי/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "המשך אל רכישה", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "שנה 1", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/שנה", + "plan.select": "בחר", + "plans.title": "תוכניות Lantern מקצועי", + "plans.lantern_pro": "Lantern מקצועי", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "שיפעול Lantern מקצועי", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "המשך אל תשלום", + "promotion.loading": "טוען...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "שלם {{amount}}", + "promotion.select": "בחר", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "המשך אל מקצועי", + "promotion.voucher.hint": "קוד שיפעול", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "הבא", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "תיעוד", + "replica.other": "אחר", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "הבא", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "סגור", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "בטל", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "להורדה", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "יפוי כוח בכל התעבורה", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "הגדרות", + "settings.http_proxy": "יפוי כוח HTTP(S):", + "settings.socks_proxy": "יפוי כוח SOCKS:", + "settings.caution": "זהירות:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "מיקום שרת", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "מתחבר...", + "status.no_internet": "Off", + "status.no_internet_connection": "אין חיבור אינטרנט", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "קוד של קישור מכשיר", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "הגש", + "verify.title": "וידוא חשבון", + "welcomeToPro.continue": "המשך אל מקצועי", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Thanks for your purchase of Lantern Pro!", + "welcomeToPro.title": "ברוך הבא אל Lantern מקצועי", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "קבל עזרה", + "freeProCredits.title": "הזמן חברים", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "בלתי ידוע", + "cards.serverLocation.description": "מיקום ממוטב של שרת", + "cards.serverLocation.description-free": "מיקום שרת", + "cards.serverLocation.description-upgrade": "שדרג אל שרתים מהירים יותר", + "cards.serverLocation.title": "מיקום נוכחי:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "שידרוגי HTTPS", + "cards.httpsUpgrades.title": "שידרוגי HTTPS: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "פרסומות נחסמו", + "cards.adsBlocked.title": "פרסומות חסומות: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "שימוש בנתונים", + "cards.dataUsage.upgrade": "שדרג כעת", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "מינוי מקצועי", + "cards.subscription.renew": "חַדֵּשׁ", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "חו'", + "cards.subscription.unit.days": "ימים", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/hi.json b/locale/translation/hi.json new file mode 100644 index 000000000..c6f4ebe9c --- /dev/null +++ b/locale/translation/hi.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "लैंटर्न", + "pro": "प्रो", + "BEAM": "बीम", + "TRAY_STATUS": "स्थिति: %v", + "TRAY_CONNECT": "कनेक्ट", + "TRAY_DISCONNECT": "डिस्कनेक्ट", + "TRAY_SHOW": "दिखाएं %s", + "TRAY_UPGRADE_TO_PRO": "प्रो में अपग्रेड", + "TRAY_QUIT": "छोड़ें %s", + "BACKEND_DATA_TITLE": "कोई और अधिक उच्च गति डेटा", + "BACKEND_DATA_MESSAGE": "प्रो करने के लिए अपग्रेड करें पूरी गति से %s का उपयोग कर रखने के लिए!", + "BACKEND_DATA_PERCENT_TITLE": "अपनी %s डाटा %स पहुँचा", + "BACKEND_DATA_PERCENT_MESSAGE": "आपने हाई स्पीड डाटा का %sमें से %s का इस्तेमाल किया है. अभी अपग्रेड करें!", + "BACKEND_CLICK_LABEL": "खोलें", + "BACKEND_CLICK_LABEL_OPEN": "खोलें", + "BACKEND_CLICK_LABEL_HELP": "मदद", + "BACKEND_CLICK_LABEL_GOT_IT": "समझ गया", + "BACKEND_AUTOUPDATED_TITLE": "%s से %s तक अपडेट करें", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s डाउनलोड किया गया है। कृपया इसे उपयोग करने के लिए %s को पुनः आरंभ करें।", + "BACKEND_MITM_INSTALL_CERT": "%s प्रदर्शन सुधारने के लिए एक कस्टम प्रमाणपत्र स्थापित करना चाहता है", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "कृपया %v को अपने सिस्टम में बदलाव करने की अनुमति दें", + "BACKEND_ALERT_TITLE": "गंभीर चेतावनी के लिए आपका ध्यान चाहिए", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "डायग्नोस्टिक टूल इंस्टॉल करने के लिए% s को आपकी अनुमति की आवश्यकता होती है। यह हमें आपके% s अनुभव को बेहतर बनाने में मदद करेगा।", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "कॉन्फ़िगरेशन सेव नहीं किया जा सका", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "ऐप्लिकेशन का कॉन्फ़िगरेशन सेव नहीं किया जा सका. %s इस बात की गारंटी नहीं दे सकते कि ट्रैफ़िक को सही ढंग से प्रॉक्सी किया जाएगा.", + "about.content": "लालटेन एक आवेदन है कि खुले इंटरनेट से तेज, विश्वसनीय और सुरक्षित उपयोग बचाता है।", + "app.error": "कुछ गड़बड़ी हुई!", + "about.faq": "लालटेन पूछे जाने वाले प्रश्न पढ़ें", + "about.open": "सभी के लिए खुला इंटरनेट", + "about.questions": "प्रशन?", + "about.title": "बारे में", + "account.add.password": "अकाउंट पासवर्ड जोड़ें", + "account.agree.terms": "मैं समझता/समझती हूं कि मेरे पासवर्ड खोने का मतलब है अकाउंट एक्सेस खो देना. Lantern आपके पासवर्ड को वापस पाने में सहायता नहीं कर सकता.", + "account.agree.terms.error": "पहले शर्तों से सहमत होने चाहिए", + "account.cancel": "रद्द प्रो अकाउंट", + "account.created": "अकाउंट बन गया!", + "account.create.pro.account.header": "Pro अकाउंट बनाएं", + "account.create.pro.account.text": "Lantern उपयोगकर्ता अकाउंट को संभालने के तरीके को बदल रहा है. अब से Pro यूज़र्स को यूज़रनेम और पासवर्ड बनाना होगा. इन क्रेडेंशियल्स का उपयोग अन्य डिवाइस में साइन इन करने और नई सुविधाओं तक पहुंच प्रदान करने के लिए किया जाएगा.", + "account.have.a.account": "अकाउंट है?", + "account.link.username.pro": "यूज़र नेम को Pro अकाउंट से लिंक करें", + "account.recovery": "खाता रिकवरी", + "account.recovery.link.device": "डिवाइस को लिंक करें", + "account.recovery.device.code": "डिवाइस जोड़ने संहिता", + "account.recovery.device.enter.code": "डिवाइस लिंकिंग पिन डालें या पेस्ट करें", + "account.recovery.device.instructions.header": "आपके प्रो खाते में इस डिवाइस लिंक करने के लिए:", + "account.recovery.device.instructions.step.one": "1. अपने डेस्कटॉप प्रो डिवाइस पर या आप मोबाइल प्रो डिवाइस पर मेनू से अकाउंट मैनेजमेंट स्क्रीन आइटम से ‘एक डिवाइस लिंक करें’ विकल्प चुनें।", + "account.recovery.device.instructions.step.two": "2. डिवाइस कोड जोड़ने दर्ज करें, और सबमिट करें।", + "account.recovery.device.instructions.part.three": "*सुनिश्चित करें कि दोनों उपकरण लालटेन के सबसे हाल के संस्करण को चला रहे हैं", + "account.recovery.method": "कृपया अपने अकाउंट को बहाल करने के लिए एक विधि चुनें", + "account.recovery.send.email": "ईमेल भेजें", + "account.recovery.submit": "जमा करें", + "account.recovery.success": "लिंकिंग सफल!", + "account.pro_management": "प्रो खाता प्रबंधन", + "account.free_management": "खाता प्रबंधन", + "account.free.cap": "{{mb}} फ़्री डेटा बचा है. {{रिसेट}} पर रिसेट करें", + "account.free.cap.upgrade": "असीमित उच्च गति डेटा के लिए प्रो पर अपग्रेड", + "account.freelink.validFor": "%s के लिए मान्य", + "account.freelink.desc": "आपके प्रो अकाउंट में इस डिवाइस को उपयोग करने के लिए:", + "account.freelink.step1": "1. अपने मोबाइल प्रो डिवाइस पर मेनू से ‘एक डिवाइस लिंक करें’ विकल्प चुनें।", + "account.freelink.step2": "2. डिवाइस कोड जोड़ने दर्ज करें, और सबमिट करें।", + "account.freelink.reminder": "* सुनिश्चित करें कि दोनों उपकरण लालटेन के सबसे हाल के संस्करण को चला रहे हैं", + "account.freelink.errorTitle": "त्रुटि जोड़ने", + "account.freelink.errorText": "क्या आप वाकई अपने डिवाइस पर प्रो कोड दर्ज की गई हैं?", + "account.freelink.headerDesc": "आपके प्रो खाते में इस डिवाइस लिंक", + "account.freelink.title": "डिवाइस जोड़ने संहिता", + "account.pro.charge": "आपका खाता स्वत: ही आपके बिलिंग चक्र के अंत में लालटेन प्रो का एक और साल के लिए शुल्क लिया जाएगा।", + "account.upgrade_pro": "प्रो में अपग्रेड", + "account.upgrade": "अपग्रेड", + "account.upgrade_platinum": "प्लैटिनम में अपग्रेड करें", + "account.create": "अकाउंट बनाएं", + "account.email": "ईमेल", + "account.confirm.password": "पासवर्ड की पुष्टि करें", + "account.password": "पासवर्ड", + "account.pro.email": "ईमेल:", + "account.pro.expiration": "प्रो अकाउंट समाप्ति", + "account.platinum.expiration": "प्लैटिनम खाता समय सीमा समाप्ति", + "account.pro.expired": "आपका प्रो अकाउंट समाप्त हो गया है। असीमित मासिक डेटा के लिए अब नवीनीकृत करें।", + "account.pro.expiry": "आपका प्रो अकाउंट %s पर %s दिनों में समाप्त हो रहा है।", + "account.pro.bonusMonths": "इसमें आपके {{bonusMonths}} बोनस महीने शामिल हैं!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "लॉग आउट", + "account.pro.removedevice": "हटाना", + "account.pro.devices": "लालटेन प्रो डिवाइसेस (3 तक)", + "account.pro.device.confirm.title": "डिवाइस प्राधिकरण रद्द", + "account.pro.device.confirm": "क्या आप वाकई '{{डिवाइस}}' को अपने Latern Pro अकाउंट से हटाना चाहते हैं?", + "account.pro.device.one.title": "केवल एक डिवाइस", + "account.pro.device.one": "क्षमा करें, लेकिन आप अपने पिछले अधिकृत डिवाइस नहीं निकाल सकते।", + "account.pro.linkingcode": "डिवाइस को लिंक करने कोड:", + "account.pro.renew": "Pro खाता नवीनीकृत करें", + "account.platinum.renew": "प्लैटिनम खाता रिन्‍यू करें", + "account.pro.renew_CN": "नवीकरण", + "account.prolink.errorTitle": "त्रुटि जोड़ने", + "account.prolink.errorText": "क्या आप वाकई अपने अन्य डिवाइस से सही ढंग से कोड कॉपी कर रहे हैं?", + "account.prolink.successTitle": "डिवाइस लिंक्ड", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "account.signin": "साइन इन करें", + "account.signout": "साइन आउट करें", + "account.submit": "जमा करें", + "account.username": "उपयोगकर्ता का नाम", + "account.switch.to.register": "अकाउंट बनाने के लिए स्विच करें", + "account.switch.to.signin": "साइन इन करने के लिए स्विच करें", + "account.invalid.username": "यूज़रनेम अमान्य है", + "account.invalid.email": "ईमेल अमान्य है", + "account.password.mismatch": "कंफर्म किया गया पासवर्ड, पासवर्ड से मेल नहीं खाता", + "account.password.short": "पासवर्ड काफ़ी छोटा है", + "account.password.lowercase": "पासवर्ड में कम से कम एक लोअरकेस अक्षर होना चाहिए", + "account.password.uppercase": "पासवर्ड में कम से कम एक अपरकेस अक्षर होना चाहिए", + "account.password.number": "पासवर्ड में कम से कम एक नंबर होना चाहिए", + "account.password.compromised": "पासवर्ड छेड़छाड़ किए गए पासवर्ड की सूची में दिखाई देता है", + "modal.register.free.header": "Yinbi वॉलेट तक पहुंचने के लिए रजिस्टर या साइन इन करें", + "modal.register.pro.header": "Yinbi वॉलेट तक पहुंचने के लिए अकाउंट पासवर्ड शामिल करैं", + "modal.register.pro.signin.header": "Yinbi वॉलेट तक पहुंचने के लिए साइन इन करें", + "modal.register.free.text": "Yinbi वॉलेट का उपयोग करने के लिए आपके पास एक लालटेन अकाउंट होना चाहिए, कृपया रजिस्टर करें\nया जारी रखने के लिए साइन इन करें।", + "modal.register.pro.text": "Yinbi वॉलेट का उपयोग करने के लिए आपको अपने लालटेन अकाउंट में एक पासवर्ड जोड़ना होगा।", + "modal.register.pro.signin.text": "Yinbi वॉलेट का उपयोग करने के लिए आपको अपने Lantern अकाउंट में साइन इन करना होगा", + "adyen.paymentMethods.title": "भुगतान के तरीके", + "adyen.paymentMethods.storedMethods": "आपके भुगतान के तरीके", + "adyen.paymentMethods.otherMethods": "अन्य तरीके का चयन करें", + "adyen.paymentMethods.moreMethodsButton": "अधिक भुगतान के तरीके", + "adyen.payButton": "वेतन", + "adyen.payButton.formatted": "वेतन %@", + "adyen.cancelButton": "रद्द करना", + "adyen.dismissButton": "ठीक है", + "adyen.storeDetails": "मेरे अगले भुगतान के लिए सहेजें", + "adyen.payment.redirecting": "आपको पुनर्निर्देशित किया जाएगा", + "adyen.payment.processing": "आपका भुगतान संसाधित किया जा रहा है", + "adyen.creditCard.title": "कार्ड के विवरण", + "adyen.creditCard.holderName": "कार्ड धारक का नाम", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "कार्ड नंबर", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "अवैध कार्ड संख्या", + "adyen.creditCard.expiryDateField.title": "समाप्ति तिथि", + "adyen.creditCard.expiryDateField.placeholder": "महीना साल", + "adyen.creditCard.expiryDateField.invalid": "अमान्य समाप्ति तिथि", + "adyen.creditCard.expiryDateField.month": "महीना", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "Y Y", + "adyen.creditCard.expiryDateField.year": "साल", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "किश्तों की संख्या", + "adyen.creditCard.storeDetailsButton": "मेरे अगले भुगतान के लिए इस कार्ड को याद रखें", + "adyen.creditCard.oneClickVerification.title": "अपना कार्ड सत्यापित करें", + "adyen.creditCard.oneClickVerification.message": "कृपया %@ के लिए CVC कोड दर्ज करें", + "adyen.creditCard.oneClickVerification.invalidInput.title": "अमान्य CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "कृपया जारी रखने के लिए एक मान्य CVC दर्ज करें।", + "adyen.sepaDirectDebit.ibanField.title": "अकाउंट नंबर (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "अमान्य अकाउंट नंबर", + "adyen.sepaDirectDebit.nameField.title": "धारक का नाम", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "मैं सहमत हूं कि नीचे दी गई राशि मेरे बैंक अकाउंट से डेबिट की जाएगी।", + "adyen.sepa.ownerName": "धारक का नाम", + "adyen.sepa.ibanNumber": "अकाउंट नंबर (IBAN)", + "adyen.giropay.searchField.placeholder": "बैंक का नाम / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "कम से कम 3 अक्षर", + "adyen.giropay.noResults": "कोई खोज परिणाम नहीं", + "adyen.error.title": "त्रुटि", + "adyen.error.subtitle.redirect": "पुनर्निर्देशन विफल रहा", + "adyen.error.subtitle.payment": "भुगतान असफल हुआ", + "adyen.error.subtitle.refused": "भुगतान से इनकार कर दिया", + "adyen.error.message.unknown": "एक अज्ञात ग़लती हुई", + "adyen.error.message.cannotConnectToInternet": "इंटरनेट से कनेक्ट करने में विफल: कृपया अपना इंटरनेट कनेक्शन चेक करैं।", + "adyen.error.message.cannotConnectToHost": "हमारे भुगतान सर्वर से कनेक्ट करने में विफल।", + "adyen.error.retryButton": "पुनः प्रयास करें", + "adyen.idealIssuer.selectField.title": "बैंक", + "adyen.idealIssuer.selectField.placeholder": "अपना बैंक चुनें", + "adyen.creditCard.success": "भुगतान सफल", + "adyen.oneClick.confirmationAlert.title": "%@ भुगतान की पुष्टि करें", + "adyen.redirect.cannotOpenApp.title": "एप नहीं खोल सक्ते", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "यह ऐप खोला नहीं जा सका क्योंकि यह इस डिवाइस पर इंस्टॉल नहीं है।", + "adyen.holderName": "कार्ड धारक का नाम", + "adyen.countryCode": "देश कोड", + "adyen.telephone.number": "टेलीफोन नंबर", + "android.download": "Lantern Android", + "android.download.title": "Lantern Android डाउनलोड करें", + "authorize.title": "प्रो के लिए डिवाइस अधिकृत करें", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "डिवाइस लिंकिंग", + "authorize.step1.email_linking": "ईमेल लिंकिंग", + "authorize.device_linking_explanation": "यदि आप किसी अन्य डिवाइस में साइन इन हैं और इसे अपने पास रखते हैं तो इस विधि का उपयोग करें", + "authorize.device_email_explanation": "यदि आप अपने ईमेल पर भेजा गया डिवाइस लिंकिंग पिन चाहते हैं तो इस विधि का उपयोग करें", + "authorize.link_device": "डिवाइस को लिंक करें", + "authorize.step1.choose": "कृपया अपने अकाउंट को लिंक करने के लिए एक विधि चुनें", + "authorize.step1.or": "या", + "authorize.step1.recover": "मैं अपनी लालटेन प्रो खाते को ठीक करने की जरूरत है", + "authorize.step1.start": "वसूली शुरू", + "authorize.step1.no_mail": "अपना ईमेल पता याद नहीं है?", + "authorize.step1.description": "अपना ईमेल दर्ज करें और यदि अकाउंट मौजूद है तो हम डिवाइस लिंकिंग कोड के साथ एक ईमेल भेजेंगे", + "authorize.step2b.enter_code": "अपने खाता पुनर्प्राप्ति कोड दर्ज", + "authorize.step2b.code": "खाता रिकवरी कोड", + "authorize.step2b.instruction": "यदि यह अकाउंट मौजूद है, तो पुनर्प्राप्ति कोड वाला एक ईमेल {{email}} को भेजा गया है. इस ईमेल को आने में कई घंटे लग सकते हैं. अगर आपको यह नहीं मिला तो कृपया अपना स्पैम फ़ोल्डर देखें.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "खाता रिकवरी", + "authorize.step3.no_email": "उफ़! हम दिक्कत यह है कि ई-मेल पते खोज कर रहे हैं। हमें अपने खाते का पता लगाने में मदद करने के लिए नीचे और अधिक जानकारी प्रदान करें।", + "authorize.step3.no_code_received": "वसूली ईमेल प्राप्त करने में समस्या हो रही है? नीचे दी गई जानकारी दर्ज करें और हम 48 घंटे के भीतर संपर्क करेंगे।", + "authorize.step3.your_email": "तुम्हारा ईमेल", + "authorize.step3.payment_method": "भुगतान का तरीका", + "authorize.step3.payment_method_hint": "भुगतान विधि प्रो पाने के लिए इस्तेमाल का चयन करें", + "authorize.step3.credit_card": "क्रेडिट कार्ड", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "एंड्रॉयड वेतन", + "authorize.step3.by_referral": "एक दोस्त से चर्चा करते हुए प्रो प्राप्त", + "authorize.step3.payment_account": "भुगतान खाता", + "authorize.step3.payment_account_hint": "अपने Alipay खाते की जानकारी दर्ज करें", + "authorize.step3.referral_code": "आपकी सिफ़ारिश के कोड", + "authorize.step3.purchase_date": "खरीद की तारीख", + "authorize.step3.note": "किसी भी अन्य जानकारी हमें अपने खाते का पता लगाने में मदद मिल सकती है कि कृपया ध्यान दें।", + "authorize.step4.title": "खाता पुनर्प्राप्ति में प्रगति", + "authorize.step4.text1": "धन्यवाद! हम आपके खाते वसूली अनुरोध मिला है।", + "authorize.step4.text2": "कृपया अपने 48 घंटे के प्रो खाते की जानकारी को पुन: प्राप्त करने के लिए अनुमति देते हैं।", + "authorize.step4.text3": "हम पिछले स्क्रीन पर दर्ज ईमेल पते पर जानकारी भेज देंगे।", + "authorized.continue": "प्रो करने के लिए जारी", + "authorized.continue.lantern": "Lantern पर जारी रखें", + "authorized.text": "इस डिवाइस को अपनी लालटेन प्रो खाते का उपयोग करने के लिए अधिकृत नहीं है!", + "authorized.title": "डिवाइस अधिकृत", + "button.account": "अकाउंट", + "button.renew": "नवीनीकृत करें", + "button.upgrade": "अपग्रेड", + "button.upgrade_now": "अभी अपग्रेड करें", + "button.upgrade_to_lantern_pro": "लालटेन के लिए प्रो उन्नयन", + "button.copy_your_code": "अपने कोड को कॉपी", + "button.try_again": "पुनः प्रयास करें", + "button.continue": "जारी रखें", + "button.continue_to": "{{planType}} पर जारी रखें", + "bullet.click_button": "नीचे बटन को क्लिक करें", + "bullet.paste_code": "एक संदेश में कोड और डाउनलोड लिंक पेस्ट करें", + "bullet.send_to_friends": "अपने दोस्तों को भेज", + "cancel": "रद्द करना", + "confirm": "पुष्टि करें", + "norecoveryyinbi": "*Yinbi वॉलेट को पुनर्प्राप्त नहीं करता है", + "email.recovery.check.email": "रिकवरी कोड वाले संदेश के लिए अपना ईमेल देखें", + "email.recovery.code.label": "रिकवरी कोड डालें या पेस्ट करें", + "email.recovery.no.code": "कोड नहीं मिला?", + "email.recovery.text": "अपना ईमेल दर्ज करें, और हम आपको अपना पासवर्ड रीसेट करने के लिए एक कोड भेजेंगे।\nयदि आपके पास Yinbi वॉलेट है, तो यह आपके Yinbi वॉलेट को पुनर्प्राप्त नहीं करेगा, अपने यिनबी वॉलेट को पुनर्प्राप्त करने के लिए अपने Yinbi रिकवरी वाक्यांश दर्ज करें।", + "email.recovery.desc": "यदि आप अपने ईमेल पर एक पुनर्प्राप्ति कोड भेजना चाहते हैं, तो इस विधि का उपयोग करें", + "device.recovery.desc": "यदि आप किसी अन्य डिवाइस में साइन इन हैं और आपके पास हैं, तो इस विधि का उपयोग करें", + "google_search": "Google खोज", + "giveaway.upgrade": "आज का निःशुल्क वितरण प्राप्त करने के लिए नवीनीकरण करें", + "giveaway.title_released_today": "{{formattedTokens}} YNB आज रिलीज़ किया जा रहा है", + "giveaway.what_is_it": "Yinbi Giveaway क्या है?", + "giveaway.description1": "Yinbi फाउंडेशन, लालटेन प्रो के खरीदारों को विशेष रूप से 888 बिलियन YNB क्रिप्टोकरेंसी दे रहा है।", + "giveaway.description2": "YNB को हर दिन के अंत में वितरित किया जाएगा, उस दिन जारी Yinbi की मात्रा के आधार पर, अपग्रेड/रिन्यू करने वाले लोगों की संख्या, और आपके द्वारा खरीदे जाने वाले वर्षों या अकाउंट की संख्या के आधार पर .YNB को सीधे आपके Yinbi वॉलेट में Lantern में जमा किया जाएगा.", + "giveaway.learn_more": "और अधिक जानें", + "link_device": "पहले से ही एक प्रो अकाउंट है? डिवाइस लिंक करें", + "email.recovery": "ईमेल पुनर्प्राप्ति", + "email_taken": "ईमेल पहले से ही पंजीकृत है", + "username_taken": "उपयोगकर्ता नाम पहले से ही पंजीकृत है", + "err.unknown_error": "अज्ञात त्रुटि", + "err.internal_error": "आंतरिक त्रुटि", + "err.bad_input": "बुरा इनपुट", + "err.not_authorized": "Not authorized", + "err.user_exists": "उपयोगकर्ता मौजूद", + "err.no_such_user": "ऐसा कोई उपयोगकर्ता नहीं है", + "err.user_already_verified": "उपयोगकर्ता पहले से सत्यापित", + "err.invalid_user_verification": "अमान्य उपयोगकर्ता सत्यापन", + "err.user_unverified": "उपयोगकर्ता असत्यापित", + "err.operation_temporarily_unavailable": "ऑपरेशन अस्थायी रूप से अनुपलब्ध", + "err.wrong_or_inexistent_plan": "गलत या inexistent योजना", + "err.user_has_active_subscription": "उपयोगकर्ता सक्रिय सदस्यता है", + "err.payment_error": "भुगतान त्रुटि", + "err.no_codes_left": "कोई रेफरल कोड छोड़ा", + "err.wrong_code": "गलत रेफरल कोड", + "err.redeeming_own_code_not_allowed": "अपने आप के redeeming कोड अनुमति नहीं है", + "err.wrong_charge_id": "गलत प्रभारी आईडी", + "err.wrong_link_code": "ग़लत लिंक कोड", + "err.invalid_credentials": "आपूर्ति की गई उपयोगकर्ता क्रेडेंशियल्स अमान्य थे", + "footer.reseller": "पैसा बनाएं! एक लालटेन प्रो पुनर्विक्रेता बनें। यहाँ क्लिक करें", + "footer.reseller.email_subject": "मुझे लालटेन पुनर्विक्रेता कार्यक्रम के बारे में बताएं!", + "footer.reseller.email_body": "जब आप एक लालटेन पुनर्विक्रेता बन जाते हैं तो आपके पास लालटेन प्रो सदस्यता की प्रत्येक बिक्री पर 25% तक बनाने का अवसर होगा। हमें थोड़ा बताएं कि आप नीचे पुनर्विक्रेता क्यों बनना चाहते हैं।", + "feature.faster_speed": "तेज गति", + "feature.faster": "तेज़ डेटा सेंटर्स", + "feature.unlimited": "असीमित डेटा", + "feature.nologs": "कोई लॉग नहीं", + "feature.devices": "3 डिवाइस तक कनेक्ट करें", + "feature.noads": "कोई विज्ञापन नहीं", + "feature.yinbi.tooltip": "Yinbi फाउंडेशन, Lantern Pro के खरीदारों को विशेष रूप से Lantern के माध्यम से 888 बिलियन YNB क्रिप्टोकरेंसी दे रहा है। YNB को हर दिन के अंत में, उस दिन जारी की गई Yinbi की मात्रा, उन लोगों की संख्या जो अपग्रेड/रिन्यू करते हैं, और आपके द्वारा ख़रीदे जाने वाले वर्षों या खातों की संख्या के आधार पर वितरित किया जाएगा। YNB को सीधे Lantern में आपके Yinbi वॉलेट में जमा किया जाएगा!", + "feature.antiblock": "अवरोध करनेवाला", + "feature.data_center": "बेहतर डाटा सेंटर्स", + "feature.free_yinbi": "मुफ्त Yinbi क्रिप्टोक्यूरेंसी!", + "free.title": "लालटेन प्रो", + "free.desc": "तेज। मजबूत। असीमित। सुरक्षित।", + "free.link_account": "पहले से ही एक प्रो खाता है? अपना खाता लिंक करें।", + "home.get_lantern_pro": "लालटेन प्रो प्राप्त करें", + "home.get_lantern_platinum": "अपना प्‍लान अपग्रेड करें", + "home.welcome_popup_subheader": "नए Lantern में आपका स्वागत है!", + "home.welcome_popup_content_1": "हम Lantern को अपडेट करने और नई सुविधाओं को जोड़ने के लिए कड़ी मेहनत कर रहे हैं.", + "home.welcome_popup_content_2": "हमारे नए UI में, आपको एक सर्च बार मिलेगा जो आपको Lantern नेटवर्क पर शेयर की गई फ़ाइलों को खोजने देता है. आप खुद भी एक फ़ाइल पोस्ट करके कंटेंट में अपना योगदान दे सकते हैं. यह एक बीटा सुविधा है, इसलिए इसे आज़माएं और हमें बताएं कि आपकी क्या राय है, हम आपके फ़ीडबैक के आधार पर सुधार करना जारी रखेंगे.", + "home.welcome_popup_button": "इसे आज़माएँ", + "input.email": "ईमेल", + "input.your_email": "आपका ईमेल पता", + "input.confirm_email": "ईमेल पते की पुष्टि करें", + "input.enter_email": "अपना ईमेल दर्ज करें", + "input.use_valid_email": "एक मान्य ईमेल पता लिखें", + "input.email_not_match": "ईमेल फ़ील्ड मेल नहीं खाते हैं", + "input.existing_email": "मौजूदा ईमेल", + "issue.your_email": "तुम्हारा ईमेल", + "issue.attach_image_failure": "छवि संलग्न नहीं कर सकता", + "issue.try_again": "कृपया पुन: प्रयास करें", + "issue.select_issue": "कृपया एक मुद्दा चयन", + "issue.selected_issue": "समस्या का चयन करें", + "issue.select_issue_hint": "ड्रॉपडाउन मेनू से किसी समस्या का चयन करें", + "issue.note": "अपनी समस्या का वर्णन करें", + "issue.description": "समस्या का विवरण", + "issue.error": "समस्या की रिपोर्ट करने में त्रुटि", + "issue.submit": "रिपोर्ट भेजो", + "issue.report_screenshot": "छवि खींचें या स्क्रीनशॉट अपलोड करने के लिए क्लिक करें", + "issue.reported": "आपकी समस्या की रिपोर्ट करने के लिए धन्यवाद, जैसे ही हम सक्षम होंगे हम आपको ईमेल के माध्यम से वापस भेज देंगे", + "issue.report_sent": "सूचना भेजी गई", + "issue.type.no_access": "अवरुद्ध साइटों तक नहीं पहुँच सकते", + "issue.type.payment_fail": "भुगतान पूरा नहीं कर सकता", + "issue.type.cannot_login": "लॉग इन नहीं कर सकता", + "issue.type.always_spinning": "स्पिनर स्पिन को अंतहीन रूप से लोड कर रहे हैं", + "issue.type.slow": "धीरे", + "issue.type.cannot_link_device": "डिवाइस को लिंक नहीं कर सकता", + "issue.type.crashes": "लालटेन दुर्घटनाग्रस्त", + "issue.type.other": "अन्य", + "languages.title": "बोली", + "lantern.email": "लालटेन ईमेल", + "mobile.link": "अपने Android डिवाइस पर लालटेन डाउनलोड करने के लिए लिंक का उपयोग करें:", + "mobile.title": "Android संस्करण प्राप्त करें", + "nav.about": "बारे में", + "nav.account": "खाता प्रबंधन", + "nav.authorize": "डिवाइस जोडे", + "nav.authorized": "डिवाइस अधिकृत", + "nav.unauthorized_link": "प्रो के लिए डिवाइस अधिकृत करें", + "nav.language": "भाषा", + "nav.lantern": "लैंटर्न", + "nav.mobile": "मोबाइल संस्करण प्राप्त", + "nav.report_issue": "मामले की रिपोर्ट करें", + "nav.settings": "कोई और अधिक उच्च गति लालटेन डेटा", + "nav.support": "सहायता", + "nav.verify": "खाता सत्यापन", + "nav.yinbi": "यिनबी मोचन", + "nav.home": "होम", + "nav.discover": "डिस्कवर", + "nav.wallet": "वॉलेट", + "nav.yinbi_wallet": "Yinbi वॉलेट", + "notification.retry": "पुन: प्रयास करें", + "notifications": "नोटिफ़िकेशन", + "notifications.whatisnew": "नया क्या है?", + "password.change": "पासवर्ड बदलें", + "password.changed": "पासवर्ड बदला गया", + "continue.to.pro": "प्रो करने के लिए जारी", + "username": "उपयोगकर्ता नाम", + "password.new": "नया पासवर्ड", + "password.requirements": "
पासवर्ड में निम्नलिखित शामिल होना चाहिए:
  • 8 या अधिक वर्ण
  • 1 लोअरकेस अक्षर
  • 1 बड़ा अक्षर
  • कम से कम 1 नंबर
  • समझौता किए गए पासवर्ड की सूची पर नहीं
", + "password.reset": "पासवर्ड रीसेट करें", + "paxful.buy": "खरीदें", + "paxful.payment": "भुगतान का तरीका", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "टेथर (USDT)", + "paxful.wallet": "ऑनलाइन वॉलेट", + "paxful.bank": "बैंक ट्रांसफर", + "paxful.gamer_card": "गेम कार्ड", + "paxful.gift_card": "गिफ़्ट कार्ड", + "paxful.cash": "कैश पेमेंट", + "paxful.digital_currency": "डिजिटल करेंसी", + "paxful.button": "सबसे अच्छा सौदा दिखाएँ", + "payment.close": "बंद करे", + "payment.redirectErrorTitle": "पेमेंट सर्वर से कनेक्ट करने में गड़बड़ी हुई", + "payment.redirectErrorText": "हम फ़िलहाल इस समस्या को हल करने पर काम कर रहे हैं. कृपया बाद में फिर से देखें.", + "payment.wait_for_pro": "लालटेन प्रो की अपनी खरीद के लिए धन्यवाद! कृपया अपने लालटेन के स्वचालित रूप से प्रो बनने के लिए एक क्षण प्रतीक्षा करें।", + "payment.moreOptions": "अन्य विकल्प", + "payment.fewerOptions": "कम विकल्प", + "payment_methods.select_name": "भुगतान का तरीका चुनें", + "payment_methods.alipay": "क्रेडिट कार्ड / Alipay", + "payment_methods.shetab": "फास्ट वर्ल्ड पे (शेटाब)", + "payment_methods.shetab.details.header": "लालटेन प्रो खरीदने के लिए", + "payment_methods.shetab.details.body": "जब आप क्लिक करना जारी रखेंगे तो आप भुगतान को पूरा करने और अपना सक्रियण कोड एकत्र करने के लिए एक बाहरी साइट पर पुनर्निर्देशित हो जाएंगे।", + "payment_methods.shetab.details.tutorial_header": "फ़ारसी ट्यूटोरियल", + "payment_methods.shetab.details.purchase_voucher_button": "खरीद करने के लिए जारी रखें", + "payment_methods.shetab.details.input_code_button": "इनपुट एक्टिवेशन कोड", + "plan.step1": "कदम 1", + "plan.apply": "अप्लाई", + "plan.step2": "कदम 2", + "plan.most_popular": "सबसे लोकप्रिय!", + "plan.step3": "कदम 3", + "plan.choose_plan": "योजना चुनें", + "plan.enter_email": "ईमेल दर्ज करें", + "plan.choose_method": "भुगतान का तरीका चुनें", + "plan.bestValue": "सबसे अच्छा सौदा!", + "plan.per_month": "प्रति माह", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 साल", + "plan.add_referral": "रेफरल कोड जोड़ें", + "plan.years": "{{सालों}} साल की योजना", + "plan.desc": "{{दाम}} एक बार बिल भेजा गया", + "plan.bonus_months": "+ {{बोनसमहीने}} महीने", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "चुनते हैं", + "plan.two_year": "दो वर्ष", + "plan.one_year": "एक वर्ष", + "plan.savings": "{{formattedDiscount}} % बचाएं", + "plans.title": "लालटेन प्रो योजनाओं", + "plans.lantern_pro": "लालटेन प्रो", + "plans.platforms": "Windows, Android, Mac, Ubuntu के लिए।", + "plans.from_reseller": "क्या आपके पास Lantern Pro एक्टिवेशन कोड है? यहाँ क्लिक करें।", + "plans.with_voucher_code": "एक सक्रियण कोड है? यहाँ क्लिक करें।", + "pro.apply": "आपका क्रेडिट अगले बिलिंग चक्र में अपने खाते में लागू किया जाएगा।", + "pro.title": "मित्रों को आमंत्रित मिलता है, मुक्त करने के लिए अधिक समर्थक", + "pro.subtitle": "अपने दोस्त को दो साल की योजना खरीदता है तो आप प्रत्येक प्रो के 3 अतिरिक्त महीने, एक साल की योजना आप प्रत्येक 1 महीने मुक्त हो जाता है।", + "pro.share": "दोस्तों के साथ अपने कोड साझा करें अधिक क्रेडिट कमाई शुरू करने के लिए!", + "promotion.title": "लालटेन प्रो चेकआउट", + "promotion.title.activation": "लालटेन प्रो एक्टिवेशन", + "promotion.enter_and_confirm_email": "कृपया अपना ईमेल पता दर्ज करें और पुष्टि करें", + "promotion.code.hint": "अपने मित्र का रेफरल कोड दर्ज करें (वैकल्पिक)", + "promotion.code.label": "रेफरल कोड", + "promotion.payment": "भुगतान जारी रखें", + "promotion.payment.btc": "₿ के ज़रिए भुगतान करें", + "promotion.loading": "लोड हो रहा है...", + "promotion.howto_1y": "एक दोस्त आप के साथ अपने रेफरल कोड साझा करते हैं, जांच के बाद मुक्त करने के लिए लालटेन प्रो के एक माह के प्राप्त करने के लिए कोड दर्ज करें।", + "promotion.howto_2y": "एक दोस्त आप के साथ अपने रेफरल कोड साझा करते हैं, जांच के बाद मुक्त करने के लिए लालटेन प्रो के एक माह के प्राप्त करने के लिए कोड दर्ज करें।", + "promotion.pay": "वेतन {{राशि}}", + "promotion.select": "चुनते हैं", + "promotion.promotion_applied_1y": "+1 बोनस महीने", + "promotion.promotion_applied_2y": "+3 बोनस महीने", + "promotion.too_many_referrals": "इस रेफरल कोड पहले से ही जोड़ा गया है। अब बाहर की जाँच अपने अतिरिक्त महीनों प्राप्त करने के लिए।", + "promotion.activation.enter_and_confirm_email": "अपना लालटेन प्रो अकाउंट पंजीकृत करने के लिए कृपया अपना ईमेल पता दर्ज करें और पुष्टि करें।", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "एक्टिवेशन कोड", + "promotion.activation.instructions": "अपना ईमेल और अपना अकाउंट पंजीकृत करने के लिए पुनर्विक्रेता से प्राप्त 25 अंकों का सक्रियण कोड दर्ज करें।", + "promotion.activation.howto": "कृपया ऊपर अपना 25 वर्ण लालटेन प्रो सक्रियण कोड दर्ज करें। यदि आपके पास कोड नहीं है, तो कृपया पिछली स्क्रीन पर प्रो खरीदें या ऑनलाइन एक लालटेन प्रो पुनर्विक्रेता की तलाश करें।", + "promotion.activation.continue": "प्रो के लिए रजिस्टर करें", + "promotion.voucher.hint": "एक्टिवेशन कोड", + "promotion.voucher.howto": "कृपया अपना 12 वर्ण फास्ट वर्ल्ड पे एक्टिवेशन कोड ऊपर दर्ज करें", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "आपका एक्टिवेशन कोड रिडीम करने में त्रुटि हुई है।", + "promotion.voucher.error.invalid_code": "अमान्य सक्रियण कोड", + "promotion.voucher.error.invalid_plan": "अमान्य योजना से संबद्ध सक्रियकरण कोड", + "promotion.voucher.error.already_redeemed": "सक्रियण कोड पहले ही भुनाया जा चुका है", + "referral.code": "रेफरल कोड", + "referral.text": "मेरे कोड का उपयोग करें और जब आप साइन अप 3 महीने मुक्त हो जाओ!", + "referral.description_free": "अपने दोस्तों के साथ अपना कोड शेयर करें और उनके Pro ख़रीदने पर आप 1 महीने की Lantern Pro सेवा फ़्री पाएं!", + "referral.description_pro": "अपने दोस्तों के साथ अपना कोड शेयर करें और उनके Pro ख़रीदने पर आप और 1 महीने और की Lantern Pro सेवा फ़्री पाएं!", + "register": "रजिस्टर करें", + "renew.subtitle_early": "3 मुक्त महीनों के लिए नवीनीकृत!", + "renew.subtitle_last_day": "3 मुक्त महीनों के लिए नवीनीकृत!", + "renew.subtitle_expired": "45 मुक्त दिनों के लिए नवीनीकृत!", + "renew.details_early": "आपकी लालटेन प्रो सदस्यता जल्द ही समाप्त हो रही है। अब नवीनीकृत करें और तीन महीने तक मुफ्त का आनंद लें!", + "renew.details_last_day": "आपकी लालटेन प्रो सदस्यता आज समाप्त हुई! अब नवीनीकृत करें और तीन महीने तक मुफ्त का आनंद लें!", + "renew.details_expired": "आपकी लालटेन प्रो सदस्यता समाप्त हो गई है। अब नवीनीकृत करें और पैंतालीस दिनों तक मुफ्त का आनंद लें!", + "renew.asterisk_early": "* यह सीमित समय की पेशकश केवल शुरुआती नवीनीकरण के लिए ही मान्य है।", + "renew.asterisk_last_day": "* इस विशेष प्रस्ताव को प्राप्त करने का यह आपका अंतिम मौका है!", + "renew.asterisk_expired": "* यह पेशकश सीमित समय के लिए है!", + "renew.plan_label": "लालटेन प्रो -%s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 मुफ़्त महीने", + "renew.plan_renewal_bonus_months": "$%d%s + %d मुफ़्त महीने", + "renew.plan_renewal_bonus_days": "$%d%s + %d मुफ़्त दिन", + "renew.next": "अगला", + "renew.decline": "प्रस्ताव को अस्वीकार करें", + "renew.decline_question": "क्या आप वाकई इस ऑफ़र को अस्वीकार करना चाहते हैं?", + "renew.decline_yes": "बाद में नवीनीकृत करें", + "renew.decline_dismiss": "अब नवीनीकृत करें", + "renew.notification_title_30_days": "भारी बचत के लिए अब नवीनीकृत प्रो!", + "renew.notification_title_30_days_platinum": "भारी बचत के लिए अभी प्लैटिनम रिन्‍यू करें!", + "renew.notification_text_30_days": "आपका {{planName}} खाता {{remainingDays}} दिनों में समाप्त हो रहा है। अभी रिन्यू करें और 3 महीने तक फ़्री पाएं।", + "renew.notification_title_2_days": "{{planName}} की छूट कल समाप्त हो रही है!", + "renew.notification_text_2_days": "आपका {{planName}} खाता कल समाप्त हो रहा है। एक बड़ी छूट के लिए इस अवसर को छोड़ें नहीं।", + "renew.notification_title_last_day": "छूट का आखिरी मौका!", + "renew.notification_text_last_day": "आपका {{planName}} खाता समाप्त हो गया है। आज रिन्यू करें और 3 महीने तक फ़्री पाएं।", + "replica.upload": "डालना", + "replica.favorite": "पसंदीदा", + "replica.added_to_favorites": "पसंदीदा में जोड़ा गया", + "replica.filedrop_error": "इस फ़ाइल को अपलोड करने में एरर आई", + "replica.filedrop_error.file-too-large": "अधिकतम अनुमत फ़ाइल साइज़ {{फ़ाइलसाइज़}} है", + "replica.filedrop_error.file-too-small": "फ़ाइल छोटी है", + "replica.filedrop_error.too-many-files": "कई सारी फ़ाइलें", + "replica.filedrop_error.file-invalid-type": "इस तरह की फ़ाइल अभी सपोर्ट नहीं की जाती", + "replica.filedrop_remove_file": "कतार से हटाएँ", + "replica.post": "फ़ाइल अपलोड करें", + "replica.relevance": "प्रासंगिकता", + "replica.upload_date": "अपलोड की तारीख", + "replica.gallery_view": "गैलरी व्यू", + "replica.list_view": "लिस्ट व्यू", + "replica.copy_lantern_link": "लालटेन लिंक कॉपी करें", + "replica.documents": "डॉक्यूमेंट", + "replica.audio": "ऑडियो", + "replica.application": "ऐप्स", + "replica.image": "इमेजिस", + "replica.video": "वीडियो", + "replica.web": "वेब", + "replica.news": "खबरें", + "replica.upload_alert.dont_show": "इसे फिर से न दिखाएं", + "replica.upload_alert.cancel": "अपलोड रद्द करें", + "replica.upload_alert.resume": "अपलोड रिज़्यूमे करें", + "replica.upload_alert.info": "महत्वपूर्ण जानकारी!", + "replica.upload_alert.desc1": "लालटेन पर अपलोड की गई फाइलें वितरित और विकेंद्रीकृत हैं। एक बार जब वे किसी अन्य उपयोगकर्ता द्वारा एक्सेस किए जाते हैं, तो उन्हें लालटेन सहित किसी के द्वारा भी नेटवर्क से हटाया नहीं जा सकता है, भले ही वे आपकी 'मेरी फ़ाइलें' सूची से हटा दिए गए हों।", + "replica.upload_alert.desc2": "कृपया संवेदनशील सामग्री अपलोड करते समय फ़ाइल या फ़ाइल नाम में व्यक्तिगत पहचान की जानकारी का उपयोग करने से बचें।", + "replica.add_details": "विवरण जोड़ें", + "replica.cannot_edit": "एक बार प्रकाशित होने के बाद फाइलों के नाम संपादित नहीं किए जा सकता हैं।", + "replica.next": "आगे", + "replica.previous": "पिछला", + "replica.selectAll": "सभी का चयन करे", + "replica.search_replica": "खोज", + "replica.search_results_info": "यह टैब केवल Lantern से जुड़ा परिणाम दिखाता है.", + "replica.search_results_info_message": "Lantern परिणामों में उपयोगकर्ताओं द्वारा Lantern नेटवर्क पर अपलोड किये गए कंटेंट शामिल होते है.", + "replica.no_files_found": "कोई परिणाम नहीं", + "replica.or_content": "अन्य लोगों को खोजने के लिए आपकी अपनी सामग्री!", + "replica.try_again": "एक अलग कीवर्ड का प्रयास करें, या", + "replica.upload_success": "अपलोड सफल हो गया!", + "replica.cannot_preview": "इस फ़ाइल का पूर्वावलोकन नहीं है", + "replica.no_description": "विवरण खाली छोड़ दिया गया था।", + "replica.size": "आकार", + "replica.uploaded": "अपलोड किए गए", + "replica.invalid_link": "अमान्य लिंक", + "replica.close": "बंद करे", + "replica.files": "फ़ाइलें", + "replica.upload_history": "इतिहास अपलोड करें", + "replica.my_favorites": "पसंदीदा", + "replica.no_uploads": "अभी तक कोई अपलोड नहीं है", + "replica.no_favorites": "अभी तक कोई पसंदीदा नहीं है", + "replica.mime_type": "फ़ाइल का प्रकार: {{mime}}", + "replica.image_loading_error": "छवि लोड करने में त्रुटि", + "replica.play": "प्ले करें/चलाएं", + "replica.pause": "रोकें", + "replica.scrub": "रगड़ें", + "replica.skip_forward": "आगे छोड़ें", + "replica.skip_backwards": "पीछे छोड़ें", + "replica.trending_videos": "ट्रेंडिंग वीडियो", + "replica.file_uploaded": "अपलोड किया गया: {{days}} दिनों पहले", + "replica.file_size": "आकार", + "replica.duration": "अवधि", + "replica.filename": "फ़ाइल का नाम", + "replica.filename_required": "अपनी फ़ाइल को नाम दें", + "replica.description_optional": "कृपया विवरण जोड़ें।", + "replica.expand": "विवरण विस्तृत करें", + "replica.filetype": "फाइल का प्रकार", + "replica.sortby": "इसके अनुसार क्रमबद्ध करें", + "replica.link": "रेप्लिका लिंक", + "replica.collapse": "संकुचित करें", + "replica.publish": "प्रकाशित करें", + "replica.cancel": "रद्द करना", + "replica.progress_current_upload": "का अपलोड करें", + "replica.progress_files": "फ़ाइलें", + "replica.progress_of": "का", + "replica.progress_upload_complete": "पूरा हुआ", + "replica.progress_upload_failure": "अपलोड नहीं हो सका, कृपया दोबारा कोशिश करें.", + "replica.upload_in_progress": "अपलोड हो रहा है", + "replica.upload_pending": "अपलोड पेंडिंग है", + "replica.upload_error": "एरर अपलोड करें", + "replica.upload_cancel": "अपलोड कैंसिल करें", + "replica.upload_confirm": "क्या आप सच में अपलोड कैंसल करना चाहते हैं?", + "replica.progress_view": "देखें", + "replica.delete": "हटाएं", + "replica.remove": "हटाएँ", + "replica.delete_file": "फ़ाइल को हटाएं", + "replica.remove_favorite": "पसंदीदा से हटाएँ", + "replica.failed_to_delete": "हटाने में विफल", + "replica.failed_to_remove": "नहीं हटा पाए", + "replica.link_lookup_failure": "लिंक खोजने में विफल", + "replica.delete_file_confirmation_1": "क्या आप पक्का इसे हटाना चाहते हैं", + "replica.delete_file_confirmation_2": "आपके अपलोड से", + "replica.remove_favorite_confirmation_1": "क्या आप सच में हटाना चाहते हैं", + "replica.remove_favorite_confirmation_2": "आपके पसंदीदा से", + "replica.share_file": "फ़ाइल साझा करें", + "replica.download_and_view": "डाउनलोड/देखें", + "replica.download": "Download", + "replica.copy_link": "रेप्लिका लिंक कॉपी करें", + "replica.find_file": "फ़ाइल ढूंढे", + "replica.file_drop_prompt": "अपलोड करने के लिए फ़ाइल यहाँ डालें!", + "replica.empty_uploads_text1": "अपनी पोस्ट बनाने के लिए यहाँ क्लिक करें.", + "replica.empty_uploads_text2": "यहाँ", + "replica.empty_uploads_text3": "अपना पहला पोस्ट बनाने के लिए", + "replica.error_header": "ओह", + "replica.error": "आपके अनुरोध को प्रोसेस करने में एरर आई. कृपया दोबारा कोशिश करें.", + "replica.serp_empty": "Google ने इस क्वेरी से जुड़ा कोई परिणाम नहीं दिया.", + "replica.disclaimer": "आप जो भी सर्च करते हैं, Lantern उसे गुमनाम कर देता है और थर्ड पार्टियों से सुरक्षित रखता है", + "settings.general": "सामान्य", + "settings.feedback": "प्रतिपुष्टि", + "settings.autoLaunch": "प्रणाली प्रारंभ पर लालटेन भागो", + "settings.autoReport": "सुरक्षित रूप से उपयोग के आंकड़े रिपोर्ट लालटेन में योगदान के लिए", + "settings.lantern_ads": "Lantern Ads दिखाएँ", + "settings.lantern_ads_tooltip": "हमारी सेवा में मदद करने के लिए Lantern आपको कुछ वेबसाइटों पर विज्ञापन दिखाता है. हमारे सर्वर पर कोई उपयोगकर्ता जानकारी इकठ्ठा या आगे नहीं दी जाती है. यदि आप इस विकल्प को बंद कर देते हैं, तब भी आपको विज्ञापन दिखाई दे सकते हैं, लेकिन वे Lantern नेटवर्क से नहीं होंगे.", + "settings.proxyAll": "प्रॉक्सी सभी यातायात", + "settings.proxyAllHelpTitle": "\"PROXY ALL TRAFFIC\" क्या करता है?", + "settings.proxyAllHelp1": "सक्षम होने पर, सभी ट्रैफ़िक को लालटेन (सबसे सुरक्षित विकल्प) के माध्यम से भेजा जाएगा।", + "settings.proxyAllHelp2": "यदि अक्षम किया जाता है, तो केवल अवरुद्ध ट्रैफ़िक को लालटेन (सबसे तेज़ विकल्प, सबसे आम) के माध्यम से भेजा जाएगा।", + "settings.show_advanced": "एडवांस सेटिंग्स दिखाएँ", + "settings.hide_advanced": "एडवांस सेटिंग्स छिपाएँ", + "settings.systemProxy": "सिस्टम प्रॉक्सी प्रबंधित", + "settings.title": "कोई और अधिक उच्च गति लालटेन डेटा", + "settings.http_proxy": "HTTP(S) प्रॉक्सी:", + "settings.socks_proxy": "SOCKS प्रॉक्सी:", + "settings.caution": "सावधान:", + "settings.caution_text": "जब आप अपने ब्राउज़र और एप्लिकेशन को "सिस्टम प्रॉक्सी प्रबंधित करें" अनचेक करते हैं, तो स्वचालित रूप से लालटेन का उपयोग नहीं कर पाएंगे। यदि आप जानते हैं कि इन सेटिंग्स को मैन्युअल रूप से कैसे कॉन्फ़िगर किया जाए तो उपरोक्त जानकारी देखें।", + "settings.select_language": "भाषा का चयन करें", + "settings.diagnostics": "नैदानिक ​​जानकारी अटैच करें", + "settings.diagnostics_tooltip": "नैदानिक ​​जानकारी अटैच करने से आपके कनेक्शन से कैप्चर किया गया डेटा Lantern टीम को भेजा जाएगा. इससे आपकी समस्या को जानने और हल करने की हमारी क्षमता बढ़ेगी.", + "status.lantern": "लालटेन है", + "status.click_reconnect": "फिर से कनेक्ट करने के लिए यहां क्लिक करें", + "status.server_location": "सर्वर स्थान", + "status.tooltip1": "लालटेन आपको हमारे सर्वश्रेष्ठ डेटा केंद्रों से जोड़ने के लिए स्मार्ट सर्वर चयन का उपयोग करता है।", + "status.tooltip2": "हमारे विशेष लालटेन प्रो डेटा केंद्रों से अनुकूलित सर्वर चयन के साथ तेज गति के लिए लालटेन प्रो में अपग्रेड करें", + "status.protected_connection": "आपका कनेक्शन संरक्षित है", + "status.please_wait": "इसमें एक या दो मिनट लग सकते हैं ...", + "status.connecting": "कनेक्ट हो रहा है...", + "status.no_internet": "बंद करें", + "status.no_internet_connection": "कोई इंटरनेट कनेक्शन नहीं", + "status.connected": "खोलें", + "status.disconnected": "बंद करें", + "status.throttled": "स्पीड थ्रॉटलड (डेटा कैप)", + "status.no_system_proxy": "{{status}}, सिस्टम प्रॉक्सी मैनेज नहीं कर रहा है", + "status.fail_to_set_system_proxy": "लालटेन को सिस्टम प्रॉक्सी के रूप में सेट करने में विफल", + "status.fail_to_open_browser": "लालटेन उपयोगकर्ता इंटरफ़ेस को दिखाने के लिए ब्राउज़र विंडो खोलने में विफल", + "support.forum": "Lantern उपयोगकर्ता फोरम", + "support.faq": "सामान्य प्रश्न", + "terms_of_service.acknowledgment": "{{buttonText}} पर क्लिक करके, आप हमारी सेवा की शर्तों से सहमत होते हैं", + "terms_of_service.replica": "किसी भी तरह से हमारे उत्पादों को खोज, अपलोड या उपयोग करके, आप हमारी सेवा की शर्तों, प्राइवेसी पालिसी and DMCA Policy से सहमत होते हैं", + "top_sites.google": "Google", + "top_sites.twitter": "ट्विटर", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "फेसबुक", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "डिवाइस लिंकिंग पिन डालें या पेस्ट करें", + "verify.code": "डिवाइस जोड़ने संहिता", + "verify.howto_1": "यदि आप किसी अन्य डिवाइस पर एक लालटेन प्रो खाता है, तो कृपया डिवाइस अधिकृत करने के लिए एक कोड प्राप्त करने के लिए यहां अपना ई-मेल पता दर्ज", + "verify.howto_1a": "आप वर्तमान में एक अनाधिकृत प्रो उपयोगकर्ता हैं। कृपया अपने प्रो खाते अधिकृत करने के लिए अपना ई मेल पता दर्ज करें। यह कई उपकरणों को जोड़ने के लिए सक्षम हो जाएगा।", + "verify.howto_2": "डिवाइस को अपने प्रोअकाउंट से लिंक करने के लिए:", + "verify.howto_3": "1. अपने अन्य डिवाइस के मेनू से प्रो के लिए अधिकृत डिवाइस चुनें।", + "verify.howto_4": "2. कदम 1 से प्राप्त लिंकिंग पिन दर्ज करें, और सबमिट करें।", + "verify.reminder": "*सुनिश्चित करें कि दोनों उपकरण लालटेन के सबसे हाल के संस्करण को चला रहे हैं", + "verify.enter_pin": "डिवाइस लिंकिंग पिन डालें या पेस्ट करें", + "verify.submit": "जमा करें", + "verify.title": "खाता सत्यापन", + "welcomeToPro.continue": "प्रो करने के लिए जारी", + "welcomeToPro.invite": "मित्र को आमंत्रित करें और आप प्रत्येक 3 महीने मुफ्त मिलता है जब वे खरीद दो साल की योजना, एक साल की योजना आप प्रत्येक 1 महीने मुक्त हो जाता होगा। आमंत्रित शुरू करो!", + "welcomeToPro.thanks": "आपके पास अब हमारे सबसे तेज़ डेटा केंद्रों का उपयोग करके असीमित एक्सेस है। आपके खाते से अधिकतम तीन डिवाइस कनेक्ट किए जा सकते हैं।", + "welcomeToPro.title": "आपका स्वागत है लालटेन के लिए प्रो", + "welomeToPro.title_exclamation": "लालटेन प्रो में आपका स्वागत है!", + "purchase.failed": "खरीद विफल रही। कृपया बाद में पुनः प्रयास करें।", + "purchase.success": "खरीदारी सफल रही", + "purchase.success_title": "Lantern {{planType}} में आपका स्वागत है!", + "purchase.success_content_pro": "आपके पास अब हमारे सबसे तेज़ डेटा केंद्रों का उपयोग करके असीमित एक्सेस है। आपके खाते से अधिकतम तीन डिवाइस कनेक्ट किए जा सकते हैं।", + "purchase.success_content_platinum": "अब आपके पास हमारी समर्पित लाइनों और सबसे तेज़ डेटा केंद्रों का उपयोग करके, असीमित एक्सेस है। आपके खाते से अधिकतम तीन डिवाइस कनेक्ट किए जा सकते हैं।", + "welcomeToPro.description": "अब आपके पास अवरुद्ध साइटों और सेवाओं तक अप्रतिबंधित पहुंच है", + "messages.copied_to_clipboard": "कोड की नकल। इसे अपने दोस्तों के साथ साझा करें!", + "messages.datacap": "आप अपने मुक्त उच्च गति डेटा का इस्तेमाल किया है। असीमित उच्च गति डेटा के लिए प्रो करने के लिए उन्नयन।", + "messages.fatal_error": "क्षमा करें, हम मुसीबत लालटेन सर्वर से संपर्क कर रहे हैं। अपने इंटरनेट कनेक्शन की जाँच करें और पुन: प्रयास करें।", + "messages.backend_gone": "क्षमा करें, लालटेन नहीं चल रहा प्रतीत होता है। लालटेन को पुनः आरंभ और फिर कोशिश करें।", + "messages.get_help": "मदद लें", + "freeProCredits.title": "मित्रों को आमंत्रित करें", + "freeProCredits.shareWithFriends": "मित्र मुक्त महीने कमाने के साथ अपने कोड साझा करें!", + "freeProCredits.shareWithFriendsDesc": "अपने दोस्त को दो साल की योजना खरीदता है तो आप प्रत्येक 3 महीने नि: शुल्क प्राप्त होगा, एक साल की योजना आप प्रत्येक 1 महीने मुक्त हो जाता है।", + "cards.serverLocation.unknown": "अनजान", + "cards.serverLocation.description": "अनुकूलित सर्वर स्थान", + "cards.serverLocation.description-free": "सर्वर स्थान", + "cards.serverLocation.description-upgrade": "तेज़ सर्वर के लिए अपग्रेड करें", + "cards.serverLocation.title": "वर्तमान स्थान:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "लालटेन स्वचालित रूप से टोक्यो, सिंगापुर, हांगकांग, सैन फ्रांसिस्को, न्यूयॉर्क, एम्स्टर्डम, बैंगलोर और अधिक में हमारे डेटा केंद्रों से संभव सबसे तेज़ कनेक्शन खोजने के लिए स्मार्ट सर्वर चयन का उपयोग करता है।", + "cards.serverLocation.text-free": "लालटेन आपको हमारे सर्वश्रेष्ठ डेटा केंद्रों से जोड़ने के लिए स्मार्ट सर्वर चयन का उपयोग करता है।", + "cards.serverLocation.upgrade-link": "हमारे विशेष लालटेन प्रो डेटा केंद्रों से अनुकूलित सर्वर चयन के साथ तेज गति के लिए लालटेन प्रो में अपग्रेड करें।", + "cards.httpsUpgrades.description": "HTTPS उन्नयन", + "cards.httpsUpgrades.title": "HTTPS अपग्रेड: %d", + "cards.httpsUpgrades.text": "लालटेन स्वचालित रूप से असुरक्षित HTTPS कनेक्शन को असुरक्षित HTTP अपग्रेड करता है जब वेब पर सर्फिंग करते समय आपकी जानकारी को निजी रखा जा सकता है।", + "cards.adsBlocked.description": "विज्ञापन अवरोधित किए गए", + "cards.adsBlocked.title": "अवरोधित विज्ञापन: %d", + "cards.adsBlocked.text": "लालटेन ने वेब पेज लोडिंग समय को गति देने, बैंडविड्थ को बचाने और आपको एक चिकनी ब्राउज़िंग अनुभव देने के लिए घुसपैठिए विज्ञापनों को अवरुद्ध किया।", + "cards.dataUsage.description": "डेटा उपयोग", + "cards.dataUsage.upgrade": "अभी अपग्रेड करें", + "cards.dataUsage.mb-used": "आपने अपने मासिक उच्च गति डेटा के %d/%dMB का उपयोग किया है।", + "cards.dataUsage.upgrade-link": "असीमित उच्च गति सेवा के लिए अब अपग्रेड करें!", + "cards.subscription.description": "प्रो सदस्यता", + "cards.subscription.renew": "नवीकरण", + "cards.subscription.months": "आपके पास अपनी सदस्यता में लालटेन प्रो के %d महीने हैं।", + "cards.subscription.days": "आपकी सदस्यता में लालटेन प्रो के %d दिन शेष हैं।", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "दिन", + "cards.subscription.renew-link": "अधिक समय जोड़ने के लिए अपनी सदस्यता नवीनीकृत करें।", + "auth.email": "ईमेल", + "auth.username": "उपयोगकर्ता का नाम", + "auth.username.or.email": "उपयोगकर्ता का नाम या ईमेल", + "auth.signin": "साइन इन करें", + "current.password": "वर्तमान पासवर्ड", + "new.password": "नया पासवर्ड", + "auth.change.password": "पासवर्ड बदलें", + "confirm.new.password": "नए पासवर्ड की पुष्टि करें", + "auth.password": "कुंजिका", + "auth.have.recovery.phrase": "आपके पास रिकवरी वाक्य है?", + "auth.forgot.password": "पासवर्ड भूल गए या नहीं?", + "auth.create.account": "अकाउंट बनाएं", + "auth.missing.username": "उपयोगकर्ता नाम गुम है", + "auth.missing.current.password": "वर्तमान पासवर्ड गुम है", + "auth.missing.new.password": "नया पासवर्ड गुम है", + "auth.missing.confirm.password": "पासवर्ड की पुष्टि गुम है", + "invalid_credentials": "अवैध प्रत्यय पत्र", + "yinbi.wallet": "Yinbi वॉलेट", + "create.wallet": "वॉलेट बनाएं", + "new.to.yinbi": "Yinbi के लिए नया?", + "setup.wallet": "हाँ, एक नया बटुआ स्थापित करने देता है!", + "web.wallet": "नहीं, मेरे पास Yin.bi वेबसाइट पर एक वॉलेट है", + "yinbi.next": "अगला", + "yinbi.amount": "रकम", + "yinbi.missing.address": "कोई गंतव्य पता नहीं दिया गया है", + "yinbi.missing.amount": "कोई राशि निर्दिष्ट नहीं है", + "yinbi.missing.email": "कोई ईमेल पता निर्दिष्ट नहीं किया गया है", + "yinbi.missing.username": "कोई उपयोगकर्ता नाम निर्दिष्ट नहीं है", + "yinbi.missing.password": "कोई पासवर्ड निर्दिष्ट नहीं है", + "yinbi.invalid.address": "{{destination}} वैध तारकीय पता नहीं है", + "yinbi.send": "भेजना", + "yinbi.to": "सेवा:", + "yinbi.try_again": "फिर से प्रयास करें?", + "yinbi.success.transaction": "लेन-देन सफल!", + "yinbi.failure.transaction": "लेन देन असफल", + "yinbi.confirm.transaction": "लेन-देन की पुष्टि करें", + "yinbi.sent.details": "आपने {{destination}} को {{amount}} YNB भेजा", + "yinbi.sent.failure.details": "निम्नलिखित कारणों से आपका लेन-देन विफल रहा:", + "yinbi.recipient": "प्राप्त करने वाला", + "yinbi.available.send": "आपके पास {{balance}} YNB भेजने के लिए उपलब्ध है", + "yinbi.wallet.header": "बटुआ", + "yinbi.send.header": "Yinbi को भेजें", + "yinbi.recovery.phrase": "Yinbi रिकवरी वाक्यांश", + "yinbi.recover.account": "अपने Yinbi वॉलेट, और लालटेन अकाउंट को पुनर्प्राप्त करने के लिए अपना Yinbi रिकवरी वाक्यांश दर्ज करें या पेस्ट करें", + "yinbi.recovery.desc": "यदि आप अपने लालटेन अकाउंट के अलावा किसी Yinbi वॉलेट में साइन इन करना चाहते हैं तो इस विधि का उपयोग करें", + "yinbi.redeem.codes": "भुनाएँ थोक Yinbi कोड्स", + "yinbi.obtain.codes": "बल्क Yinbi रिडम्पशन कोड reseller.lantern.io से प्राप्त किया जा सकता है", + "yinbi.receive.header": "Yinbi प्राप्त करें", + "yinbi.this.is.your.wallet": "यह आपका Yinbi वॉलेट एड्रेस है जहां लोग आपको YNB भेज सकते हैं।", + "yinbi.your.address": "आपका पता", + "yinbi.no.activity.header": "कोई गतिविधि नहीं", + "yinbi.upgrade.pro.button": "अपग्रेड करने के लिए प्रो और जाओ मुफ्त Yinbi", + "yinbi.renew.pro.button": "रिन्यू प्रो और गेट फ्री Yinbi", + "yinbi.wallet.activity_header": "गतिविधि", + "yinbi.wallet.send": "भेजना", + "yinbi.wallet.receive": "प्राप्त करना", + "yinbi.wallet.balance": "संतुलन", + "yinbi.wallet.getlantern.pro": "लालटेन प्रो + मुफ्त Yinbi प्राप्त करें", + "yinbi.redemption.codes": "Yinbi मोचन कोड", + "redeem_codes.title": "Yinbi कोड्स रिडीम करें", + "redeem_codes.redeem_button_text": "के एवज", + "redeem_codes.cancel_button_text": "रद्द करना", + "redeem_codes.success": "सफलता", + "redeem_codes.errors.missing_codes": "कोई मान्य कोड दर्ज नहीं किया गया", + "redeem_codes.errors.invalid_codes": "त्रुटि, कृपया हाइलाइट किए गए कोड की जांच करें। पार किए गए कोड समाप्त हो गए हैं और अब उन्हें भुनाया नहीं जा सकता है।", + "yinbi.new.account.text": "एक बार जब आप Yinbi भेजते हैं या प्राप्त करते हैं तो आपके लेनदेन यहां दिखाई देंगे।", + "yinbi.createAccount": "अकाउंट बनाएं", + "yinbi.confirm.account.text": "यह सुनिश्चित करने के लिए कि आपने वाक्यांश को सही ढंग से लिखा है, कृपया अपने पुनर्प्राप्ति वाक्यांश से निम्नलिखित शब्दों को दर्ज करें", + "create_account.invalid_words.error": "दर्ज किए गए शब्द रिकवरी पासफ़्रेज़ से मेल नहीं खाते हैं", + "yinbi.recovery_text": "यह आपका Yinbi वॉलेट रिकवरी वाक्यांश है। यह पासवर्ड भूल जाने की स्थिति में अपने Yinbi वॉलेट\n को पुनर्प्राप्त करने का एकमात्र तरीका है। इस वाक्यांश को संग्रहीत करते समय एक पासवर्ड प्रबंधक\n का उपयोग करें या एक हार्ड कॉपी बनाएं।", + "yinbi.recovery_confirm_text": "यह आपका Yinbi वॉलेट रिकवरी वाक्यांश है। यह पासवर्ड भूल जाने की स्थिति में अपने Yinbi वॉलेट को पुनर्प्राप्त करने का एकमात्र तरीका है। इस वाक्यांश को संग्रहीत करते समय एक पासवर्ड प्रबंधक का उपयोग करें या एक हार्ड कॉपी बनाएं।", + "yinbi.import.wallet": "वॉलेट इम्पोर्ट करें", + "yinbi.setup.wallet": "वॉलेट सेट अप करें", + "yinbi.importWallet": "Yinbi वॉलेट आयात करें", + "yinbi.import.wallet.continue": "वॉलेट पर जाना जारी रखें", + "yinbi.import.wallet.success": "वॉलेट इम्पोर्ट सफ़ल रहा!", + "yinbi.wallet.text": "Yinbi वॉलेट का उपयोग करने के लिए, यदि आप Yin.bi आई वेबसाइट पर साइन अप कर चुके हैं,\n तो आप Yin.bi आई से अपना खाता बना सकते हैं, साइन इन\nया आयात कर सकते हैं।", + "yinbi.wallet.pro.text": "Yinbi वॉलेट का उपयोग करने के लिए, आप एक अकाउंट बना सकते हैं, यिन.बी से अपने बटुए को आयात करें यदि आपने पहले साइन अप किया है।", + "yinbi.recovery_subheader": "Yinbi वॉलेट रिकवरी वाक्यांश", + "yinbi.import_wallet.subheader": "Yinbi वॉलेट आयात करें", + "yinbi.import_wallet.text": "अपने वॉलेट को लालटेन में स्थानांतरित करने के लिए अपने Yin.bi क्रेडेंशियल्स का उपयोग करने के लिए साइन इन करें", + "yinbi.import_wallet.success": "आपका वॉलेट सफलतापूर्वक इम्पोर्ट हो गया है कृपया अकाउंट रजिस्ट्रेशन पूरा करने के लिए अपना ईमेल जोड़ें.", + "yinbi.import_wallet.success_subheader": "आयात सफल!", + "yinbi.import_wallet.button": "Yin.bi वॉलेट आयात करें", + "yinbi.import_wallet.success_button": "रजिस्ट्रेशन मुकदमा करें", + "yinbi.recovery_passphrase.label_text": "रिकवरी वाक्यांश", + "yinbi.recovery_passphrase.copy_button_text": "कॉपी करें", + "terms_of_service.notice": "नोटिस", + "terms_of_service.i_agree": "मैं सहमत हूँ", + "platinum": "प्लैटिनम", + "platinum.one_year": "1 वर्ष का मूल्य", + "platinum.two_years": "2 वर्ष का मूल्य", + "platinum.save": "{{savings}}% तक की बचत!", + "platinum.unlimited": "असीमित डेटा", + "platinum.logs": "कोई लॉग नहीं", + "platinum.devices": "3 डिवाइस तक कनेक्ट करें", + "platinum.everything_in_pro": "प्रो में सब कुछ शामिल है", + "platinum.faster_data": "तेज़ डेटा सेंटर्स", + "platinum.dedicated": "समर्पित लाइन", + "platinum.reliability": "बढ़ी हुई विश्वसनीयता", + "platinum.platinum_one_year": "Lantern Platinum 1 वर्ष", + "platinum.platinum_two_years": "Lantern Platinum 2 वर्ष", + "platinum.pro_one_year": "Lantern Pro 1 वर्ष", + "platinum.pro_two_years": "Lantern Pro 2 वर्ष", + "platinum.total": "कुल", + "platinum.free": "फ़्री", + "platinum.credit.days": "+ {{ days }} दिन", + "platinum.credit.months": "{{ months }} महीना(महीने)", + "platinum.upgrade": "प्लैटिनम में अपग्रेड करें", + "platinum.upgrade_details": "समर्पित लाइन + तेज़ डेटा केंद्र!", + "platinum.unused_time_disclaimer": "प्लैटिनम में अपग्रेड करने वाले प्रो उपयोगकर्ता अपनी परिवर्तित प्रो सदस्यता को ऊपर जोड़े गए समय के अनुसार सूचीबद्ध देखेंगे।", + "p2p.opt_in_description": "अपने इंटरनेट का इस्तेमाल करें और बगैर सेंसर वाले इंटरनेट को ऐक्सेस करने में लोगों की मदद करें", + "p2p.active_sharing_description": "आपका इंटरनेट शेयर किया जा रहा है", + "p2p.dialog.title": "इंटरनेट का ऐक्सेस शेयर करें", + "p2p.dialog.text.1": "अपना कनेक्शन शेयर करके उन लोगों की मदद करें, जिनके पास इंटरनेट का सीमित ऐक्सेस है. अपने इंटरनेट का ऐक्सेस देकर, आप स्वयंसेवियों के एक ऐसे नेटवर्क का हिस्सा बनते हैं, जो इंटरनेट में और खुलापन लाते हैं.", + "p2p.dialog.text.2": "शेयर करने से आपकी पहचान या सुरक्षा को कोई खतरा नहीं होगा. आप जब चाहें अपना इंटरनेट शेयर करना बंद कर सकते हैं.", + "p2p.dialog.yes_button": "हाँ, शेयर करना शुरू करें", + "p2p.dialog.no_button": "कैंसिल करें", + "p2p.banner.introducing": "पेश है", + "top_sites.top_sites": "शीर्ष साइट्स" +} \ No newline at end of file diff --git a/locale/translation/hr.json b/locale/translation/hr.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/hr.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/hu.json b/locale/translation/hu.json new file mode 100644 index 000000000..9e140afc6 --- /dev/null +++ b/locale/translation/hu.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW_LANTERN": "Lantern megjelenítése", + "TRAY_UPGRADE_TO_PRO": "Frissítés Pro-ra", + "TRAY_QUIT": "Kilépés a Lanternből", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Súgó", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Kérdések?", + "about.title": "Névjegy", + "account.cancel": "Pro fiók felmondása", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Linkelési hiba", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Eszköz linkelő kód", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Frissítés Pro-ra", + "account.pro.email": "Email cím:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(ez az eszköz)", + "account.pro.logout": "KILÉPÉS", + "account.pro.removedevice": "ELTÁVOLÍTÁS", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Csak egy eszköz", + "account.pro.device.one": "Sajnáljuk, de nem távolíthatja el az utolsó azonosított eszközét.", + "account.pro.linkingcode": "Eszköz linkelő kód:", + "account.pro.renew": "PRO FIÓK MEGHOSSZABBÍTÁSA", + "account.prolink.errorTitle": "Linkelési hiba", + "account.prolink.errorText": "Biztos benne, hogy jól másolta le a kódot a másik eszközről?", + "account.prolink.successTitle": "Eszköz linkelve", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Mégsem", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kártyaszám", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Hónap", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Év", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Hiba", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Próbálja újra", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Az eszköz hozzárandelése a Pro-hoz", + "authorize.step1.have_pro_device": "Van másik Lantern Pro eszközöm", + "authorize.step1.link": "Eszköz linkelése", + "authorize.step1.or": "vagy", + "authorize.step1.recover": "A Lantern Pro fiókom helyreállítására van szükségem", + "authorize.step1.start": "helyreállítás indítása", + "authorize.step1.no_mail": "Nem emlékszik email címére?", + "authorize.step2b.enter_code": "Adja meg fiók helyreállító kódját", + "authorize.step2b.code": "Fiók helyreállító kó", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Nem kapott emailt", + "authorize.step3.recovery": "Fiók helyreállítás", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Az Ön email címe", + "authorize.step3.payment_method": "Fizetési mód", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Hitelkártya", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Fizetési fiók", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Az Ön ajánló kódja", + "authorize.step3.purchase_date": "Vásárlás dátuma", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Fiók helyreállítás folyamatban", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Eszköz azonosítva", + "button.renew": "Renew", + "button.upgrade": "Frissítés", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Frissítés Lantern Pro-ra", + "button.copy_your_code": "Másolja le kódjét", + "button.try_again": "Próbálja újra", + "button.continue": "Folytatás", + "bullet.click_button": "Kattintson a gombra alább", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Küldje el ismerőseinek", + "cancel": "Mégsem", + "confirm": "Megerősít", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Ismeretlen hiba", + "err.internal_error": "Belső hiba", + "err.bad_input": "Rossz adatbevitel", + "err.not_authorized": "Nem azonosított", + "err.user_exists": "Felhasználó létezik", + "err.no_such_user": "Nincs ilyen felhasználó", + "err.user_already_verified": "Felhasználó ellenőrzött", + "err.invalid_user_verification": "Érvénytelen felhasználó ellenőrzés", + "err.user_unverified": "Ellenőrizetlen felhasználó", + "err.operation_temporarily_unavailable": "Szolgáltatás átmenetileg nem elérhető", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Gyorsabb sebesség", + "feature.faster": "Faster data centers", + "feature.unlimited": "Korlátlan adat", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Nincsenek reklámok", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Lantern Pro beszerzése", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "Az Ön email címe", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Kérjük próbálja újra", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Lassú", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern összeomlik", + "issue.type.other": "Egyéb", + "languages.title": "Nyelvek", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Névjegy", + "nav.account": "Fiók kezelés", + "nav.authorize": "Eszköz hozzáadása", + "nav.authorized": "Eszköz azonosítva", + "nav.unauthorized_link": "Az eszköz hozzárandelése a Pro-hoz", + "nav.language": "Nyelv", + "nav.lantern": "Lantern", + "nav.mobile": "Mobil verzió beszerzése", + "nav.report_issue": "Hiba bejelentése", + "nav.settings": "Beállítások", + "nav.verify": "Fiók ellenőrzés", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Újra", + "notifications.whatisnew": "What's New?", + "payment.close": "Bezár", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Válasszon", + "plans.title": "Lantern Pro előfizetések", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Fizetés", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Ajánló kód", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Válasszon", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continue to Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Dokumentumok", + "replica.other": "Egyéb", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Bezár", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Mégsem", + "replica.delete": "Törlés", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Letöltés", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "Minden forgalom proxyzása", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "Beállítások", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Kapcsolódás...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Eszköz linkelő kód", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Elküldés", + "verify.title": "Fiók ellenőrzés", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Köszönjük, hogy megvásárolta a Lantern Pro-t!", + "welcomeToPro.title": "Welcome To Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Segítség kérése", + "freeProCredits.title": "Ismerősök meghívása", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/id.json b/locale/translation/id.json new file mode 100644 index 000000000..12e8377d1 --- /dev/null +++ b/locale/translation/id.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Sambungkan", + "TRAY_DISCONNECT": "Putuskan", + "TRAY_SHOW_LANTERN": "Tampilkan Lantern", + "TRAY_UPGRADE_TO_PRO": "Upgrade ke Pro", + "TRAY_QUIT": "Keluar Lantern", + "BACKEND_DATA_TITLE": "Tidak ada lagi data Lantern berkecepatan tinggi", + "BACKEND_DATA_MESSAGE": "Silakan upgrade ke Pro untuk terus menggunakan Lantern dengan kecepatan penuh!", + "BACKEND_DATA_PERCENT_TITLE": "Tercapai %s dari data Lantern anda", + "BACKEND_DATA_PERCENT_MESSAGE": "Anda sudah menggunakan %s dari data Lantern berkecepatan tinggi untuk satu bulan. Tingkatkan sekarang!", + "BACKEND_CLICK_LABEL": "Buka", + "BACKEND_CLICK_LABEL_OPEN": "Buka", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Mengerti", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern ke versi 1%s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s telah didownload. SIlahkan restart Lantern untuk menggunakan", + "BACKEND_MITM_INSTALL_CERT": "Lantern ingin menginstal sebuah custom certificate untuk unblock trafik Anda", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Harap Izinkan %v untuk membuat perubahan pada sistem", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern adalah aplikasi yang memberikan akses cepat, handal dan aman pada Internet terbuka.", + "about.faq": "Baca FAQ Lantern", + "about.open": "Buka internet untuk semua orang", + "about.questions": "Pertanyaan?", + "about.title": "Tentang", + "account.cancel": "Batalkan akun Pro", + "account.free.cap": "Tersisa {{mb}} MB dari data gratis bulanan anda", + "account.free.cap.upgrade": "Tingkatkan ke Pro untuk data unlimited berkecepatan tinggi", + "account.freelink.validFor": "Berlaku untuk%s", + "account.freelink.desc": "Untuk menghubungkan perangkat ini ke akun Pro anda:", + "account.freelink.step1": "1. Buka menu 'Tambahkan Perangkat' pada perangkat Pro anda.", + "account.freelink.step2": "2. Masukkan kode penghubungan perangkat, dan submit.", + "account.freelink.reminder": "* Pastikan anda sudah mengupdate versi terbaru Lantern pada perangkat Pro anda", + "account.freelink.errorTitle": "Gagal menghubungkan", + "account.freelink.errorText": "Apa anda yakin sudah memasukkan kode pada perangkat Pro anda?", + "account.freelink.headerDesc": "Hubungkan perangkat ini ke akun Pro anda", + "account.freelink.title": "Kode Penghubung Perangkat", + "account.pro.charge": "Akun anda akan dikenai biaya secara otomatis untuk satu tahun Lantern Pro di akhir siklus penagihan anda.", + "account.upgrade": "Tingkatkan ke Pro", + "account.pro.email": "Alamat Email:", + "account.pro.expired": "Akun Pro anda sudah kedaluwarsa. Perbarui sekarang untuk data bulanan unlimited.", + "account.pro.expiry": "Akun Pro anda berakhir dalam %s hari pada %s", + "account.pro.bonusMonths": "Ini termasuk {{bonusMonths}} bonus bulanan anda!", + "account.pro.thisdevice": "(Perangkat ini)", + "account.pro.logout": "KELUAR", + "account.pro.removedevice": "HAPUS", + "account.pro.devices": "Perangkat diizinkan untuk menggunakan akun Pro anda:", + "account.pro.device.confirm.title": "Batalkan Perizinan Perangkat", + "account.pro.device.confirm": "Apa anda yakin ingin menghapus '{{device}}' dari akun Lantern Pro anda?", + "account.pro.device.one.title": "Hanya Satu Perangkat", + "account.pro.device.one": "Maaf, tapi anda tidak bisa menghapus perangkat resmi terakhir anda.", + "account.pro.linkingcode": "Kode Penautan Perangkat:", + "account.pro.renew": "PERBARUI AKUN PRO", + "account.prolink.errorTitle": "Gagal Menghubungkan", + "account.prolink.errorText": "Apa anda yakin telah menyalin kode dengan benar dari perangkat lain anda?", + "account.prolink.successTitle": "Perangkat Terhubung", + "account.prolink.successText": "Anda berhasil menghubungkan perangkat anda! Harap tunggu agar perangkat anda yang lain menjadi pro.", + "adyen.paymentMethods.title": "Metode Pembayaran", + "adyen.paymentMethods.storedMethods": "Metode pembayaran Anda", + "adyen.paymentMethods.otherMethods": "Pilih metode lain", + "adyen.paymentMethods.moreMethodsButton": "Metode pembayaran lainnya", + "adyen.payButton": "Bayar", + "adyen.payButton.formatted": "Bayar %@", + "adyen.cancelButton": "Batalkan", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Simpan untuk pembayaran berikutnya", + "adyen.payment.redirecting": "Anda akan diarahkan", + "adyen.payment.processing": "Pembayaran Anda sedang diproses", + "adyen.creditCard.title": "Detail Kartu", + "adyen.creditCard.holderName": "Nama pemegang", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Nomor Kartu", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Nomor kartu salah", + "adyen.creditCard.expiryDateField.title": "Tanggal jatuh tempo", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Tanggal jatuh tempo salah", + "adyen.creditCard.expiryDateField.month": "Bulan", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Tahun", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Jumlah angsuran", + "adyen.creditCard.storeDetailsButton": "Ingat kartu ini untuk pembayaran berikutnya", + "adyen.creditCard.oneClickVerification.title": "Verifikasi kartu Anda", + "adyen.creditCard.oneClickVerification.message": "Silahkan maskukkan kode CVC untuk %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC salah", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Silahkan masukkan CVC yang benar untuk melanjutkan", + "adyen.sepaDirectDebit.ibanField.title": "Nomor Rekening (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Nomor rekening salah", + "adyen.sepaDirectDebit.nameField.title": "Nama Pemegang", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Saya setuju jumlah dibawah ini untuk di debit dari rekening bank saya", + "adyen.sepa.ownerName": "Nama Pemegang", + "adyen.sepa.ibanNumber": "Nomor Rekening (IBAN)", + "adyen.giropay.searchField.placeholder": "Namabank / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 karakter", + "adyen.giropay.noResults": "Hasil pencarian tidak ada", + "adyen.error.title": "Error", + "adyen.error.subtitle.redirect": "Pengarahan gagal", + "adyen.error.subtitle.payment": "Pembayaran gagal", + "adyen.error.subtitle.refused": "Pembayaran ditolak", + "adyen.error.message.unknown": "Error terjadi", + "adyen.error.message.cannotConnectToInternet": "Gagal untuk menghubungkan ke internet : Silahkan periksa koneksi internet anda", + "adyen.error.message.cannotConnectToHost": "Gagal menyambungkan ke server pembayaran kami", + "adyen.error.retryButton": "Coba lagi", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Pilih bank Anda", + "adyen.creditCard.success": "Pembayaran Berhasil", + "adyen.oneClick.confirmationAlert.title": "Konfirmasi Pembayaran %@", + "adyen.redirect.cannotOpenApp.title": "Tidak dapat membuka aplikasi", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Aplikasi ini tidak dapat dibuka karena tidak terinstal pada perangkat", + "adyen.holderName": "Nama pemegang", + "adyen.countryCode": "Kode Negara", + "adyen.telephone.number": "Nomor telepon", + "authorize.title": "Izinkan Perangkat untuk Pro", + "authorize.step1.have_pro_device": "Saya mempunyai perangkat Lantern Pro lainnya", + "authorize.step1.link": "Hubungkan perangkat", + "authorize.step1.or": "atau", + "authorize.step1.recover": "Saya membutuhkan pemulihan akun Lantern Pro", + "authorize.step1.start": "Mulai pemulihan", + "authorize.step1.no_mail": "Tidak ingat alamat email anda?", + "authorize.step2b.enter_code": "Masukkan Kode Pemulihan Akun Anda", + "authorize.step2b.code": "Kode Pemulihan Akun", + "authorize.step2b.instruction": "Email dengan kode pemulihan telah dikirim ke {{email}}. Email ini mungkin memakan waktu beberapa jam untuk sampai. Silakan cek folder spam anda jika anda tidak menemukannya.", + "authorize.step2b.no_mail": "Tidak menerima email", + "authorize.step3.recovery": "Pemulihan Akun", + "authorize.step3.no_email": "Ups! Kami mengalami masalah dalam menemukan alamat email itu. Berikan informasi lebih lanjut di bawah ini untuk membantu kami menemukan akun anda.", + "authorize.step3.no_code_received": "Mengalami masalah saat menerima email pemulihan? Masukkan informasi di bawah ini dan kami akan menghubungi anda dalam waktu 48 jam.", + "authorize.step3.your_email": "Email anda", + "authorize.step3.payment_method": "Metode Pembayaran", + "authorize.step3.payment_method_hint": "Pilih metode pembayaran yang anda gunakan untuk mendapatkan Pro", + "authorize.step3.credit_card": "Kartu Kredit", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Dapatkan akun Pro dengan mengajak teman", + "authorize.step3.payment_account": "Akun Pembayaran", + "authorize.step3.payment_account_hint": "Masukkan informasi akun Alipay anda", + "authorize.step3.referral_code": "Kode Referal Anda", + "authorize.step3.purchase_date": "Tanggal Pembayaran", + "authorize.step3.note": "Harap catat informasi lain yang dapat membantu kami menemukan akun anda.", + "authorize.step4.title": "Pemulihan akun sedang dalam proses", + "authorize.step4.text1": "Terima kasih! Kami telah menerima permintaan pemulihan akun anda.", + "authorize.step4.text2": "Izinkan 48 jam untuk mengambil informasi akun Pro anda.", + "authorize.step4.text3": "Kami akan mengirimkan informasi ke alamat email yang dimasukkan pada layar sebelumnya.", + "authorized.continue": "Lanjutkan ke Pro", + "authorized.text": "Perangkat ini sekarang diizinkan untuk menggunakan akun Lantern Pro anda!", + "authorized.title": "Perangkat yang diizinkan", + "button.renew": "Perbarui", + "button.upgrade": "Tingkatkan", + "button.upgrade_now": "Tingkatkan Sekarang", + "button.upgrade_to_lantern_pro": "Upgrade ke Lantern Pro", + "button.copy_your_code": "Salin kode anda", + "button.try_again": "Coba lagi", + "button.continue": "Lanjutkan", + "bullet.click_button": "Klik tombol di bawah ini", + "bullet.paste_code": "Tempel kode & unduh tautan dalam pesan", + "bullet.send_to_friends": "Kirim ke teman anda", + "cancel": "Batalkan", + "confirm": "Konfirmasi", + "google_search": "Pencarian Google", + "link_device": "Sudah punya akun Pro? Sambungkan perangkat", + "err.unknown_error": "Kesalahan yang tidak diketahui", + "err.internal_error": "Kesalahan internal", + "err.bad_input": "Input salah", + "err.not_authorized": "Tidak diizinkan", + "err.user_exists": "Pengguna sudah ada", + "err.no_such_user": "Tidak ada pengguna", + "err.user_already_verified": "Pengguna sudah diverifikasi", + "err.invalid_user_verification": "Verifikasi pengguna tidak valid", + "err.user_unverified": "Pengguna belum diverifikasi", + "err.operation_temporarily_unavailable": "Fungsi sementara tidak tersedia", + "err.wrong_or_inexistent_plan": "Perencanaan salah atau tidak ada", + "err.user_has_active_subscription": "Pengguna memiliki langganan aktif", + "err.payment_error": "Kesalahan pembayaran", + "err.no_codes_left": "Tidak ada kode referal yang tersisa", + "err.wrong_code": "Kode referal salah", + "err.redeeming_own_code_not_allowed": "Penarikan kode untuk diri sendiri tidak diperbolehkan", + "err.wrong_charge_id": "Salah ID tagihan", + "footer.reseller": "Hasilkan uang! Jadilah reseller Lantern Pro. Klik disini", + "footer.reseller.email_subject": "Ceritakan tentang Program Reseller Lantern!", + "footer.reseller.email_body": "Saat anda menjadi reseller Lantern,anda akan memiliki kesempatan untuk menghasilkan 25% penjualan setiap langganan Lantern Pro. Ceritakan sedikit tentang mengapa anda ingin menjadi reseller di bawah ini.", + "feature.faster_speed": "Kecepatan Lebih tinggi", + "feature.faster": "Faster data centers", + "feature.unlimited": "Data unlimited", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Tanpa iklan", + "feature.antiblock": "Menahan pemblokiran", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Lebih cepat. Lebih kuat. Tak terbatas. Aman.", + "free.link_account": "Sudah punya akun Pro? Tautkan akun anda", + "home.get_lantern_pro": "Dapatkan Lantern Pro", + "input.email": "Email", + "input.your_email": "Alamat email anda", + "input.confirm_email": "Konfirmasi alamat email", + "input.enter_email": "Masukkan email anda", + "input.use_valid_email": "Tulis alamat email yang valid", + "input.email_not_match": "Kolom email tidak sama", + "issue.your_email": "Email anda", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Silahkan coba lagi", + "issue.select_issue": "Silakan Pilih Masalah", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Pilih masalah dari menu tarik-turun", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Kesalahan pelaporan masalah", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Tidak dapat mengakses situs yang diblokir", + "issue.type.payment_fail": "Tidak dapat menyelesaikan pembayaran", + "issue.type.cannot_login": "Tidak bisa masuk", + "issue.type.always_spinning": "Memuat terus menerus", + "issue.type.slow": "Lambat", + "issue.type.cannot_link_device": "Tidak dapat menautkan perangkat", + "issue.type.crashes": "Lantern crash", + "issue.type.other": "Lainnya", + "languages.title": "Bahasa", + "mobile.link": "Gunakan tautan untuk mendownload Lantern di perangkat Android anda:", + "mobile.title": "Dapatkan Versi Android", + "nav.about": "Tentang", + "nav.account": "Manajemen akun", + "nav.authorize": "Tambahkan Perangkat", + "nav.authorized": "Perangkat Sah", + "nav.unauthorized_link": "Sahkan Perangkat untuk Pro", + "nav.language": "Bahasa", + "nav.lantern": "Lantern", + "nav.mobile": "Dapatkan Versi Mobile", + "nav.report_issue": "Laporkan Masalah", + "nav.settings": "Pengaturan", + "nav.verify": "Verifikasi akun", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Coba lagi", + "notifications.whatisnew": "What's New?", + "payment.close": "Tutup", + "payment.wait_for_pro": "Terima kasih atas pembelian Lantern Pro! Harap tunggu agar Lantern secara otomatis menjadi Pro.", + "payment_methods.select_name": "Pilih metode pembayaran", + "payment_methods.alipay": "Kartu Kredit/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Untuk membeli Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Tutorial Farsi", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Kesepakatan terbaik!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 tahun", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Pilih", + "plans.title": "Rencana Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Untuk Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Kredit anda akan diterapkan ke akun anda dalam siklus penagihan berikutnya.", + "pro.title": "Undang teman, dapatkan akun Pro gratis", + "pro.subtitle": "Ketika teman anda membeli rencana dua tahun, anda berdua akan mendapatkan 3 bulan tambahan Pro, rencana satu tahun akan memberi anda masing-masing 1 bulan gratis.", + "pro.share": "Bagikan kode dengan teman anda untuk mulai mendapatkan lebih banyak kredit!", + "promotion.title": "Checkout Lantern Pro ", + "promotion.title.activation": "Aktivasi Lantern Pro", + "promotion.enter_and_confirm_email": "Silahkan masukkan dan konfirmasikan alamat email anda", + "promotion.code.hint": "Masukkan kode referral teman anda (opsional)", + "promotion.code.label": "Kode Referal", + "promotion.payment": "Lanjutkan ke pembayaran", + "promotion.loading": "Memuat...", + "promotion.howto_1y": "Jika seorang teman membagikan kode referal kepada anda, masukkan kode tersebut untuk menerima satu bulan Lantern Pro secara gratis setelah checkout.", + "promotion.howto_2y": "Jika seorang teman membagikan kode referal, masukkan kode tersebut untuk menerima tiga bulan Lantern Pro secara gratis setelah checkout.", + "promotion.pay": "Bayar {{amount}}", + "promotion.select": "Pilih", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Kode referal ini telah ditambahkan. Check out sekarang untuk menerima bulan tambahan anda.", + "promotion.activation.enter_and_confirm_email": "Harap masukkan dan konfirmasikan alamat email anda untuk mendaftarkan akun Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Masukkan kode aktivasi anda", + "promotion.activation.howto": "Masukkan kode aktivasi Lantern Pro 25 karakter di atas. Jika anda tidak memiliki kode, silakan membeli Pro di layar sebelumnya atau mencari reseller Lantern Pro secara online.", + "promotion.activation.continue": "Lanjutkan ke Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Bagikan kode referal", + "referral.text": "Gunakan kode saya %s dan dapatkan 3 bulan gratis saat anda mendaftar!", + "renew.title_30_days": "Perbarui sekarang selama 3 bulan gratis!", + "renew.title_2_days": "Lantern Pro akan berakhir besok.\nPerbarui sekarang untuk 3 bulan gratis!", + "renew.title_last_day": "Lantern Pro akan berakhir hari ini.\nJangan lewatkan diskon Pro anda!", + "renew.title_expired": "Lantern Pro telah berakhir", + "renew.details_30_days": "Keanggotaan Lantern Pro anda akan segera berakhir, perpanjang sekarang dan nikmati hingga tiga bulan gratis! Penawaran berbatas waktu ini hanya berlaku untuk pembaruan awal.", + "renew.details_2_days": "Keanggotaan Lantern Pro anda akan segera berakhir, perpanjang sekarang dan nikmati hingga tiga bulan gratis! Penawaran berbatas waktu ini hanya berlaku untuk pembaruan awal.", + "renew.details_last_day": "Perbarui sekarang dan nikmati hingga tiga bulan gratis!\nIni adalah hari terakhir untuk memanfaatkan penawaran ini.\nPengguna Lantern Pro mendapatkan kecepatan lebih cepat, data unlimited, hambatan pemblokiran yang lebih baik, tiga perangkat dan tidak ada iklan.", + "renew.details_expired": "Perbarui sekarang untuk tambahan 45 hari gratis. Waktu terbatas.\nPengguna Lantern Pro mendapatkan kecepatan lebih cepat, data unlimited, hambatan pemblokiran yang lebih baik, tiga perangkat dan tidak ada iklan.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 BULAN GRATIS", + "renew.plan_renewal_bonus_months": "$%d%s + %d BULANAN GRATIS", + "renew.plan_renewal_bonus_days": "$%d%s + %d HARIAN GRATIS", + "renew.next": "berikutnya", + "renew.decline": "Tolak Penawaran ", + "renew.decline_question": "Yakin ingin menolak penawaran ini?", + "renew.decline_yes": "Perbarui nanti", + "renew.decline_dismiss": "Perbarui sekarang", + "renew.notification_title_30_days": "Perbarui akun Pro sekarang untuk penghematan besar!", + "renew.notification_text_30_days": "Akun Lantern Pro anda akan berakhir dalam {{days}} hari. Perbarui sekarang dan dapatkan gratis 3 bulan.", + "renew.notification_title_2_days": "Diskon Lantern Pro akan berakhir besok!", + "renew.notification_text_2_days": "Akun Pro anda akan berakhir besok. Jangan lewatkan kesempatan ini untuk diskon besar.", + "renew.notification_title_last_day": "Kesempatan terakhir untuk diskon!", + "renew.notification_text_last_day": "Akun Lantern pro anda telah kedaluwarsa. Perbarui hari ini dan dapatkan gratis 3 bulan.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Docs", + "replica.other": "Lainnya", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Selanjutnya", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Tutup", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Batalkan", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Download", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Jalankan Lantern pada permulaan sistem", + "settings.autoReport": "Laporkan statistik penggunaan dengan aman untuk berkontribusi pada Lantern", + "settings.proxyAll": "Proxy semua traffic", + "settings.proxyAllHelpTitle": "APAKAH \"PROXY SEMUA TRAFFIC\" ?", + "settings.proxyAllHelp1": "Jika diaktifkan, semua lalu lintas akan dikirim melalui Lantern (opsi paling aman).", + "settings.proxyAllHelp2": "Jika dinonaktifkan, hanya lalu lintas yang diblokir akan dikirim melalui Lantern (opsi tercepat, paling umum).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Kelola proxy sistem", + "settings.title": "Pengaturan", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Peringatan:", + "settings.caution_text": "Jika anda tidak mencentang \"Kelola sistem proxy \", browser dan aplikasi anda tidak akan dapat menggunakan Lantern secara otomatis. Jika anda tahu cara mengkonfigurasi secara manual pengaturan ini, lihat informasi di atas.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Lokasi server", + "status.tooltip1": "Lantern menggunakan pemilihan server cerdas untuk menghubungkan anda ke pusat data terbaik kami.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Menghubungkan...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Ingin menautkan perangkat lain ke akun Pro ini? Masukkan kode penautan perangkat anda di bawah ini", + "verify.code": "Kode Penautan Perangkat", + "verify.howto_1": "Jika anda memiliki akun Lantern Pro di perangkat lain, masukkan alamat e-mail anda di sini untuk menerima kode untuk memberi otorisasi pada perangkat", + "verify.howto_1a": "Saat ini anda adalah pengguna Pro yang tidak sah. Harap masukkan alamat e-mail anda untuk memberi kuasa pada akun Pro anda. Ini akan memungkinkan anda menghubungkan ke beberapa perangkat.", + "verify.howto_3": "1. Buka item menu 'Otorisasi Perangkat untuk akun Pro' pada perangkat yang tidak diotorisasi.", + "verify.howto_4": "2. Masukkan kode penautan yang diperoleh dari langkah 1, dan kirimkan.", + "verify.reminder": "* Pastikan anda memperbarui versi terbaru Lantern pada perangkat tidak sah", + "verify.submit": "Kirimkan", + "verify.title": "Verifikasi akun", + "welcomeToPro.continue": "Lanjutkan ke Pro", + "welcomeToPro.invite": "Undang teman dan masing-masing dari anda akan mendapatkan 3 bulan gratis saat mereka membeli rencana dua tahun tersebut, rencana satu tahun akan memberi masing-masing dari anda 1 bulan gratis. Mulai mengundang!", + "welcomeToPro.thanks": "Terima kasih atas pembelian Lantern Pro!", + "welcomeToPro.title": "Selamat Datang di Lantern Pro", + "messages.copied_to_clipboard": "Kode disalin. Bagikan dengan teman anda!", + "messages.datacap": "Anda menggunakan data gratis. Upgrade ke Pro untuk data berkecepatan tinggi unlimited.", + "messages.fatal_error": "Maaf, kami mengalami masalah saat menghubungi server Lantern. Silakan periksa koneksi internet anda dan coba lagi.", + "messages.backend_gone": "Maaf, nampaknya Lantern tidak bisa berjalan lagi. Silakan restart Lantern dan coba lagi.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Undang teman", + "freeProCredits.shareWithFriends": "Bagikan kode anda dengan teman untuk mendapatkan bulan gratis!", + "freeProCredits.shareWithFriendsDesc": "Ketika teman anda membeli rencana dua tahun, masing-masing dari anda akan mendapatkan 3 bulan gratis, untuk rencana satu tahun, masing-masing dari anda mendapat 1 bulan gratis.", + "cards.serverLocation.unknown": "Tidak diketahui", + "cards.serverLocation.description": "Lokasi Server yang Dioptimalkan", + "cards.serverLocation.description-free": "Lokasi server", + "cards.serverLocation.description-upgrade": "Upgrade untuk Server yang Lebih Cepat", + "cards.serverLocation.title": "Lokasi saat ini:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern menggunakan seleksi server cerdas untuk secara otomatis menemukan koneksi tercepat dari pusat data kami di Tokyo, Singapura, Hong Kong, San Francisco, New York, Amsterdam, Bangalore dan masih banyak lagi.", + "cards.serverLocation.text-free": "Lantern menggunakan pemilihan server cerdas untuk menghubungkan anda ke pusat data terbaik kami.", + "cards.serverLocation.upgrade-link": "Upgrade ke Lantern Pro untuk kecepatan lebih cepat dengan pemilihan server yang optimal dari pusat data Lantern Pro eksklusif kami.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern secara otomatis meningkatkan koneksi HTTP yang tidak aman ke koneksi HTTPS terenkripsi bila memungkinkan untuk menyimpan informasi pribadi anda saat berselancar di web.", + "cards.adsBlocked.description": "Iklan Diblokir", + "cards.adsBlocked.title": "Iklan yang Diblokir: %d", + "cards.adsBlocked.text": "Lantern memblokir iklan yang mengganggu untuk mempercepat waktu pemuatan halaman web, menghemat bandwidth, dan memberi anda pengalaman browsing yang lebih mulus.", + "cards.dataUsage.description": "Pemakaian data", + "cards.dataUsage.upgrade": "Tingkatkan sekarang", + "cards.dataUsage.mb-used": "Anda telah menggunakan %d/%d MB dari data kecepatan tinggi bulanan anda.", + "cards.dataUsage.upgrade-link": "Upgrade sekarang untuk layanan kecepatan tinggi tak terbatas!", + "cards.subscription.description": "Berlangganan Pro", + "cards.subscription.renew": "Perbarui", + "cards.subscription.months": "Anda memiliki %d bulan dari Lantern Pro yang tersisa dalam langganan anda.", + "cards.subscription.days": "Anda memiliki %d hari dari Lantern Pro yang tersisa dalam langganan anda.", + "cards.subscription.unit.months": "BLN", + "cards.subscription.unit.days": "HARI", + "cards.subscription.renew-link": "Perbarui langganan anda untuk menambahkan lebih banyak waktu." +} \ No newline at end of file diff --git a/locale/translation/it.json b/locale/translation/it.json new file mode 100644 index 000000000..0e8c0973f --- /dev/null +++ b/locale/translation/it.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Stato: %v", + "TRAY_CONNECT": "Connetti", + "TRAY_DISCONNECT": "Disconnetti", + "TRAY_SHOW_LANTERN": "Mostra Lantern", + "TRAY_UPGRADE_TO_PRO": "Passa alla versione Professional", + "TRAY_QUIT": "Chiudi Lantern", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Apri", + "BACKEND_CLICK_LABEL_OPEN": "Apri", + "BACKEND_CLICK_LABEL_HELP": "Aiuto", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Aggiorna Lanter alla versione %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s è stato scaricato. Riavvialo per cortesia.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "FAQ di Lantern", + "about.open": "Internet libero per tutti.", + "about.questions": "Domande?", + "about.title": "About", + "account.cancel": "Annulla account pro", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valido per %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Codice connessione dispositivo", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Passa alla versione Professional", + "account.pro.email": "Indirizzo email:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(Questo dispositivo)", + "account.pro.logout": "LOGOUT", + "account.pro.removedevice": "RIMUOVI", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Solo un dispositivo", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RINNOVA ACCONT PRO", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Dispositivo collegato", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Annulla", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Numero della carta", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Mese", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Anno", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Errore", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Riprova", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Link this device", + "authorize.step1.or": "o", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "avvio recupero", + "authorize.step1.no_mail": "Non ricordi il tuo indirizzo email?", + "authorize.step2b.enter_code": "Inserisci il Codice recupero account", + "authorize.step2b.code": "Codice recupero Account", + "authorize.step2b.instruction": "Una mail con un Codice di recupero è stata spedita a {{email}}. Potrebbe impiegare anche delle ore ad arrivare. Potrebbe essere erroneamente classificata come spam, quindi cercala anche in quella cartella.", + "authorize.step2b.no_mail": "Non ho ricevuto l'e-mail", + "authorize.step3.recovery": "Recupero credenziali", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "La tua email", + "authorize.step3.payment_method": "Sistema di pagamento", + "authorize.step3.payment_method_hint": "Seleziona il metodo di pagamento che preferisci per ottenere la versione Pro", + "authorize.step3.credit_card": "Carta di credito", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Codice referenziale", + "authorize.step3.purchase_date": "Data d'acquisto", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Il recupero dell'account è in corso", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continua con pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Dispositivo autorizzato", + "button.renew": "Rinnova", + "button.upgrade": "Aggiorna", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Passa a Lantern Pro", + "button.copy_your_code": "Copia il codice", + "button.try_again": "Riprova", + "button.continue": "Continua", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "Annulla", + "confirm": "Conferma", + "google_search": "Cerca tramite Google", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Errore sconosciuto", + "err.internal_error": "Errore interno", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "L'utente esiste già", + "err.no_such_user": "No such user", + "err.user_already_verified": "Utente già verificato", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "Utente non verificato", + "err.operation_temporarily_unavailable": "Operazione temporaneamente non disponibile", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Errore di pagamento", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Guadagna anche tu! Diventa rivenditore Lantern! Fai click qui", + "footer.reseller.email_subject": "Voglio sapere di più sul Programma rivenditori Lantern!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Maggior velocità", + "feature.faster": "Faster data centers", + "feature.unlimited": "Traffico illimitato", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Nessuna pubblicità", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Più veloce. Più forte. Illimitato. Sicuro.", + "free.link_account": "Hai già un account Pro? Collegalo.", + "home.get_lantern_pro": "Get Lantern Pro", + "input.email": "Emai", + "input.your_email": "Tuo indirizzo email", + "input.confirm_email": "Conferma indirizzo email", + "input.enter_email": "Inserisci il tuo indirizzo email", + "input.use_valid_email": "Inserisci un indirizzo email valido", + "input.email_not_match": "Gli indirizzi email non sono uguali", + "issue.your_email": "La tua email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Riprova ancora", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Accesso a siti bloccati impossibile", + "issue.type.payment_fail": "Impossibile completare pagamento", + "issue.type.cannot_login": "Login impossibile", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Lentezza", + "issue.type.cannot_link_device": "Impossibile collegare dispositivi", + "issue.type.crashes": "Lantern va in crash", + "issue.type.other": "Altro", + "languages.title": "Lingue", + "mobile.link": "Usa il collegamento per scaricare Lantern su tuo dispositivo Android:", + "mobile.title": "Scarica versione Android", + "nav.about": "About", + "nav.account": "Gestione account", + "nav.authorize": "Aggiungi dispositivo", + "nav.authorized": "Dispositivo autorizzato", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "Lingua", + "nav.lantern": "Lantern", + "nav.mobile": "Scarica versione mobile", + "nav.report_issue": "Segnalare problema", + "nav.settings": "Impostazioni", + "nav.verify": "Verifica account", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Riprova", + "notifications.whatisnew": "What's New?", + "payment.close": "Chiudi", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 anno", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Seleziona", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Per Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Attivazione Lantern Pro", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Passa al pagamento", + "promotion.loading": "Caricamento in corso...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Paga {{amount}}", + "promotion.select": "Seleziona", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Inserisci il tuo codice di attivazione", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continua con pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Rifiuta offerta", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Documentazione", + "replica.other": "Altro", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Suivant", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Chiudi", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Annulla", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Scarica", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Général", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "Condividi tutto il traffico", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "Impostazioni", + "settings.http_proxy": "Proxy HTTP(S):", + "settings.socks_proxy": "Proxy SOCKS:", + "settings.caution": "Attenzione:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connessione in corso...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Codice connessione dispositivo", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Invia", + "verify.title": "Verifica account", + "welcomeToPro.continue": "Continua con Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Grazie per aver acquistato Lantern Pro!", + "welcomeToPro.title": "Benvenuto in Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Ottieni Aiuto", + "freeProCredits.title": "Invita i tuoi amici", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Sconosciuto", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Rinnova", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "GIOR", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/ja.json b/locale/translation/ja.json new file mode 100644 index 000000000..91c7da499 --- /dev/null +++ b/locale/translation/ja.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW_LANTERN": "Lanternを表示する", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Lanternを終了する", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "ヘルプ", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Questions?", + "about.title": "Lanternについて", + "account.cancel": "Cancel Pro Account", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Upgrade to Pro", + "account.pro.email": "Email Address:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "キャンセル", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Card Number", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "エラー", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Link this device", + "authorize.step1.or": "または", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Device Authorized", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade to Lantern Pro", + "button.copy_your_code": "Copy your code", + "button.try_again": "Try again", + "button.continue": "続ける", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "キャンセル", + "confirm": "Confirm", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Unknown error", + "err.internal_error": "Internal error", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "User exists", + "err.no_such_user": "No such user", + "err.user_already_verified": "User already verified", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Faster Speed", + "feature.faster": "Faster data centers", + "feature.unlimited": "Unlimited data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Please try again", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Languages", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Lanternについて", + "nav.account": "Account Management", + "nav.authorize": "Add Device", + "nav.authorized": "Device Authorized", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "言語", + "nav.lantern": "Lantern", + "nav.mobile": "Get Mobile Version", + "nav.report_issue": "Report an Issue", + "nav.settings": "設定", + "nav.verify": "Account Verification", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "リトライ", + "notifications.whatisnew": "What's New?", + "payment.close": "閉じる", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Select", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Select", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continue to Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "文書", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "閉じる", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "キャンセル", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "ダウンロード", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "すべてのデータをプロキシする", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "設定", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "接続しています…", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Submit", + "verify.title": "Account Verification", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Thanks for your purchase of Lantern Pro!", + "welcomeToPro.title": "Welcome To Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Invite Friends", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/km.json b/locale/translation/km.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/km.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/ko.json b/locale/translation/ko.json new file mode 100644 index 000000000..987404d16 --- /dev/null +++ b/locale/translation/ko.json @@ -0,0 +1,637 @@ +{ + "LANTERN": "랜턴", + "BEAM": "Beam", + "TRAY_STATUS": "상태: %v", + "TRAY_CONNECT": "접속", + "TRAY_DISCONNECT": "연결 끊기", + "TRAY_SHOW": "%s 표시", + "TRAY_UPGRADE_TO_PRO": "프로로 업그레이드", + "TRAY_QUIT": "%s 종료", + "BACKEND_DATA_TITLE": "고속 %s 데이터가 더 이상 없음", + "BACKEND_DATA_MESSAGE": "최고 속도로 %s을 계속 사용하려면 업그레이드하세요!", + "BACKEND_DATA_PERCENT_TITLE": "데이터 %s/%s 도달", + "BACKEND_DATA_PERCENT_MESSAGE": "월 고속 데이터 %s/%s를 사용하셨습니다. 지금 업그레이드하세요!", + "BACKEND_CLICK_LABEL": "열기", + "BACKEND_CLICK_LABEL_OPEN": "열기", + "BACKEND_CLICK_LABEL_HELP": "도움말", + "BACKEND_CLICK_LABEL_GOT_IT": "알겠습니다", + "BACKEND_AUTOUPDATED_TITLE": "%s을 %s 버전으로 업데이트", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s 다운로드가 완료되었습니다. 사용하려면 %s을 재시작하세요.", + "BACKEND_MITM_INSTALL_CERT": "%s에서 성능 향상을 위해 맞춤 인증서를 설치하려고 합니다.", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "%v가 시스템 설정을 변경할 수 있게 허용하세요.", + "BACKEND_ALERT_TITLE": "주의가 필요한 중요 경고", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s는 진단 도구를 설치할 수 있는 권한이 필요합니다. 이것은 우리가 당신의 %의 경험을 개선하는 데 도움이 될 것입니다.", + "about.content": "랜턴은 빠르고 믿을 수 있으며, 열려 있는 인터넷 세상에 안전하게 접근하게 해주는 프로그램입니다.", + "about.faq": "랜턴 자주 묻는 질문", + "about.open": "모두에게 열려 있는 인터넷", + "about.questions": "질문 있나요?", + "about.title": "정보", + "account.add.password": "계정 비밀번호 추가", + "account.cancel": "프로 계정 취소", + "account.recovery": "계정 복구", + "account.recovery.link.device": "디바이스 연결", + "account.recovery.device.code": "기기 연결 코드", + "account.recovery.device.enter.code": "디바이스 연결 PIN 입력 또는 붙여넣기", + "account.recovery.device.instructions.header": "이 기기를 프로 계정에 연결하는 법", + "account.recovery.device.instructions.step.one": "1. Desktop Pro 디바이스 계정 관리 화면 항목에서 또는 Mobile Pro 디바이스 메뉴에서 '디바이스 연결' 옵션을 선택합니다.", + "account.recovery.device.instructions.step.two": "2. 기기 연결 코드를 넣고 제출해 주세요.", + "account.recovery.device.instructions.part.three": "*두 디바이스 모두에서 최신 버전의 Lantern이 실행 중이어야 함", + "account.recovery.method": "계정 복구 방법 선택", + "account.recovery.send.email": "이메일 보내기", + "account.recovery.submit": "제출", + "account.recovery.success": "연결 성공!", + "account.pro_management": "프로 계정 관리", + "account.free.cap": "이번 달 무료 데이터 {{mb}}MB 남음", + "account.free.cap.upgrade": "업그레이드하여 고속 데이터 무제한 사용", + "account.freelink.validFor": "%s 동안 유효", + "account.freelink.desc": "이 디바이스에서 Pro 계정을 사용할 수 있게 인증하려면:", + "account.freelink.step1": "1. Pro 디바이스 메뉴에서 '디바이스 연결' 옵션을 선택합니다.", + "account.freelink.step2": "2. 기기 연결 코드를 넣고 제출해 주세요.", + "account.freelink.reminder": "* 두 디바이스 모두에서 최신 버전의 Lantern이 실행 중이어야 함", + "account.freelink.errorTitle": "연결 오류", + "account.freelink.errorText": "프로 기기에 확실히 코드를 입력하셨나요?", + "account.freelink.headerDesc": "이 기기를 프로 계정에 연결", + "account.freelink.title": "기기 연결 코드", + "account.pro.charge": "요금 납부가 끝날 때 1년치 랜턴 프로 계정 요금이 자동으로 청구됩니다.", + "account.upgrade": "프로로 업그레이드", + "account.create": "계정 만들기", + "account.email": "이메일", + "account.confirm.password": "비밀번호 확인", + "account.password": "비밀번호", + "account.pro.email": "이메일:", + "account.pro.expiration": "프로 계정 만료", + "account.pro.expired": "프로 계정이 만료되었습니다. 무제한 월 데이터를 사용하려면 지금 갱신하세요.", + "account.pro.expiry": "%s일 후인 %s에 Pro 계정이 만료됩니다.", + "account.pro.bonusMonths": "월 {{bonusMonths}} 보너스도 드립니다!", + "account.pro.thisdevice": "(이 기기)", + "account.pro.logout": "로그아웃", + "account.pro.removedevice": "삭제", + "account.pro.devices": "Lantern Pro 디바이스(최대 3대)", + "account.pro.device.confirm.title": "기기 해제", + "account.pro.device.confirm": "랜턴 프로 계정에서 '{{device}}'를 정말로 삭제할까요?", + "account.pro.device.one.title": "단 하나의 기기", + "account.pro.device.one": "죄송합니다. 마지막 기기를 삭제할 수 없습니다.", + "account.pro.linkingcode": "기기 연결 코드:", + "account.pro.renew": "프로 계정 갱신", + "account.prolink.errorTitle": "연결 오류", + "account.prolink.errorText": "다른 기기에서 코드를 정확하게 복사하셨나요?", + "account.prolink.successTitle": "기기 연결 완료", + "account.prolink.successText": "성공적으로 기기를 연결했습니다! 다른 기기가 프로가 될 때까지 잠시 기다려주세요.", + "account.signin": "로그인", + "account.signout": "로그아웃", + "account.submit": "제출", + "account.username": "사용자 이름", + "modal.register.free.header": "Yinbi Wallet에 액세스하려면 등록 또는 로그인", + "modal.register.pro.header": "Yinbi Wallet에 액세스하려면 계정 비밀번호 추가", + "modal.register.free.text": "Yinbi Wallet을 사용하려면 Lantern 계정이 있어야 합니다.\n계속하려면 등록 또는 로그인하세요.", + "modal.register.pro.text": "Yinbi Wallet을 사용하려면 Lantern 계정에 비밀번호를 추가해야 합니다.", + "adyen.paymentMethods.title": "결제 방법", + "adyen.paymentMethods.storedMethods": "현재 결제 방법", + "adyen.paymentMethods.otherMethods": "다른 방법 선택", + "adyen.paymentMethods.moreMethodsButton": "더 많은 결제 방법", + "adyen.payButton": "결제", + "adyen.payButton.formatted": "%@ 결제", + "adyen.cancelButton": "취소", + "adyen.dismissButton": "확인", + "adyen.storeDetails": "다음 결제를 위해 저장", + "adyen.payment.redirecting": "리디렉션됩니다.", + "adyen.payment.processing": "결제 처리 중입니다.", + "adyen.creditCard.title": "카드 세부정보", + "adyen.creditCard.holderName": "카드 명의자 이름", + "adyen.creditCard.holderName.placeholder": "Kil Dong Hong", + "adyen.creditCard.numberField.title": "카드 번호", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "유효하지 않은 카드 번호", + "adyen.creditCard.expiryDateField.title": "만료 날짜", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "유효하지 않은 만료 날짜", + "adyen.creditCard.expiryDateField.month": "월", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "년", + "adyen.creditCard.cvcField.title": "CVC/CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "할부 개월 수", + "adyen.creditCard.storeDetailsButton": "이 카드를 저장하여 다음 결제 시 사용", + "adyen.creditCard.oneClickVerification.title": "카드 승인 확인", + "adyen.creditCard.oneClickVerification.message": "%@의 CVC 코드 입력", + "adyen.creditCard.oneClickVerification.invalidInput.title": "유효하지 않은 CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "계속하려면 유효한 CVC를 입력하세요.", + "adyen.sepaDirectDebit.ibanField.title": "계좌번호(IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "유효하지 않은 계좌번호", + "adyen.sepaDirectDebit.nameField.title": "명의자 이름", + "adyen.sepaDirectDebit.nameField.placeholder": "Kil Dong Hong", + "adyen.sepaDirectDebit.consentButton": "내 은행 계좌에서 아래 금액이 인출되는 데에 동의합니다.", + "adyen.sepa.ownerName": "명의자 이름", + "adyen.sepa.ibanNumber": "계좌번호(IBAN)", + "adyen.giropay.searchField.placeholder": "은행명/BIC/Bankleitzahl", + "adyen.giropay.minimumLength": "최소 3자", + "adyen.giropay.noResults": "검색 결과 없음", + "adyen.error.title": "오류", + "adyen.error.subtitle.redirect": "리디렉션 실패", + "adyen.error.subtitle.payment": "결제 실패", + "adyen.error.subtitle.refused": "결제 거부됨", + "adyen.error.message.unknown": "알 수 없는 오류 발생", + "adyen.error.message.cannotConnectToInternet": "인터넷에 연결하지 못함: 인터넷 연결 상태를 확인하세요.", + "adyen.error.message.cannotConnectToHost": "결제 서버에 연결하지 못했습니다.", + "adyen.error.retryButton": "재시도", + "adyen.idealIssuer.selectField.title": "은행", + "adyen.idealIssuer.selectField.placeholder": "은행 선택", + "adyen.creditCard.success": "결제 성공", + "adyen.oneClick.confirmationAlert.title": "%@ 결제 확인", + "adyen.redirect.cannotOpenApp.title": "앱을 열 수 없음", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "이 앱은 이 디바이스에 설치되지 않아 열 수 없습니다.", + "adyen.holderName": "카드 명의자 이름", + "adyen.countryCode": "국가 코드", + "adyen.telephone.number": "전화번호", + "authorize.title": "프로 계정에 기기 연결", + "authorize.step1.have_pro_device": "다른 랜턴 프로 기기가 있습니다", + "authorize.step1.link": "디바이스 연결", + "authorize.step1.email_linking": "이메일 연결", + "authorize.device_linking_explanation": "다른 디바이스에 로그인했고 소지하고 있는 경우 이 방법을 사용하세요.", + "authorize.device_email_explanation": "디바이스 연결 PIN을 이메일로 받고 싶은 경우 이 방법을 사용하세요.", + "authorize.link_device": "디바이스 연결", + "authorize.step1.choose": "계정 연결 방법 선택", + "authorize.step1.or": "또는", + "authorize.step1.recover": "랜턴 프로 계정 복구", + "authorize.step1.start": "복구 시작", + "authorize.step1.no_mail": "이메일을 잊으셨나요?", + "authorize.step1.description": "이메일을 입력하시면 해당 계정이 있는 경우 디바이스 연결 코드를 이메일로 보내드립니다.", + "authorize.step2b.enter_code": "기기 복구 코드 입력", + "authorize.step2b.code": "기기 복구 코드", + "authorize.step2b.instruction": "{{email}}에 복구 코드 이메일이 전송되었습니다. 도착하는 데 몇 시간이 걸릴 수 있습니다. 이메일이 보이지 않으면 스팸 폴더를 확인하세요.", + "authorize.step2b.no_mail": "이메일 수신 못 함", + "authorize.step3.recovery": "계정 복구", + "authorize.step3.no_email": "앗! 그 이메일 주소를 찾는 데 문제가 생겼습니다. 계정을 찾기 위해 아래 정보를 채워주세요.", + "authorize.step3.no_code_received": "복구 이메일을 받는 데 문제가 있었나요? 아래 정보를 채워 주시면 48시간 안에 연락을 드리겠습니다.", + "authorize.step3.your_email": "귀하의 이메일", + "authorize.step3.payment_method": "결제 방법", + "authorize.step3.payment_method_hint": "프로 결제에 사용하신 계정 방법을 선택해 주세요.", + "authorize.step3.credit_card": "신용카드", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "안드로이드 페이", + "authorize.step3.by_referral": "친구 추천", + "authorize.step3.payment_account": "결제 계정", + "authorize.step3.payment_account_hint": "Alipay 계정 정보", + "authorize.step3.referral_code": "추천 코드", + "authorize.step3.purchase_date": "구입일", + "authorize.step3.note": "계정을 찾는 데 도움이 될 다른 정보를 적어주세요.", + "authorize.step4.title": "계정 복구 진행 중", + "authorize.step4.text1": "감사합니다. 계정 복구 요청이 접수되었습니다.", + "authorize.step4.text2": "48시간 안에 프로 계정 정보가 복구됩니다.", + "authorize.step4.text3": "이전 화면에서 입력하신 이메일 주소로 정보를 보내 드리겠습니다.", + "authorized.continue": "프로로 계속", + "authorized.text": "이 기기는 이제 귀하의 랜턴 프로 계정에 연결되었습니다.", + "authorized.title": "기기 인증", + "button.renew": "갱신", + "button.upgrade": "업그레이드", + "button.upgrade_now": "지금 업그레이드", + "button.upgrade_to_lantern_pro": "랜턴 프로로 업그레이드", + "button.copy_your_code": "코드를 복사하세요", + "button.try_again": "재시도", + "button.continue": "계속", + "bullet.click_button": "아래 버튼을 눌러 주세요", + "bullet.paste_code": "코드를 붙여 넣고 메시지의 링크를 다운로드 하세요", + "bullet.send_to_friends": "친구에게 보내기", + "cancel": "취소", + "confirm": "확인", + "norecoveryyinbi": "*Yinbi Wallet을 복구하지 않음", + "email.recovery.check.email": "이메일에 복구 코드 메시지가 있는지 확인", + "email.recovery.code.label": "복구 코드 입력 또는 붙여넣기", + "email.recovery.no.code": "코드를 받지 못하셨나요?", + "email.recovery.text": "이메일을 입력하면 암호 재설정 코드를 보내드립니다.\nYinbi Wallet이 있는 경우, Yinbi Wallet은 복구되지 않습니다. Yinbi Wallet을 복구하려면 Yinbi 복구 문구를 입력해야 합니다.", + "email.recovery.desc": "복구 코드를 이메일로 받고 싶은 경우 이 방법을 사용하세요.", + "device.recovery.desc": "다른 디바이스에 로그인했고 소지하고 있는 경우 이 방법을 사용하세요.", + "google_search": "Google 검색", + "giveaway.upgrade": "오늘 무료 배포 혜택을 받으려면 업그레이드하세요.", + "giveaway.title_released_today": "%sYNB 오늘 발행 중", + "giveaway.what_is_it": "Yinbi 선물이란 무엇인가요?", + "giveaway.description1": "Yinbi 재단은 Lantern Pro 구매자에게를 대상으로 Lantern을 통해 8,880억 YNB 암호화폐를 독점 배포합니다.", + "giveaway.description2": "YNB는 당일 발행되는 Yinbi 수량, 업그레이드/갱신 회원수, 가입 연수, 구매한 계정 수에 따라 매일 배포됩니다. YNB는 Lantern의 Yinbi Wallet에 바로 입금됩니다.", + "giveaway.learn_more": "자세히 알아보기", + "link_device": "이미 Pro 계정이 있나요? 디바이스를 연결하세요.", + "email.recovery": "이메일 복구", + "email_taken": "이미 등록된 이메일", + "username_taken": "이미 등록된 사용자 이름", + "err.unknown_error": "알 수 없는 오류", + "err.internal_error": "내부 오류", + "err.bad_input": "입력 오류", + "err.not_authorized": "인증되지 않음", + "err.user_exists": "사용자 이미 있음", + "err.no_such_user": "사용자 없음", + "err.user_already_verified": "사용자 이미 확인됨", + "err.invalid_user_verification": "사용자 인증 불가", + "err.user_unverified": "사용자 확인되지 않음", + "err.operation_temporarily_unavailable": "일시적으로 불가능", + "err.wrong_or_inexistent_plan": "존재하지 않거나 잘못된 상품", + "err.user_has_active_subscription": "이미 구독 중인 사용자", + "err.payment_error": "결제 오류", + "err.no_codes_left": "추천 코드 모두 사용", + "err.wrong_code": "추천 코드 틀림", + "err.redeeming_own_code_not_allowed": "스스로를 추천할 수 없습니다.", + "err.wrong_charge_id": "결제 ID 틀림", + "err.invalid_credentials": "입력한 사용자 자격 증명이 유효하지 않음", + "footer.reseller": "부자 되세요! 랜턴 프로 리셀러가 되세요. 여기를 클릭하세요", + "footer.reseller.email_subject": "랜턴 리셀러 프로그램에 대해 알고 싶어요", + "footer.reseller.email_body": "랜턴 리셀러가 되시면 랜턴 프로 구독권을 25% o까지 할인해 드립니다. 리셀러가 되고 싶은 이유를 아래에 적어주세요.", + "feature.faster_speed": "더 빠른 속도", + "feature.faster": "더 빠른 데이터센터", + "feature.unlimited": "무제한 데이터", + "feature.nologs": "로그 없음", + "feature.devices": "최대 3대의 디바이스 연결", + "feature.noads": "광고 없음", + "feature.antiblock": "차단 우회", + "feature.data_center": "더 좋은 데이터센터", + "feature.free_yinbi": "무료 Yinbi 암호화폐!", + "free.title": "랜턴 프로", + "free.desc": "빠른. 강한. 무제한. 보안.", + "free.link_account": "이미 Pro 계정이 있나요? 계정을 연결하세요.", + "home.get_lantern_pro": "랜턴 프로 받기", + "input.email": "이메일", + "input.your_email": "귀하의 이메일 주소", + "input.confirm_email": "이메일 주소 확인", + "input.enter_email": "이메일을 입력하세요", + "input.use_valid_email": "유효한 이메일 주소를 써주세요", + "input.email_not_match": "이메일 정보가 일치하지 않습니다", + "issue.your_email": "귀하의 이메일", + "issue.attach_image_failure": "이미지를 첨부할 수 없음", + "issue.try_again": "다시 시도해 주세요.", + "issue.select_issue": "문제 사항을 선택해 주세요.", + "issue.selected_issue": "문제 선택", + "issue.select_issue_hint": "드롭다운 메뉴에서 문제 사항을 선택하세요", + "issue.note": "문제에 대한 설명", + "issue.description": "문제 설명", + "issue.error": "문제 사항 보고 오류", + "issue.submit": "신고하기", + "issue.report_screenshot": "이미지를 드래그 또는 클릭하여 스크린샷 업로드", + "issue.reported": "문제를 신고해주셔서 감사합니다. 최대한 빨리 이메일로 연락 드리겠습니다.", + "issue.report_sent": "신고 제출됨", + "issue.type.no_access": "차단 사이트 접속 불가", + "issue.type.payment_fail": "결제 완료 불가", + "issue.type.cannot_login": "로그인 불가", + "issue.type.always_spinning": "무한 로딩", + "issue.type.slow": "느림", + "issue.type.cannot_link_device": "기기 연결 불가", + "issue.type.crashes": "갑작스러운 종료", + "issue.type.other": "기타", + "languages.title": "언어", + "lantern.email": "Lantern 이메일", + "mobile.link": "다음 링크를 사용하여 Android 디바이스에서 Lantern 다운로드:", + "mobile.title": "Android 버전 다운로드", + "nav.about": "정보", + "nav.account": "계정 관리", + "nav.authorize": "기기 추가", + "nav.authorized": "기기 인증", + "nav.unauthorized_link": "기기를 프로로 등록", + "nav.language": "언어", + "nav.lantern": "랜턴", + "nav.mobile": "모바일 버전 받기", + "nav.report_issue": "문제 사항 보고", + "nav.settings": "설정", + "nav.verify": "계정 인증", + "nav.yinbi": "Yinbi 받기", + "nav.home": "홈", + "nav.discover": "발견", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "재시도", + "password.change": "비밀번호 변경", + "password.changed": "비밀번호 변경됨", + "continue.to.pro": "프로로 계속", + "username": "사용자 이름", + "password.new": "새 비밀번호", + "password.requirements": "
암호는 다음 조건을 충족해야 합니다.
  • 8자 이상
  • 소문자 최소 1개
  • 대문자 최소 1개
  • 숫자 최소 1개
  • 도용된 비밀번호 목록에 없을 것
", + "password.reset": "비밀번호 재설정", + "notifications.whatisnew": "새로운 기능 소개", + "payment.close": "닫기", + "payment.wait_for_pro": "랜턴 프로를 구매해주셔서 감사합니다! 랜턴이 자동으로 프로가 되는 동안 잠시 기다려 주세요.", + "payment_methods.select_name": "결제 방법 선택", + "payment_methods.alipay": "신용카드/Alipay", + "payment_methods.shetab": "Fast World Pay(Shetab)", + "payment_methods.shetab.details.header": "Lantern Pro 구매", + "payment_methods.shetab.details.body": "구매 계속을 클릭하면 외부 사이트로 리디렉션되어 결제가 완료되고 활성화 코드를 수집합니다.", + "payment_methods.shetab.details.tutorial_header": "Farsi 튜토리얼", + "payment_methods.shetab.details.purchase_voucher_button": "구매 계속", + "payment_methods.shetab.details.input_code_button": "활성화 코드 입력", + "plan.step1": "1단계", + "plan.apply": "적용", + "plan.step2": "2단계", + "plan.most_popular": "최고 인기!", + "plan.step3": "3단계", + "plan.choose_plan": "플랜 선택", + "plan.enter_email": "이메일 입력", + "plan.bestValue": "최고 가성비!", + "plan.per_month": "/월", + "plan.yinbi_2x": "+ Yinbi 2배!", + "plan.oneYear": "1년", + "plan.add_referral": "추천 코드 추가", + "plan.years": "{{years}} 연간 플랜", + "plan.desc": "한 번에 {{price}} 청구", + "plan.bonus_months": "+ {{bonusMonths}}개월", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/년", + "plan.select": "선택", + "plans.title": "랜턴 프로 상품", + "plans.lantern_pro": "랜턴 프로", + "plans.platforms": "Windows, Android, Mac, Ubuntu용", + "plans.from_reseller": "Lantern Pro 활성화 코드가 있나요? 여기를 클릭하세요.", + "plans.with_voucher_code": "활성화 코드가 있나요? 여기를 클릭하세요.", + "pro.apply": "귀하의 구독권은 다음 결제에 적용될 것입니다.", + "pro.title": "친구를 초대하고 무료로 프로를 사용하세요.", + "pro.subtitle": "친구가 2년제 상품을 구입하면 추가로 3개월, 친구가 1년제 상품을 구입하면 추가로 1개월 분을 드립니다.", + "pro.share": "친구들과 코드를 공유하고 크레딧을 얻으세요.", + "promotion.title": "랜턴 프로 체크아웃", + "promotion.title.activation": "Lantern Pro 활성화", + "promotion.enter_and_confirm_email": "이메일 주소를 입력하고 확인해 주세요.", + "promotion.code.hint": "추천 코드를 입력해 주세요 (없는 경우 )", + "promotion.code.label": "추천 코드", + "promotion.payment": "결제 계속", + "promotion.loading": "로드 중...", + "promotion.howto_1y": "친구가 추천 코드를 공유하면, 코드를 입력해서 무료로 1개월 프로를 받으세요.", + "promotion.howto_2y": "친구가 추천 코드를 공유하면, 코드를 입력해서 무료로 3개월 프로를 받으세요.", + "promotion.pay": "{{amount}} 결제", + "promotion.select": "선택", + "promotion.promotion_applied_1y": "+1개월 보너스", + "promotion.promotion_applied_2y": "+3개월 보너스", + "promotion.too_many_referrals": "이 추천 코드는 이미 사용되었습니다. 추가 프로를 받기 위해 체크아웃 해주세요.", + "promotion.activation.enter_and_confirm_email": "랜턴 프로 계정을 등록하기 위해 이메일 주소를 입력하고 확인해 주세요.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "활성화 코드", + "promotion.activation.instructions": "계정을 등록하려면 이메일 주소와 리셀러로부터 받은 25자리 활성화 코드를 입력하세요.", + "promotion.activation.howto": "위에 25자의 랜턴 프로 활성 코드를 적어주세요. 코드를 받지 않았다면 이전 화면에서 프로를 구매하거나 온라인으로 리셀러를 찾아 주세요.", + "promotion.activation.continue": "Pro 등록", + "promotion.voucher.hint": "활성화 코드", + "promotion.voucher.howto": "위에 12자 Fast World Pay 활성화 코드 입력", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "활성화 코드 사용 중 오류입니다. contact@fastworldpay.com 에 문의하여 도움을 받으세요.", + "promotion.voucher.error.invalid_code": "유효하지 않은 활성화 코드", + "promotion.voucher.error.invalid_plan": "유효하지 않은 플랜에 연결된 활성화 코드", + "promotion.voucher.error.already_redeemed": "이미 사용된 활성화 코드", + "referral.code": "추천 코드", + "referral.text": "추천 코드 %s 를 사용해서 가입할 때 3개월을 무료로 사용하세요!", + "referral.description_free": "친구에게 코드를 공유하고 친구가 Pro 구매 시 Lantern Pro 1개월 무료 혜택을 받으세요!", + "referral.description_pro": "친구에게 코드를 공유하고 친구가 Pro 구매 시 Lantern Pro 1개월 무료 추가 혜택을 받으세요!", + "register": "등록", + "renew.subtitle_early": "3 개월 무료 갱신!", + "renew.subtitle_last_day": "3 개월 무료 갱신!", + "renew.subtitle_expired": "45 일 무료 일 갱신!", + "renew.details_early": "랜턴 프로 멤버십은 곧 종료됩니다. 지금 갱신하고 3 개월까지 무료로 즐기십시오!", + "renew.details_last_day": "Lantern Pro 멤버십이 오늘 종료됩니다! 지금 갱신하고 최대 3개월 무료로 즐기세요!", + "renew.details_expired": "Lantern Pro 멤버십이 만료되었습니다. 지금 갱신하고 최대 45일 무료로 즐기세요!", + "renew.asterisk_early": "* 이 기간 한정 혜택은 조기 갱신에만 유효합니다.", + "renew.asterisk_last_day": "* 이 특별 제안을 받을 수 있는 마지막 기회입니다!", + "renew.asterisk_expired": "※ 이 혜택은 한정된 시간 제공입니다!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1개월 무료", + "renew.plan_renewal_bonus_months": "$%d%s + %d개월 무료", + "renew.plan_renewal_bonus_days": "$%d%s + %d일 무료", + "renew.next": "다음", + "renew.decline": "오퍼 거절", + "renew.decline_question": "이 오퍼를 거절하시겠어요?", + "renew.decline_yes": "나중에 갱신", + "renew.decline_dismiss": "지금 갱신", + "renew.notification_title_30_days": "지금 Pro 갱신하면 엄청난 할인 제공!", + "renew.notification_text_30_days": "Lantern Pro 계정이 {{days}}일 후 만료됩니다. 지금 갱신하고 최대 3개월을 무료로 받으세요.", + "renew.notification_title_2_days": "내일 Lantern Pro 할인 종료!", + "renew.notification_text_2_days": "Pro 계정이 내일 만료됩니다. 엄청난 할인 기회를 놓치지 마세요.", + "renew.notification_title_last_day": "마지막 할인 기회!", + "renew.notification_text_last_day": "Lantern Pro 계정이 만료되었습니다. 오늘 갱신하고 3개월을 무료로 받으세요.", + "replica.upload": "업로드", + "replica.post": "게시", + "replica.relevance": "관련성", + "replica.upload_date": "업로드 날짜", + "replica.gallery_view": "갤러리 보기", + "replica.list_view": "목록 보기", + "replica.copy_lantern_link": "Lantern 링크 복사", + "replica.docs": "문서", + "replica.other": "기타", + "replica.apps": "앱", + "replica.images": "이미지", + "replica.upload_alert.dont_show": "다시 표시하지 않음", + "replica.upload_alert.cancel": "업로드 취소", + "replica.upload_alert.resume": "업로드 재개", + "replica.upload_alert.info": "중요 정보!", + "replica.upload_alert.desc1": "Lantern에 업로드한 파일은 분산 저장되고 탈중앙화됩니다. 업로드한 파일은 다른 사용자가 일단 액세스하게 되면 '내 파일'에서 삭제되더라도 Lantern을 포함한 네트워크 내 그 누구도 삭제할 수 없습니다.", + "replica.upload_alert.desc2": "민감한 콘텐츠를 업로드할 때는 파일 내, 또는 파일명에 개인 식별 정보를 사용하지 마세요.", + "replica.videos": "동영상", + "replica.next": "다음", + "replica.previous": "이전", + "replica.select_all": "모두 선택", + "replica.search_replica": "검색", + "replica.no_files_found": "파일이 없음", + "replica.or_content": "다른 사람이 찾을 수 있는 회원님의 콘텐츠!", + "replica.try_again": "다른 키워드를 사용해보세요.", + "replica.upload_success": "업로드 성공!", + "replica.cannot_preview": "이 파일 유형에 미리보기 없음", + "replica.size": "크기", + "replica.uploaded": "업로드됨", + "replica.invalid_link": "유효하지 않은 링크", + "replica.close": "닫기", + "replica.my_files": "내 파일", + "replica.filename": "파일명", + "replica.filename_required": "파일명(필수)", + "replica.filetype": "파일 유형", + "replica.sortby": "정렬 기준", + "replica.link": "복제본 링크", + "replica.collapse": "접기", + "replica.publish": "발행", + "replica.cancel": "취소", + "replica.delete": "삭제", + "replica.delete_file": "파일 삭제", + "replica.failed_to_delete": "삭제 실패", + "replica.link_lookup_failure": "링크를 찾지 못함", + "replica.delete_file_confirmation_1": "다음을 삭제할까요?", + "replica.delete_file_confirmation_2": "(위치: 업로드한 파일)", + "replica.share_file": "파일 공유", + "replica.download_and_view": "다운로드/보기", + "replica.download": "다운로드", + "replica.copy_link": "복제본 링크 복사", + "replica.find_file": "파일 찾기", + "replica.file_drop_prompt": "게시할 파일 여기 드래그 또는 찾아보기", + "settings.general": "일반", + "settings.feedback": "피드백", + "settings.autoLaunch": "시스템 시작 시 랜턴 실행", + "settings.autoReport": "랜턴에 기여하기 위해 사용 통계를 전송", + "settings.proxyAll": "모든 트래픽 프록시", + "settings.proxyAllHelpTitle": "\"모든 트래픽을 프록시\"하면 어떻게 되나요?", + "settings.proxyAllHelp1": "이 옵션이 활성화되면 모든 트래픽이 Lantern을 통해 전송됩니다(더욱 안전한 보안 옵션).", + "settings.proxyAllHelp2": "이 옵션이 비활성화되면 차단된 트래픽만 Lantern을 통해 전송됩니다(가장 빠르고 널리 사용되는 옵션).", + "settings.show_advanced": "고급 설정 표시", + "settings.hide_advanced": "고급 설정 숨기기", + "settings.systemProxy": "시스템 프록시 관리", + "settings.title": "설정", + "settings.http_proxy": "HTTP(S) 프록시:", + "settings.socks_proxy": "SOCKS 프록시:", + "settings.caution": "주의:", + "settings.caution_text": "\"시스템 프록시 관리\"를 해제하실 경우 브라우저가 랜턴을 자동으로 사용할 수 없습니다. 수동으로 설정하는 법을 아신다면 위의 정보를 참고하세요.", + "settings.select_language": "언어 선택", + "status.lantern": "Lantern 소개", + "status.click_reconnect": "다시 연결하려면 여기를 클릭", + "status.server_location": "서버 위치", + "status.tooltip1": "Lantern은 스마트하게 서버를 선택하여 최고의 데이터센터에 연결해줍니다.", + "status.tooltip2": "Lantern Pro 전용 데이터센터의 최적화된 서버 선택으로 더욱 빠른 속도를 즐기려면 Lantern Pro로 업그레이드하세요.", + "status.protected_connection": "연결 보호 중", + "status.please_wait": "1~2분 정도 소요됩니다...", + "status.connecting": "연결 중...", + "status.no_internet": "끔", + "status.no_internet_connection": "인터넷 연결 없음", + "status.connected": "켬", + "status.disconnected": "끔", + "status.throttled": "속도 스로틀링(데이터 제한)", + "status.no_system_proxy": "{{status}}, 시스템 프록시 관리하지 않는 중", + "status.fail_to_set_system_proxy": "Lantern을 시스템 프록시로 설정하지 못함", + "status.fail_to_open_browser": "Lantern 사용자 인터페이스를 표시하기 위해 브라우저 창을 열지 못함", + "terms_of_service.acknowledgment": "{{buttonText}} 버튼을 클릭하면 Lantern 서비스 약관에 동의하게 됩니다.", + "terms_of_service.replica": "Lantern 제품을 검색, 업로드 또는 사용하면 Lantern 서비스 약관, 개인정보 보호정책, DMCA 정책에 동의하게 됩니다.", + "top_sites.google": "Google", + "top_sites.twitter": "트위터", + "top_sites.youtube": "YouTube", + "top_sites.facebook": "페이스북", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "디바이스 연결 PIN 입력 또는 붙여넣기", + "verify.code": "기기 연결 코드", + "verify.howto_1": "다른 기기에 프로 계정이 있다면, 인증 코드를 받기 위해 이메일 주소를 써주세요.", + "verify.howto_1a": "귀하는 지금 인증되지 않은 프로 사용자입니다. 이메일 주소를 입력하여 인증 절차를 진행해 주세요. 그 후에 다수의 기기를 연결하실 수 있습니다.", + "verify.howto_2": "디바이스를 Pro 계정에 연결하려면:", + "verify.howto_3": "1. 다른 디바이스 메뉴에서 'Pro를 사용할 수 있게 디바이스 승인'을 선택합니다.", + "verify.howto_4": "2. 1단계에서 연결 PIN을 얻어 제출합니다.", + "verify.reminder": "*두 디바이스 모두에서 최신 버전의 Lantern이 실행 중이어야 함", + "verify.enter_pin": "디바이스 연결 PIN 입력 또는 붙여넣기", + "verify.submit": "제출", + "verify.title": "계정 인증", + "welcomeToPro.continue": "프로로 계속", + "welcomeToPro.invite": "친구가 2년제 상품을 구입하면 추가로 3개월, 친구가 1년제 상품을 구입하면 추가로 1개월 분을 드립니다. 지금 초대하세요!", + "welcomeToPro.thanks": "랜턴 프로를 구매해주셔서 감사합니다!", + "welcomeToPro.title": "랜턴 프로에 오신 것을 환영합니다.", + "welomeToPro.title_exclamation": "랜턴 프로에 오신 것을 환영합니다.", + "welcomeToPro.description": "이제 차단된 사이트 및 서비스에 무제한 액세스할 수 있습니다.", + "messages.copied_to_clipboard": "코드가 복사되었습니다. 친구들과 공유하세요!", + "messages.datacap": "무료 고속 데이터를 모두 사용했습니다. 무제한 고속 데이터를 위해 프로로 업그레이드해 주세요.", + "messages.fatal_error": "죄송합니다. 현재 랜턴 서버에 연결할 수 없습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.", + "messages.backend_gone": "죄송합니다. 랜턴이 작동하지 않는 것 같습니다. 랜턴을 재시작하고 다시 시도해 주세요.", + "messages.get_help": "도움말", + "freeProCredits.title": "친구 초대하기", + "freeProCredits.shareWithFriends": "친구와 코드를 공유하고 무료로 사용하세요!", + "freeProCredits.shareWithFriendsDesc": "친구가 2년제 상품을 구입하면 추가로 3개월, 친구가 1년제 상품을 구입하면 추가로 1개월 분을 드립니다.", + "cards.serverLocation.unknown": "알 수 없음", + "cards.serverLocation.description": "최적화된 서버 위치", + "cards.serverLocation.description-free": "서버 위치", + "cards.serverLocation.description-upgrade": "더 빠른 서버로 업그레이드", + "cards.serverLocation.title": "현재 위치:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern은 도쿄, 싱가포르, 홍콩, 샌프란시스코, 뉴욕, 암스테르담, 방갈로르 등에 소재한 데이터센터 중에서 가장 빠른 연결이 가능한 서버를 자동으로 스마트하게 찾아 선택해줍니다.", + "cards.serverLocation.text-free": "Lantern은 스마트하게 서버를 선택하여 최고의 데이터센터에 연결해줍니다.", + "cards.serverLocation.upgrade-link": "Lantern Pro 전용 데이터센터의 최적화된 서버 선택으로 더욱 빠른 속도를 즐기려면 Lantern Pro로 업그레이드하세요.", + "cards.httpsUpgrades.description": "HTTPS 업그레이드", + "cards.httpsUpgrades.title": "HTTPS 업그레이드: %d", + "cards.httpsUpgrades.text": "Lantern은 가능하다면 안전하지 않은 HTTP 연결을 암호화된 HTTPS 연결로 자동 업그레이드하여 웹서핑 중 개인정보를 안전하게 보호합니다.", + "cards.adsBlocked.description": "광고 차단됨", + "cards.adsBlocked.title": "차단된 광고: %d", + "cards.adsBlocked.text": "Lantern은 침입성 광고를 차단하여 웹페이지 로드 시간을 단축하고 대역폭을 절약해주어 더욱 원활한 브라우징 환경을 제공합니다.", + "cards.dataUsage.description": "데이터 사용량", + "cards.dataUsage.upgrade": "지금 업그레이드", + "cards.dataUsage.mb-used": "월 고속 데이터를 %d/%dMB 사용하셨습니다.", + "cards.dataUsage.upgrade-link": "무제한 고속 서비스를 즐기려면 지금 업그레이드하세요!", + "cards.subscription.description": "Pro 구독", + "cards.subscription.renew": "갱신", + "cards.subscription.months": "구독에 Lantern Pro가 %d개월 남았습니다.", + "cards.subscription.days": "구독에 Lantern Pro가 %d일 남았습니다.", + "cards.subscription.unit.months": "개월", + "cards.subscription.unit.days": "일", + "cards.subscription.renew-link": "시간을 추가하려면 구독을 갱신하세요.", + "auth.username.or.email": "사용자 이름 또는 이메일", + "auth.signin": "로그인", + "current.password": "현재 비밀번호", + "new.password": "새 비밀번호", + "auth.change.password": "비밀번호 변경", + "confirm.new.password": "새 비밀번호 재입력", + "auth.password": "비밀번호", + "auth.forgot.password": "비밀번호를 잊으셨나요?", + "auth.create.account": "계정 만들기", + "auth.missing.username": "사용자 이름 누락", + "auth.missing.current.password": "현재 비밀번호 누락", + "auth.missing.new.password": "새 비밀번호 누락", + "auth.missing.confirm.password": "재입력 암호 누락", + "invalid_credentials": "유효하지 않은 자격 증명", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Wallet 만들기", + "new.to.yinbi": "Yinbi를 처음 접하시나요?", + "setup.wallet": "예, Wallet을 새로 설정할게요!", + "web.wallet": "아니요, Yin.bi 웹사이트에 Wallet이 있어요.", + "yinbi.next": "다음", + "yinbi.amount": "금액", + "yinbi.missing.address": "제공된 목적지 주소 없음", + "yinbi.missing.amount": "지정된 금액 없음", + "yinbi.missing.email": "지정된 이메일 주소 없음", + "yinbi.missing.username": "지정된 사용자 이름 없음", + "yinbi.missing.password": "지정된 비밀번호 없음", + "yinbi.invalid.address": "{{destination}} 주소는 유효한 Stellar 주소 아님", + "yinbi.send": "보내기", + "yinbi.to": "받는사람:", + "yinbi.try_again": "다시 시도해 보시겠어요?", + "yinbi.success.transaction": "거래 성공!", + "yinbi.failure.transaction": "거래 실패", + "yinbi.confirm.transaction": "거래 확인", + "yinbi.sent.details": "{{amount}}YNB를 {{destination}}에 보냈습니다.", + "yinbi.sent.failure.details": "거래 실패 이유:", + "yinbi.recipient": "수신자", + "yinbi.available.send": "{{balance}}YNB를 보낼 수 있습니다.", + "yinbi.wallet.header": "Wallet", + "yinbi.send.header": "Yinbi 보내기", + "yinbi.recovery.phrase": "Yinbi 복구 문구", + "yinbi.recover.account": "Yinbi Wallet과 Lantern 계정을 복구하려면 Yinbi 복구 문구 입력 또는 붙여넣기", + "yinbi.recovery.desc": "Lantern 계정과 별개로 Yinbi Wallet에 로그인하려면 이 방법을 사용하세요.", + "yinbi.redeem.codes": "벌크 Yinbi 코드 사용", + "yinbi.obtain.codes": "벌크 Yinbi 사용 코드는 reseller.lantern.io를 통해 얻을 수 있습니다.", + "yinbi.receive.header": "Yinbi 받기", + "yinbi.this.is.your.wallet": "다른 사람이 YNB를 보낼 수 있는 회원님의 Yinbi Wallet 주소입니다.", + "yinbi.your.address": "주소", + "yinbi.no.activity.header": "활동 없음", + "yinbi.upgrade.pro.button": "Pro로 업그레이드하고 무료 Yinbi 받기", + "yinbi.renew.pro.button": "Pro 갱신하고 무료 Yinbi 받기", + "yinbi.wallet.activity_header": "활동", + "yinbi.wallet.send": "보내기", + "yinbi.wallet.receive": "받기", + "yinbi.wallet.balance": "잔액", + "yinbi.wallet.getlantern.pro": "Lantern Pro + 무료 Yinbi 받기", + "yinbi.redemption.codes": "Yinbi 사용 코드", + "redeem_codes.title": "Yinbi 코드 사용", + "redeem_codes.redeem_button_text": "사용", + "redeem_codes.cancel_button_text": "취소", + "redeem_codes.success": "성공", + "redeem_codes.errors.missing_codes": "유효한 코드를 입력하지 않음", + "redeem_codes.errors.invalid_codes": "오류입니다. 하이라이트된 코드를 확인하세요. 취소 표시된 코드는 만료되어 더 이상 사용할 수 없습니다.", + "yinbi.new.account.text": "Yinbi를 보내거나 받으면 여기 표시됩니다.", + "yinbi.createAccount": "계정 만들기", + "yinbi.confirm.account.text": "문구를 올바르게 적었는지 확인하려면 복구 문구에서 다음 단어를 입력하세요.", + "create_account.invalid_words.error": "입력하신 단어가 복구 문구와 일치하지 않습니다.", + "yinbi.recovery_text": "회원님의 Yinbi Wallet 복구 문구입니다. 암호를 잊어버렸을 때 Yinbi Wallet을\n복구할 수 있는 유일한 수단입니다. 이 문구를 보관할 때는 비밀번호 관리자를\n사용하거나 인쇄하여 실물로 보관하세요.", + "yinbi.recovery_confirm_text": "회원님의 Yinbi Wallet 복구 문구입니다. 암호를 잊어버렸을 때 Yinbi Wallet을 복구할 수 있는 유일한 수단입니다. 이 문구를 보관할 때는 비밀번호 관리자를 사용하거나 인쇄하여 실물로 보관하세요.", + "yinbi.importWallet": "Yin.bi Wallet 가져오기", + "yinbi.wallet.text": "Yinbi Wallet을 사용하려면 이미 가입한 Yin.bi에\n로그인하거나 계정을 새로 만들어 Wallet을\n가져오면 됩니다.", + "yinbi.wallet.pro.text": "Yinbi Wallet을 사용하려면 이미 가입한 Yin.bi에 로그인하거나 계정을 새로 만들어 Wallet을 가져오면 됩니다.", + "yinbi.recovery_subheader": "Yinbi Wallet 복구 문구", + "yinbi.import_wallet.subheader": "Yinbi Wallet 가져오기", + "yinbi.import_wallet.text": "Wallet을 Lantern으로 이전하려면 Yin.bi 자격 증명으로 로그인", + "yinbi.import_wallet.success": "Wallet을 성공적으로 가져오면 이메일 주소를 추가하여 계정 등록을 완료하세요.", + "yinbi.import_wallet.success_subheader": "가져오기 성공!", + "yinbi.import_wallet.button": "Yin.bi Wallet 가져오기", + "yinbi.import_wallet.success_button": "등록 완료", + "yinbi.recovery_passphrase.label_text": "복구 문구", + "yinbi.recovery_passphrase.copy_button_text": "복사", + "replica.my_uploads": "내 업로드", + "replica.no_uploads": "아직 업로드 없음", + "replica.mime_type": "파일 유형:{{mime}}", + "replica.image_loading_error": "이미지 로드 중 오류", + "replica.trending_videos": "인기 동영상", + "replica.file_uploaded": "업로드: %d일 전", + "replica.file_size": "크기: %s", + "replica.finishing": "완료 중", + "terms_of_service.notice": "통지", + "terms_of_service.i_agree": "동의함", + "top_sites.top_sites": "인기 사이트" +} \ No newline at end of file diff --git a/locale/translation/lt.json b/locale/translation/lt.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/lt.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/lv.json b/locale/translation/lv.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/lv.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/ml.json b/locale/translation/ml.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/ml.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/ms.json b/locale/translation/ms.json new file mode 100644 index 000000000..14696b6e8 --- /dev/null +++ b/locale/translation/ms.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Sambuungan", + "TRAY_DISCONNECT": "Putuskan sambungan", + "TRAY_SHOW": "Tunjukkan %s", + "TRAY_UPGRADE_TO_PRO": "Upgrade ke Pro", + "TRAY_QUIT": "Keluar %s", + "BACKEND_DATA_TITLE": "Tiada lagi data %s berkelajuan tinggi", + "BACKEND_DATA_MESSAGE": "Naik taraf ke Pro untuk terus menggunakan %s dengan kelajuan penuh!", + "BACKEND_DATA_PERCENT_TITLE": "Mencapai %s daripada data %s anda", + "BACKEND_DATA_PERCENT_MESSAGE": "Anda telah menggunakan %s daripada %s data kelajuan tinggi anda. Naik taraf sekarang!", + "BACKEND_CLICK_LABEL": "Buka", + "BACKEND_CLICK_LABEL_OPEN": "Buka", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Faham", + "BACKEND_AUTOUPDATED_TITLE": "Kemas kini %s ke versi %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s telah dimuat turun. Sila mulakan semula %s untuk menggunakannya.", + "BACKEND_MITM_INSTALL_CERT": "%s ingin memasang sijil tersuai untuk meningkatkan prestasi", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Sila benarkan %v membuat perubahan pada sistem anda", + "BACKEND_ALERT_TITLE": "Amaran kritikal memerlukan perhatian anda", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s memerlukan keizinan anda untuk memasang alat diagnostik. Ini akan membantu kami meningkatkan pengalaman %s anda.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Tidak dapat menyimpan konfigurasi", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Tidak dapat menyimpan konfigurasi aplikasi. %s tidak dapat menjamin yang trafik akan diproksikan dengan betul.", + "about.content": "Lantern merupakan suatu aplikasi yang menawarkan akses yang cepat, boleh dipercayai dan selamat di Internet terbuka.", + "app.error": "Sesuatu tidak kena!", + "about.faq": "Baca soalan-soalan yang kerap ditanya mengenai Lantern", + "about.open": "Internet Terbuka bagi Semua", + "about.questions": "Soalan?", + "about.title": "Mengenai", + "account.add.password": "Tambah Kata Laluan Akaun", + "account.agree.terms": "Saya faham bahawa kehilangan kata laluan saya bermaksud kehilangan\n akses akaun. Lantern tidak dapat membantu anda mendapatkan semula\n kata laluan anda.", + "account.agree.terms.error": "Mesti terlebih dahulu bersetuju dengan syarat", + "account.cancel": "Batalkan Akaun Pro", + "account.created": "Akaun Dicipta!", + "account.create.pro.account.header": "Cipta Akaun Pro", + "account.create.pro.account.text": "Lantern sedang mengubah cara pengendalian akaun pengguna. Mulai sekarang pengguna Pro akan perlu mencipta nama pengguna dan kata laluan. Kelayakan ini akan digunakan untuk mendaftar masuk ke peranti lain, dan memberikan akses ke ciri baharu.", + "account.have.a.account": "Ada Akaun?", + "account.link.username.pro": "Pautkan nama pengguna ke Akaun Pro", + "account.recovery": "Pemulihan Akaun", + "account.recovery.link.device": "Pautkan Peranti", + "account.recovery.device.code": "Kod Pautan Peranti", + "account.recovery.device.enter.code": "Masukkan atau Tampal Pin Pautan Peranti", + "account.recovery.device.instructions.header": "Bagi pautkan peranti ke akaun Pro anda:", + "account.recovery.device.instructions.step.one": "1. Pilih pilihan 'Pautkan Peranti' dari item skrin Pengurusan Akaun pada peranti Desktop Pro anda, atau Dari menu pada Peranti Pro Mudah Alih anda.", + "account.recovery.device.instructions.step.two": "2. Masukkan kod pautan peranti, dan hantar.", + "account.recovery.device.instructions.part.three": "*Pastikan kedua-dua peranti menjalankan versi terbaru Lantern", + "account.recovery.method": "Sila Pilih kaedah untuk mendapatkan semula akaun anda", + "account.recovery.send.email": "Hantar Emel", + "account.recovery.submit": "Hantar", + "account.recovery.success": "Memautkan Berjaya!", + "account.pro_management": "Akaun Pengurusan Pro", + "account.free_management": "Pengurusan Akaun", + "account.free.cap": "{{mb}} MB data percuma yang tinggal. Ditetapkan semula pada {{reset}}", + "account.free.cap.upgrade": "Upgrade ke Pro bagi data kelajuan tinggi tidak terbatas", + "account.freelink.validFor": "sah untuk %s", + "account.freelink.desc": "Untuk Benarkan peranti ini menggunakan akaun Pro anda:", + "account.freelink.step1": "1. Pilih pilihan 'Pautkan Peranti' dari Menu pada Peranti Pro anda", + "account.freelink.step2": "2. Masukkan kod pautan peranti, dan hantar.", + "account.freelink.reminder": "* Pastikan kedua-dua peranti menjalankan versi terbaru Lantern", + "account.freelink.errorTitle": "Ralat Pautan", + "account.freelink.errorText": "Adakah anda pasti telah masukkan kod ke peranti Pro anda?", + "account.freelink.headerDesc": "Pautkan peranti ini ke akaun Pro anda", + "account.freelink.title": "Kod Pautan Peranti", + "account.pro.charge": "Akaun anda akan dikenakan bayaran secara automatik bagi satu tahun lagi untuk Lantern Pro di akhir kitaran pengebilan anda.", + "account.upgrade_pro": "Upgrade ke Pro", + "account.upgrade": "Tingkatkan", + "account.upgrade_platinum": "Tingkatkan kepada Platinum", + "account.create": "Cipta Akaun", + "account.email": "Emel", + "account.confirm.password": "Sahkan Kata Laluan", + "account.password": "Kata Laluan", + "account.pro.email": "E-mel:", + "account.pro.expiration": "Tamat Tempoh Akaun Pro", + "account.platinum.expiration": "Tamat Tempoh Akaun Platinum", + "account.pro.expired": "Akaun Pro anda telah tamat tempoh. Memperbaharuinya sekarang untuk data bulanan Tidak Terbatas.", + "account.pro.expiry": "Akaun Pro anda tamat tempoh dalam %s hari pada %s.", + "account.pro.bonusMonths": "Ini termasuk bulan bonus {{bonusMonths}} anda!", + "account.pro.thisdevice": "(Peranti Ini)", + "account.pro.logout": "LOG KELUAR", + "account.pro.removedevice": "MENGELUARKAN", + "account.pro.devices": "Peranti Lantern Pro (hingga 3)", + "account.pro.device.confirm.title": "Membatalkan kebenaran Peranti", + "account.pro.device.confirm": "Adakah anda pasti mahu mengalih keluar '{{device}}' dari akaun Lantern Pro anda?", + "account.pro.device.one.title": "Satu Peranti Sahaja", + "account.pro.device.one": "Maaf, tetapi anda tidak boleh mengeluarkan peranti yang telah dibatalkan kebenaran sebelum ini.", + "account.pro.linkingcode": "Kod Pautan Peranti:", + "account.pro.renew": "Memperbaharui Akaun Pro", + "account.platinum.renew": "Baharui Akaun Platinum", + "account.pro.renew_CN": "Memperbaharui", + "account.prolink.errorTitle": "Ralat Pautan", + "account.prolink.errorText": "Adakah anda pasti telah salin kod yang betul dari peranti anda yang lain?", + "account.prolink.successTitle": "Peranti Dipautkan", + "account.prolink.successText": "Anda telah berjaya pautkan peranti anda! Sila tunggu sebentar bagi peranti anda yang lain untuk menjadi pro secara automatik.", + "account.signin": "Sign In", + "account.signout": "Daftar Keluar", + "account.submit": "Hantar", + "account.username": "Nama pengguna", + "account.switch.to.register": "Tukar ke Cipta Akaun", + "account.switch.to.signin": "Tukar ke Daftar Masuk", + "account.invalid.username": "Nama pengguna tidak sah", + "account.invalid.email": "E-mel tidak sah", + "account.password.mismatch": "Sahkan Kata Laluan tidak sepadan dengan kata laluan", + "account.password.short": "Kata laluan terlalu pendek", + "account.password.lowercase": "Kata laluan mesti mengandungi sekurang-kurangnya satu huruf kecil", + "account.password.uppercase": "Kata laluan mesti mengandungi sekurang-kurangnya satu huruf besar", + "account.password.number": "Kata laluan mesti mengandungi sekurang-kurangnya satu nombor", + "account.password.compromised": "Kata laluan muncul pada senarai kata laluan yang dikompromi", + "modal.register.free.header": "Daftar atau Daftar masuk untuk mengakses Yinbi Wallet", + "modal.register.pro.header": "Tambah kata laluan akaun untuk mengakses Yinbi Wallet", + "modal.register.pro.signin.header": "Daftar masuk untuk mengakses Yinbi Wallet", + "modal.register.free.text": "Untuk menggunakan Yinbi Wallet, anda mesti mempunyai Akaun Lantern, sila Daftar atau\nDaftar masuk untuk Teruskan.", + "modal.register.pro.text": "Untuk menggunakan Yinbi wallet, anda mesti menambah kata laluan ke akaun Lantern anda.", + "modal.register.pro.signin.text": "Untuk menggunakan Yinbi walle, anda mesti daftar masuk ke akaun Lantern anda", + "adyen.paymentMethods.title": "Kaedah Pembayaran", + "adyen.paymentMethods.storedMethods": "Kaedah pembayaran anda", + "adyen.paymentMethods.otherMethods": "Pilih kaedah lain", + "adyen.paymentMethods.moreMethodsButton": "Lebih banyak kaedah pembayaran", + "adyen.payButton": "Bayar", + "adyen.payButton.formatted": "Bayar %@", + "adyen.cancelButton": "Batal", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Simpan untuk pembayaran saya yang seterusnya", + "adyen.payment.redirecting": "Anda akan dihalakan semula", + "adyen.payment.processing": "Pembayaran anda sedang diproses", + "adyen.creditCard.title": "Butiran Kad", + "adyen.creditCard.holderName": "Nama pemegang kad", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Nombor Kad", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "nombor kad tidak sah", + "adyen.creditCard.expiryDateField.title": "Tarikh Tamat Tempoh", + "adyen.creditCard.expiryDateField.placeholder": "MM / YY", + "adyen.creditCard.expiryDateField.invalid": "Tarikh tamat tempoh tidak sah", + "adyen.creditCard.expiryDateField.month": "Bulan", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Tahun", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Bilangan ansuran", + "adyen.creditCard.storeDetailsButton": "Ingat kad ini untuk pembayaran saya yang seterusnya", + "adyen.creditCard.oneClickVerification.title": "Sahkan kad anda", + "adyen.creditCard.oneClickVerification.message": "Sila masukkan kod CVC untuk %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC tidak sah", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Sila masukkan CVC yang sah untuk meneruskan.", + "adyen.sepaDirectDebit.ibanField.title": "Nombor Akaun (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Nombor akaun tidak sah", + "adyen.sepaDirectDebit.nameField.title": "Nama Pemegang", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Saya bersetuju bahawa jumlah di bawah akan didebitkan dari akaun bank saya.", + "adyen.sepa.ownerName": "Nama Pemegang", + "adyen.sepa.ibanNumber": "Nombor Akaun (IBAN)", + "adyen.giropay.searchField.placeholder": "Nama Bank / BIC / Kod Bank", + "adyen.giropay.minimumLength": "Min. 3 aksara", + "adyen.giropay.noResults": "Tiada hasil carian", + "adyen.error.title": "Ralat", + "adyen.error.subtitle.redirect": "Hala semula gagal", + "adyen.error.subtitle.payment": "Pembayaran gagal", + "adyen.error.subtitle.refused": "Pembayaran ditolak", + "adyen.error.message.unknown": "Ralat tidak diketahui berlaku", + "adyen.error.message.cannotConnectToInternet": "Gagal menyambung ke internet : sila semak sambungan internet anda.", + "adyen.error.message.cannotConnectToHost": "Gagal menyambung ke pelayan pembayaran kami.", + "adyen.error.retryButton": "Cuba sekali lagi", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Pilih bank anda", + "adyen.creditCard.success": "Pembayaran Berjaya", + "adyen.oneClick.confirmationAlert.title": "Sahkan %@ pembayaran", + "adyen.redirect.cannotOpenApp.title": "Tidak Dapat Membuka Aplikasi", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Aplikasi ini tidak dapat dibuka kerana tidak dipasang pada peranti ini.", + "adyen.holderName": "Nama pemegang kad", + "adyen.countryCode": "Kod Negara", + "adyen.telephone.number": "Nombor telefon", + "android.download": "Android Lantern", + "android.download.title": "Muat turun Lantern Android", + "authorize.title": "Peranti dibenarkan untuk Pro", + "authorize.step1.have_pro_device": "Saya mempunyai satu lagi peranti Lantern Pro", + "authorize.step1.link": "Peranti Dipautkan", + "authorize.step1.email_linking": "E-mel Dipautkan", + "authorize.device_linking_explanation": "Gunakan kaedah ini jika anda mendaftar masuk ke peranti lain dan mempunyainya bersama anda", + "authorize.device_email_explanation": "Gunakan kaedah ini jika anda mahu pin pemautan Peranti dihantar ke e-mel anda", + "authorize.link_device": "Pautkan Peranti", + "authorize.step1.choose": "Sila pilih kaedah untuk Pautkan akaun anda", + "authorize.step1.or": "atau", + "authorize.step1.recover": "Saya perlu memulihkan akaun Lantern Pro saya", + "authorize.step1.start": "mulakan pemulihan", + "authorize.step1.no_mail": "Tidak ingat alamat Emel anda?", + "authorize.step1.description": "Masukkan e-mel anda dan jika akaun tersebut wujud, kami akan menghantar e-mel dengan kod pemautan peranti", + "authorize.step2b.enter_code": "Masukkan Kod Pemulihan Akaun anda", + "authorize.step2b.code": "Kod Pemulihan Akaun", + "authorize.step2b.instruction": "E-mel dengan kod pemulihan telah dihantar ke {{email}} sekiranya akaun ini wujud. E-mel ini mungkin mengambil masa beberapa jam untuk sampai. Sila semak folder spam anda jika anda tidak menemuinya.", + "authorize.step2b.no_mail": "Tidak menerima emel", + "authorize.step3.recovery": "Pemulihan Akaun", + "authorize.step3.no_email": "Oops! Kami mempunyai masalah mencari alamat emel ini. Sila berikan lebih maklumat di bawah bagi membantu kami mencari akaun anda.", + "authorize.step3.no_code_received": "Ada masalah menerima emel pemulihan anda? Masukkan maklumat di bawah dan kami akan hubungi anda dalam masa 48 jam.", + "authorize.step3.your_email": "Emel Anda", + "authorize.step3.payment_method": "Kaedah Bayaran", + "authorize.step3.payment_method_hint": "Pilih kaedah bayaran yang anda gunakan untuk mendapatkan Pro", + "authorize.step3.credit_card": "Kad Kredit", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Menerima Pro melalui Rujukan seorang rakan", + "authorize.step3.payment_account": "Akaun Bayaran", + "authorize.step3.payment_account_hint": "Masukkan maklumat akaun Alipay anda", + "authorize.step3.referral_code": "Kod Rujukan Anda", + "authorize.step3.purchase_date": "Tarikh Pembelian", + "authorize.step3.note": "Sila catatkan apa-apa maklumat lain yang mungkin membantu kami mencari akaun anda.", + "authorize.step4.title": "Pemulihan Akaun Dalam Process", + "authorize.step4.text1": "Terima kasih! Kami telah menerima pemohonan akaun pemulihan anda.", + "authorize.step4.text2": "Sila memperuntukkan 48 jam untuk dapatkan kembali maklumat akaun Pro anda.", + "authorize.step4.text3": "Kami akan hantar maklumat ke alamat emel yang dimasukkan dalam skrin sebelum ini.", + "authorized.continue": "Teruskan ke Pro", + "authorized.continue.lantern": "Teruskan ke Lantern", + "authorized.text": "Peranti ini kini dibenarkan menggunakan akaun Lantern Pro anda!", + "authorized.title": "Peranti Dibenarkan", + "button.account": "Akaun", + "button.renew": "Memperbaharui", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Sekarang", + "button.upgrade_to_lantern_pro": "Upgrade ke Lantern Pro", + "button.copy_your_code": "Salin kod anda", + "button.try_again": "Cuba sekali lagi", + "button.continue": "Teruskan", + "button.continue_to": "Teruskan kepada {{planType}}", + "bullet.click_button": "Klik butang di bawah", + "bullet.paste_code": "Tampal kod dan muat turun pautan dalam satu mesej", + "bullet.send_to_friends": "Hantar ke rakan-rakan", + "cancel": "Batal", + "confirm": "Sahkan", + "norecoveryyinbi": "*Tidak dapat mendapatkan semula Yinbi Wallet", + "email.recovery.check.email": "Semak e-mel anda untuk mendapatkan mesej dengan Kod Pemulihan", + "email.recovery.code.label": "Masukkan atau Tampal Kod Pemulihan", + "email.recovery.no.code": "Tidak mendapat Kod?", + "email.recovery.text": "Masukkan e-mel anda, dan kami akan mengirimkan kod untuk menetapkan semula kata laluan anda.\nSekiranya anda mempunyai Yinbi Wallet, ini TIDAK akan memulihkan Yinbi Wallet anda, untuk memulihkan Yinbi Wallet anda masukkan Frasa Pemulihan Yinbi anda.", + "email.recovery.desc": "Gunakan kaedah ini jika anda mahu kod pemulihan dihantar ke e-mel anda", + "device.recovery.desc": "Gunakan kaedah ini jika anda mendaftar masuk ke peranti lain dan mempunyai bersama anda", + "google_search": "Carian Google", + "giveaway.upgrade": "Naik taraf untuk menerima edaran percuma hari ini", + "giveaway.title_released_today": "{{formattedTokens}} YNB dikeluarkan hari ini", + "giveaway.what_is_it": "Apa itu Yinbi Giveaway?", + "giveaway.description1": "Yayasan Yinbi memberikan 888 bilion mata wang kripto YNB secara eksklusif melalui Lantern kepada pembeli Lantern Pro.", + "giveaway.description2": "YNB akan diedarkan pada akhir setiap hari, berdasarkan kuantiti Yinbi yang dikeluarkan pada hari itu, bilangan orang yang menaik taraf/memperbaharui, dan bilangan tahun atau akaun yang anda beli. YNB akan dimasukkan terus ke Yinbi Wallet anda di Lantern.", + "giveaway.learn_more": "Ketahui Lebih Lanjut", + "link_device": "Sudah mempunyai satu akaun Pro? Pautkan peranti", + "email.recovery": "Pemulihan E-mel", + "email_taken": "E-mel sudah didaftarkan", + "username_taken": "Nama pengguna sudah didaftarkan", + "err.unknown_error": "Ralat tidak diketahui", + "err.internal_error": "Ralat dalaman", + "err.bad_input": "Input buruk", + "err.not_authorized": "Tidak dibenarkan", + "err.user_exists": "Pengguna wujud", + "err.no_such_user": "Tiada pengguna sedemikian", + "err.user_already_verified": "Pengguna telah pun disahkan", + "err.invalid_user_verification": "Pengesahan pengguna yang tidak sah", + "err.user_unverified": "Pengguna Tidak Disahkan", + "err.operation_temporarily_unavailable": "Tiada operasi buat sementara waktu", + "err.wrong_or_inexistent_plan": "Pelan salah atau tidak wujud", + "err.user_has_active_subscription": "Pengguna mempunyai langganan aktif", + "err.payment_error": "Ralat bayaran", + "err.no_codes_left": "Tiada lagi kod rujukan", + "err.wrong_code": "Kod rujukan salah", + "err.redeeming_own_code_not_allowed": "Menebus kod dari diri sendiri tidak dibenarkan", + "err.wrong_charge_id": "Caj ID salah", + "err.wrong_link_code": "Kod pautan salah", + "err.invalid_credentials": "Kelayakan pengguna yang diberikan tidak sah", + "footer.reseller": "Manjana Wang! Menjadi seorang reseller Lantern Pro. Klik Disini", + "footer.reseller.email_subject": "Beritahu saya mengenai Program Reseller Lantern!", + "footer.reseller.email_body": "Apabila anda menjadi seorang Reseller Lantern anda berpeluang menjana sehingga 25% bagi setiap jualan langganan Lantern Pro. Beritahulah kami mengapa anda ingin menjadi seorang reseller, di bawah.", + "feature.faster_speed": "Kelajuan Lebih Tinggi", + "feature.faster": "Pusat Data Lebih Cepat", + "feature.unlimited": "Data Tidak Terbatas", + "feature.nologs": "Tiada Log", + "feature.devices": "Sambungkan sehingga 3 peranti", + "feature.noads": "Tiada Iklan", + "feature.yinbi.tooltip": "Yayasan Yinbi memberikan 888 bilion mata wang kripto YNB secara eksklusif melalui Lantern kepada pembeli Lantern Pro. YNB akan diedarkan pada penghujung setiap hari, berdasarkan kuantiti Yinbi yang dikeluarkan pada hari itu, bilangan orang yang membuat peningkatan/pembaharuan dan jumlah tahun atau bilangan akaun yang anda beli. YNB akan didepositkan terus kepada Dompet Yinbi anda dalam Lantern!", + "feature.antiblock": "Rintangan Disekat", + "feature.data_center": "Pusat Data Lebih Baik", + "feature.free_yinbi": "Mata Wang Kripto Yinbi Percuma!", + "free.title": "Lantern Pro", + "free.desc": "Lebih Cepat. Lebih Kuat. Tidak Terbatas. Selamat.", + "free.link_account": "Sudah pun mempunyai satu akaun Pro? Pautkan akaun anda.", + "home.get_lantern_pro": "Dapatkan Lantern Pro", + "home.get_lantern_platinum": "Tingkatkan pelan anda", + "home.welcome_popup_subheader": "Selamat datang ke Lantern baharu!", + "home.welcome_popup_content_1": "Kami telah berusaha keras, mengemas kini Lantern dan menambah ciri baharu.", + "home.welcome_popup_content_2": "Di UI baharu kami, anda akan menemui bar carian yang membolehkan anda mencari fail yang dikongsi di rangkaian Lantern. Anda juga boleh menyumbang kandungan dengan menyiarkan fail sendiri. Ini adalah ciri Beta, jadi cubalah, dan beritahu kami pendapat anda, kami akan terus membuat penambahbaikan berdasarkan maklum balas anda.", + "home.welcome_popup_button": "Cubalah", + "input.email": "Emel", + "input.your_email": "Alamat Emel Anda", + "input.confirm_email": "Sahkan Alamat Emel", + "input.enter_email": "Masukkan emel anda", + "input.use_valid_email": "Tulis satu alamat emel yang sah", + "input.email_not_match": "Emel tidak sepadan", + "input.existing_email": "E-mel sedia ada", + "issue.your_email": "Emel Anda", + "issue.attach_image_failure": "Tidak dapat melampirkan imej", + "issue.try_again": "Sila cuba lagi", + "issue.select_issue": "Sila Pilih satu Isu", + "issue.selected_issue": "Pilih Isu", + "issue.select_issue_hint": "Pilih satu isu dari menu jatuh turun", + "issue.note": "Huraikan Isu anda", + "issue.description": "Penerangan Isu", + "issue.error": "Ralat melapor isu", + "issue.submit": "Hantar Laporan", + "issue.report_screenshot": "Seret imej atau klik untuk memuat naik petikan skrin", + "issue.reported": "Terima kasih kerana melaporkan isu anda, kami akan menghubungi anda melalui E-mel secepat mungkin", + "issue.report_sent": "Laporan Dihantar", + "issue.type.no_access": "Tidak boleh akses laman-laman disekat", + "issue.type.payment_fail": "Tidak boleh menyelesaikan bayaran ini", + "issue.type.cannot_login": "Tidak boleh log masuk", + "issue.type.always_spinning": "Pemutar muatan berputar tanpa terhenti-henti", + "issue.type.slow": "Lambat", + "issue.type.cannot_link_device": "Tidak boleh pautkan peranti", + "issue.type.crashes": "Lantern terhempas", + "issue.type.other": "Lain-lain", + "languages.title": "Bahasa", + "lantern.email": "E-mel Lantern", + "mobile.link": "Gunakan pautan untuk muat turun Lantern ke peranti Android anda:", + "mobile.title": "Dapatkan Versi Android", + "nav.about": "Mengenai", + "nav.account": "Pengurusan Akaun", + "nav.authorize": "Tambah Peranti", + "nav.authorized": "Peranti Dibenarkan", + "nav.unauthorized_link": "Peranti dibenarkan untuk Pro", + "nav.language": "Bahasa", + "nav.lantern": "Lantern", + "nav.mobile": "Dapatkan Versi Mudah Alih", + "nav.report_issue": "Melapor suatu Isu", + "nav.settings": "Tetapan", + "nav.support": "Sokongan", + "nav.verify": "Pengesahan Akaun", + "nav.yinbi": "Penebusan Yinbi", + "nav.home": "Utama", + "nav.discover": "Temui", + "nav.wallet": "Dompet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Cuba semula", + "notifications": "Pemberitahuan", + "notifications.whatisnew": "Apa yang Baharu?", + "password.change": "Ubah Kata Laluan", + "password.changed": "Kata Laluan Diubah", + "continue.to.pro": "Terus ke Pro", + "username": "Nama Pengguna", + "password.new": "Kata Laluan Baharu", + "password.requirements": "
Kata laluan mesti mengandungi yang berikut:
  • 8 atau lebih aksara
  • 1 huruf kecil
  • 1 huruf besar
  • Sekurang-kurangnya 1 nombor
  • Tidak ada dalam senarai kata laluan yang dikompromikan
", + "password.reset": "Tetapkan Semula Kata Laluan", + "paxful.buy": "Beli", + "paxful.payment": "Kaedah pembayaran", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Dompet Dalam Talian", + "paxful.bank": "Pindahan Bank", + "paxful.gamer_card": "Kad Permainan", + "paxful.gift_card": "Kad Hadiah", + "paxful.cash": "Bayaran Tunai", + "paxful.digital_currency": "Mata Wang Digital", + "paxful.button": "Tunjukkan Tawaran Terbaik", + "payment.close": "Tutup", + "payment.redirectErrorTitle": "Ralat menyambung ke pelayan pembayaran", + "payment.redirectErrorText": "Kami sedang berusaha menyelesaikan isu ini. Sila semak semula kemudian.", + "payment.wait_for_pro": "Terima kasih kerana membeli Lantern Pro. Sila tunggu sebentar bagi Lantern anda menjadi Pro secara automatik.", + "payment.moreOptions": "Lagi Pilihan", + "payment.fewerOptions": "Sedikit Pilihan", + "payment_methods.select_name": "Pilih kaedah pembayaran", + "payment_methods.alipay": "Kad Kredit / Alipay", + "payment_methods.shetab": "Bayaran Dunia Pantas (Shetab)", + "payment_methods.shetab.details.header": "Untuk membeli Lantern Pro", + "payment_methods.shetab.details.body": "Apabila anda mengklik teruskan ke pembelian, anda akan dihalakan smeula ke tapak luar untuk melengkapkan pembayaran dan mendapatkan kod pengaktifan anda.", + "payment_methods.shetab.details.tutorial_header": "Tutorial Farsi", + "payment_methods.shetab.details.purchase_voucher_button": "Teruskan ke Pembelian", + "payment_methods.shetab.details.input_code_button": "Kod Pengaktifan Input", + "plan.step1": "Langkah 1", + "plan.apply": "Guna", + "plan.step2": "Langkah 2", + "plan.most_popular": "Paling popular!", + "plan.step3": "Langkah 3", + "plan.choose_plan": "Pilih Pelan", + "plan.enter_email": "Masukkan email", + "plan.choose_method": "Pilih Kaedah Pembayaran", + "plan.bestValue": "Tawaran Terbaik!", + "plan.per_month": "setiap bulan", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 tahun", + "plan.add_referral": "Tambah Kod Rujukan", + "plan.years": "Pelan {{years}} tahun", + "plan.desc": "{{price}} dibil sekali", + "plan.bonus_months": "+{{bonusMonths}} bulan", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Pilih", + "plan.two_year": "Dua Tahun", + "plan.one_year": "Setahun", + "plan.savings": "Jimat {{formattedDiscount}} %", + "plans.title": "Pelan-pelan Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Bagi Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Mempunyai kod pengaktifan Lantern Pro? Klik di sini.", + "plans.with_voucher_code": "Ada kod pengaktifan? Tekan di sini.", + "pro.apply": "Kredit anda akan dimasukkan ke akaun anda pada kitaran pengebilan yang seterusnya.", + "pro.title": "Jemput rakan-rakan, dapatkan lebih Pro dengan percuma", + "pro.subtitle": "Apabila rakan anda membeli pelan dua tahun setiap anda akan mendapat 3 bulan tambahan Pro. pelan satu tahun akan memberikan setiap anda 1 bulan percuma.", + "pro.share": "Kongsi kod anda dengan rakan-rakan untuk mula menjana lebih kredit!", + "promotion.title": "Daftar keluar Lantern Pro", + "promotion.title.activation": "Pengaktifan Lantern Pro", + "promotion.enter_and_confirm_email": "Sila masukkan dan mengesahkan alamat emel anda", + "promotion.code.hint": "Masukkan kod Rujukan rakan anda (pilihan)", + "promotion.code.label": "Kod Rujukan", + "promotion.payment": "Teruskan untuk Bayaran", + "promotion.payment.btc": "Bayar dengan ₿", + "promotion.loading": "Muatan...", + "promotion.howto_1y": "Jika seorang rakan berkongsi kod rujukan dengan anda, masukkan kod itu untuk menerima satu bulan Lantern Pro percuma selepas daftar keluar.", + "promotion.howto_2y": "Jika seorang rakan berkongi kod rujukan dengan anda, masukkan kod itu untuk menerima tiga bulan Lantern Pro percuma selepas daftar keluar.", + "promotion.pay": "Bayar {{amaun}}", + "promotion.select": "Pilih", + "promotion.promotion_applied_1y": "+1 bulan bonus", + "promotion.promotion_applied_2y": "+3 bulan bonus", + "promotion.too_many_referrals": "Kod rujukan ini telah pun ditambahkan. Daftar keluar sekarang untuk menerima bulan tambahan anda.", + "promotion.activation.enter_and_confirm_email": "Sila masukkan dan mengesahkan alamat emel anda untuk mendaftar akaun Lantern Pro anda.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Kod pengaktifan", + "promotion.activation.instructions": "Masukkan e-mel anda dan kod pengaktifan 25 digit yang diterima daripada penjual semula untuk mendaftarkan akaun anda.", + "promotion.activation.howto": "Sila masukkan kod pengaktifan 25 aksara Latern Pro di atas. Jika anda tidak mempunyai kod, sila beli Pro dari skrin sebelum ini atau cari seorang reseller Lantern Pro secara online.", + "promotion.activation.continue": "Daftar untuk Pro", + "promotion.voucher.hint": "Kod pengaktifan", + "promotion.voucher.howto": "Masukkan kod pengaktifan Fast World Pay 12 aksara anda di atas", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Ralat ketika menebus kod pengaktifan anda.", + "promotion.voucher.error.invalid_code": "Kod pengaktifan tidak sah", + "promotion.voucher.error.invalid_plan": "Kod pengaktifan dikaitkan dengan pelan yang tidak sah", + "promotion.voucher.error.already_redeemed": "Kod pengaktifan telah ditebus", + "referral.code": "Kod rujukan", + "referral.text": "Guna kod saya %s dan dapatkan 3 bulan percuma apabila anda mendaftar!", + "referral.description_free": "Kongsi kod anda dengan rakan anda, dan dapatkan perkhidmatan Lantern Pro selama 1 bulan secara percuma semasa mereka Membeli Pro!", + "referral.description_pro": "Kongsi kod anda dengan rakan anda dan dapatkan 1 bulan perkhidmatan Lantern Pro Tambahan secara percuma semasa mereka Membeli Pro!", + "register": "Daftar", + "renew.subtitle_early": "Perbaharui selama 3 bulan percuma!", + "renew.subtitle_last_day": "Perbaharui selama 3 bulan percuma!", + "renew.subtitle_expired": "Perbaharui selama 45 hari percuma!", + "renew.details_early": "Keahlian Lantern Pro anda akan berakhir tidak lama lagi. Perbaharui sekarang dan nikmati percuma sehingga tiga bulan!", + "renew.details_last_day": "Keahlian Lantern Pro anda berakhir hari ini! Perbaharui sekarang dan nikmati percuma sehingga tiga bulan!", + "renew.details_expired": "Keahlian Lantern Pro anda telah tamat tempoh. Perbaharui sekarang dan nikmati percuma sehingga empat puluh lima hari!", + "renew.asterisk_early": "* Tawaran waktu terhad ini hanya sah untuk pembaharuan awal.", + "renew.asterisk_last_day": "* Ini adalah peluang terakhir anda untuk menerima tawaran istimewa ini!", + "renew.asterisk_expired": "* Ini adalah tawaran masa terhad!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 BULAN PERCUMA", + "renew.plan_renewal_bonus_months": "$%d%s + %d BULAN PERCUMA", + "renew.plan_renewal_bonus_days": "$%d%s + %d HARI PERCUMA", + "renew.next": "seterusnya", + "renew.decline": "Menolak Tawaran", + "renew.decline_question": "Adakah anda pasti ingin menolak tawaran ini?", + "renew.decline_yes": "Memperbaharui kemudian", + "renew.decline_dismiss": "Memperbaharui sekarang", + "renew.notification_title_30_days": "Memperbaharui Pro sekarang untuk penjimatan besar!", + "renew.notification_title_30_days_platinum": "Perbaharui Platinum sekarang untuk penjimatan besar!", + "renew.notification_text_30_days": "Akaun {{planName}} anda tamat dalam {{remainingDays}} hari. Perbaharui sekarang dan dapatkan hingga 3 bulan percuma.", + "renew.notification_title_2_days": "Diskaun {{planName}} berakhir esok!", + "renew.notification_text_2_days": "Akaun {{planName}} anda tamat tempoh esok. Jangan lepaskan peluang untuk mendapatkan diskaun besar.", + "renew.notification_title_last_day": "Peluang terakhir untuk mendapat diskaun!", + "renew.notification_text_last_day": "Akaun {{planName}} anda telah tamat tempoh. Perbaharui sekarang dan dapatkan hingga 3 bulan percuma.", + "replica.upload": "Muat naik", + "replica.favorite": "Kegemaran", + "replica.added_to_favorites": "Ditambah ke Kegemaran", + "replica.filedrop_error": "Ralat semasa memuat naik fail ini", + "replica.filedrop_error.file-too-large": "Saiz fail maksimum yang dibenarkan ialah {{fileSize}}", + "replica.filedrop_error.file-too-small": "Fail terlalu kecil", + "replica.filedrop_error.too-many-files": "Terlalu banyak fail", + "replica.filedrop_error.file-invalid-type": "Jenis fail ini tidak disokong pada masa ini", + "replica.filedrop_remove_file": "Alih keluar dari baris gilir", + "replica.post": "Muat Naik Fail", + "replica.relevance": "Keterkaitan", + "replica.upload_date": "Tarikh Muat Naik", + "replica.gallery_view": "Paparan Galeri", + "replica.list_view": "Paparan Senarai", + "replica.copy_lantern_link": "Salin Pautan Lantern", + "replica.documents": "Dokumen", + "replica.audio": "Audio", + "replica.application": "Aplikasi", + "replica.image": "Imej", + "replica.video": "Video", + "replica.web": "Web", + "replica.news": "Berita", + "replica.upload_alert.dont_show": "Jangan tunjukkan ini lagi", + "replica.upload_alert.cancel": "Batal Muat Naik", + "replica.upload_alert.resume": "Sambung Semula Muat Naik", + "replica.upload_alert.info": "Maklumat Penting!", + "replica.upload_alert.desc1": "Fail yang dimuat naik ke Lantern diedarkan dan didesentralisasi. Setelah ia diakses oleh pengguna lain, ia tidak dapat dipadam dari rangkaian oleh sesiapa pun, termasuk Lantern, walaupun ia dipadam dari senarai 'Fail Saya' anda.", + "replica.upload_alert.desc2": "Jangan menggunakan maklumat pengenalan diri peribadi di dalam fail atau nama fail semasa memuat naik kandungan sensitif.", + "replica.add_details": "Tambahkan butiran", + "replica.cannot_edit": "Nama fail tidak boleh diedit setelah diterbitkan.", + "replica.next": "Seterusnya", + "replica.previous": "Sebelumnya", + "replica.selectAll": "Pilih Semua", + "replica.search_replica": "Search", + "replica.search_results_info": "Tab ini hanya menunjukkan hasil Lantern.", + "replica.search_results_info_message": "Hasil Lantern terdiri daripada kandungan terkompromi yang dimuat naik oleh pengguna ke rangkaian Lantern.", + "replica.no_files_found": "Tiada Keputusan", + "replica.or_content": "kandungan anda sendiri untuk ditemui oleh orang lain!", + "replica.try_again": "Cuba kata kunci yang lain, atau", + "replica.upload_success": "Muat Naik Berjaya!", + "replica.cannot_preview": "Tiada pratonton untuk jenis fail ini", + "replica.no_description": "Tiada penerangan diberikan", + "replica.size": "Saiz", + "replica.uploaded": "Dimuat naik", + "replica.invalid_link": "Pautan Tidak Sah", + "replica.close": "Tutup", + "replica.files": "Fail", + "replica.upload_history": "Muat naik sejarah", + "replica.my_favorites": "Kegemaran", + "replica.no_uploads": "Tiada Muat Naik Lagi", + "replica.no_favorites": "Tiada Kegemaran Lagi", + "replica.mime_type": "Jenis fail: {{mime}}", + "replica.image_loading_error": "Ralat memuatkan imej", + "replica.play": "Main", + "replica.pause": "Jeda", + "replica.scrub": "Gerakkan", + "replica.skip_forward": "Langkau maju", + "replica.skip_backwards": "Langkau mundur", + "replica.trending_videos": "Video Sohor Kini", + "replica.file_uploaded": "Dimuat naik: {{days}} hari lalu", + "replica.file_size": "Saiz", + "replica.duration": "Tempoh", + "replica.filename": "Nama Fail", + "replica.filename_required": "Namakan Fail Anda", + "replica.description_optional": "Tambahkan penerangan", + "replica.expand": "Kembangkan butiran", + "replica.filetype": "Jenis fail", + "replica.sortby": "Isih Ikut", + "replica.link": "Pautan replika", + "replica.collapse": "Runtuhkan", + "replica.publish": "Terbitkan", + "replica.cancel": "Batal", + "replica.progress_current_upload": "Muat naik daripada", + "replica.progress_files": "fail", + "replica.progress_of": "daripada", + "replica.progress_upload_complete": "Selesai", + "replica.progress_upload_failure": "Muat naik gagal, sila cuba lagi.", + "replica.upload_in_progress": "Muat naik sedang berlangsung", + "replica.upload_pending": "Muat naik belum selesai", + "replica.upload_error": "Ralat muat naik", + "replica.upload_cancel": "Batal muat naik", + "replica.upload_confirm": "Adakah anda pasti mahu membatalkan muat naik?", + "replica.progress_view": "Paparan", + "replica.delete": "Padam", + "replica.remove": "Keluarkan", + "replica.delete_file": "Padam Fail", + "replica.remove_favorite": "Alih keluar dari Kegemaran", + "replica.failed_to_delete": "Gagal memadam", + "replica.failed_to_remove": "Gagal mengalih keluar", + "replica.link_lookup_failure": "Gagal mencari pautan", + "replica.delete_file_confirmation_1": "Adakah anda pasti anda mahu padam", + "replica.delete_file_confirmation_2": "dari muat naik anda", + "replica.remove_favorite_confirmation_1": "Adakah anda pasti mahu alih keluar", + "replica.remove_favorite_confirmation_2": "dari kegemaran anda", + "replica.share_file": "Kongsi Fail", + "replica.download_and_view": "Muat Turun/Paparan", + "replica.download": "Download", + "replica.copy_link": "Salin Pautan Replika", + "replica.find_file": "Cari fail", + "replica.file_drop_prompt": "Lepaskan fail untuk mula muat naik!", + "replica.empty_uploads_text1": "Klik", + "replica.empty_uploads_text2": "di sini", + "replica.empty_uploads_text3": "untuk membuat pos pertama anda.", + "replica.error_header": "Alamak", + "replica.error": "Terdapat ralat semasa memproses permintaan anda. Sila cuba lagi.", + "replica.serp_empty": "Google belum mengembalikan hasil untuk pertanyaan ini.", + "replica.disclaimer": "Lantern menjadikan carian anda berciri awanama dan melindungi carian anda daripada pihak ketiga", + "settings.general": "Am", + "settings.feedback": "Maklum Balas", + "settings.autoLaunch": "Lantern berjalan di sistem bermula", + "settings.autoReport": "Melapor statistiks penggunaan secara selamat untuk menyumbang kepada Lantern", + "settings.lantern_ads": "Tunjukkan Iklan Lantern", + "settings.lantern_ads_tooltip": "Lantern menunjukkan kepada anda iklan di beberapa laman web untuk membantu menyokong perkhidmatan kami. Tidak ada maklumat pengguna yang dikumpulkan atau dihantar ke pelayan kami. Sekiranya anda mematikan pilihan ini, anda mungkin masih melihat iklan, tetapi iklan tersebut bukan dari rangkaian Lantern.", + "settings.proxyAll": "Proksi semua trafik", + "settings.proxyAllHelpTitle": "APA YANG DIBUAT OLEH \"PROKSI SEMUA TRAFIK\"?", + "settings.proxyAllHelp1": "Jika diaktifkan, semua trafik akan dihantar melalui Lantern (pilihan paling Selamat).", + "settings.proxyAllHelp2": "Jika tidak diaktifkan, hanya trafik yang disekat dihantar melalui Lantern (pilihan paling cepat dan biasa).", + "settings.show_advanced": "Tunjukkan Tetapan Lanjutan", + "settings.hide_advanced": "Sembunyikan Tetapan Lanjutan", + "settings.systemProxy": "Mengurus sistem proksi", + "settings.title": "Tetapan", + "settings.http_proxy": "Proksi HTTP(S) :", + "settings.socks_proxy": "Proksi SOCKS :", + "settings.caution": "Berhati-hati:", + "settings.caution_text": "Jika anda nyahtanda \"Mengurus sistem proksi\", pelayar dan aplikasi anda tidak akan dapat menggunakan Lantern secara automatik. Jika anda tahu bagaimana untuk konfigurasi tetapan secara manual, sila rujuk maklumat di atas.", + "settings.select_language": "Pilih Bahasa", + "settings.diagnostics": "Lampirkan Maklumat Diagnostik", + "settings.diagnostics_tooltip": "Melampirkan maklumat diagnostik akan menghantar data pasukan Lantern yang diambil dari sambungan anda. Ini akan meningkatkan kemampuan kami untuk mengenal pasti dan menyelesaikan isu anda.", + "status.lantern": "Lantern adalah", + "status.click_reconnect": "Klik di sini untuk menyambung semula", + "status.server_location": "Lokasi Server", + "status.tooltip1": "Lantern menggunakan pilihan server pintar untuk menghubungkan anda kepada pusat-pusat data kami yang terbaik.", + "status.tooltip2": "Naik taraf ke Lantern Pro untuk kelajuan yang lebih pantas dengan pemilihan pelayan yang dioptimumkan dari pusat data Lantern Pro eksklusif kami", + "status.protected_connection": "Sambungan Anda Dilindungi", + "status.please_wait": "Ini mungkin mengambil masa satu atau dua minit...", + "status.connecting": "Sambungan...", + "status.no_internet": "Dimatikan", + "status.no_internet_connection": "Tiada sambungan Internet", + "status.connected": "Dihidupkan", + "status.disconnected": "Dimatikan", + "status.throttled": "Kelajuan Terganggu (Had Data)", + "status.no_system_proxy": "{{status}}, tidak menguruskan proksi sistem", + "status.fail_to_set_system_proxy": "Gagal menetapkan Lantern sebagai proksi sistem", + "status.fail_to_open_browser": "Gagal membuka tetingkap pelayar untuk menunjukkan antara muka pengguna Lantern", + "support.forum": "Forum Pengguna Lantern", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "Dengan mengklik {{buttonText}} , anda bersetuju dengan Syarat Perkhidmatan kami", + "terms_of_service.replica": "Dengan Mencari, memuat naik atau menggunakan produk kami dengan cara apa pun, anda bersetuju dengan Syarat Perkhidmatan, Dasar Privasi dan Dasar DMCA kami", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Masukkan atau Tampal Pin Pautan Peranti", + "verify.code": "Kod Pautan Peranti", + "verify.howto_1": "Jika anda mempunyai satu akaun Lantern Pro di peranti lain, sila masukkan aolamat emeil anda di sini untuk menerima satu kod bagi kebenaran peranti", + "verify.howto_1a": "Anda kini merupakan pengguna Pro yang tidak mempunyai kebenaran. Sila masukkan alamat emel anda untuk mengakrifkan akaun anda. Ini akan membolehkan anda paut kepada beberapa peranti.", + "verify.howto_2": "Untuk Memautkan Peranti ke Akaun Pro anda:", + "verify.howto_3": "1. Pilih 'Benarkan Peranti untuk Pro dari Menu peranti anda yang lain.", + "verify.howto_4": "2. Masukkan pin pemaut yang diperoleh dari langkah 1, dan serahkan.", + "verify.reminder": "*Pastikan kedua-dua peranti menjalankan versi terbaru Lantern", + "verify.enter_pin": "Masukkan atau Tampal Pin Pautan Peranti", + "verify.submit": "Hantar", + "verify.title": "Pengesahan Akaun", + "welcomeToPro.continue": "Terus ke Pro", + "welcomeToPro.invite": "Jemput rakan-rakan dan setiap anda akan mendapat 3 bulan percuma apabila mereka membeli pelan dua tahun, pelan satu tahun memberikan setiap anda 1 bulan percuma. Mula menjemput!", + "welcomeToPro.thanks": "Kini anda mempunyai akses tanpa had menggunakan pusat data terpantas kami. Maksimum tiga peranti boleh disambungkan dengan akaun anda.", + "welcomeToPro.title": "Selamat Datang ke Lantern Pro", + "welomeToPro.title_exclamation": "Selamat datang ke Lantern Pro!", + "purchase.failed": "Pembelian gagal. Sila cuba lagi kemudian.", + "purchase.success": "Pembelian Berjaya Dilakukan", + "purchase.success_title": "Selamat datang ke Lantern {{planType}}!", + "purchase.success_content_pro": "Anda kini mempunyai akses tanpa had menggunakan pusat data terpantas kami. Maksimum tiga peranti boleh disambungkan dengan akaun anda.", + "purchase.success_content_platinum": "Kini anda mempunyai akses tanpa had menggunakan talian khusus dan pusat data terpantas kami. Maksimum tiga peranti boleh disambungkan dengan akaun anda.", + "welcomeToPro.description": "Anda kini mempunyai akses tanpa had ke tapak dan perkhidmatan yang disekat", + "messages.copied_to_clipboard": "Kod Disalin. Kongsi dengan rakan-rakan anda!", + "messages.datacap": "Data kelajuan tinggi percuma habis. Upgrade ke Pro untuk data kelajuan tak terbatas.", + "messages.fatal_error": "Maaf, kami mempunyai masalah menghubungi server Lantern. Sila semat sambungan internet dan cuba lagi.", + "messages.backend_gone": "Maaf, Lantern seakan tidak berjalan lagi. Sila mulakan semula Lantern dan cuba lagi.", + "messages.get_help": "Dapatkan Bantuan", + "freeProCredits.title": "Menjemput Rakan-Rakan", + "freeProCredits.shareWithFriends": "Kongsi kod anda dengan rakan-rakan untuk menjana bulan percuma!", + "freeProCredits.shareWithFriendsDesc": "Apabila rakan anda membeli pelan dua tahun setiap anda akan mendapat 3 bulan percuma, pelan satu tahun akan memberi anda 1 bulan percuma,", + "cards.serverLocation.unknown": "Tidak diketahui", + "cards.serverLocation.description": "Lokasi Server yang Dioptimakan", + "cards.serverLocation.description-free": "Lokasi Server", + "cards.serverLocation.description-upgrade": "Upgrade untuk Server Lebih Cepat", + "cards.serverLocation.title": "Lokasi Kini:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern menggunakan pilihan server pintar untuk mencari secara automatik sambungan yang secepat mungkin untuk anda dari pusat-pusat data kami di Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore dan banyak lagi.", + "cards.serverLocation.text-free": "Lantern menggunakan pilihan server pintar untuk menghubungkan anda kepada pusat-pusat data kami yang terbaik.", + "cards.serverLocation.upgrade-link": "Upgrade ke Lantern Pro untuk kelajuan lebih tinggi dengan pilihan server yang dioptimakan dari pusat-pusat data Lantern Pro kami yang eksklusif.", + "cards.httpsUpgrades.description": "Upgrade HTTPS", + "cards.httpsUpgrades.title": "Upgrade HTTPS : %d", + "cards.httpsUpgrades.text": "Lantern akan upgrade sambungan HTTP yang tidak selamat secara automatik ke sambungan HTTP yang disulitkan dengan sebaik mungkin untuk menyimpan maklumat anda dengan sulit sementara melayar laman.", + "cards.adsBlocked.description": "Menyekat Iklan", + "cards.adsBlocked.title": "Iklan Disekat: %d", + "cards.adsBlocked.text": "Lantern menyekat iklan-iklan yang menggangu untuk melajukan masa muatan halaman web, jimat jalur lebar, dan memberi anda suatu pengalaman melayar yang lebih lancar.", + "cards.dataUsage.description": "Penggunaan Data", + "cards.dataUsage.upgrade": "Upgrade sekarang", + "cards.dataUsage.mb-used": "Anda telah menggunakan %d/%dMB dari data kelajuan tinggi bulanan anda.", + "cards.dataUsage.upgrade-link": "Upgrade sekarang untuk mendapatkan perkhidmatan kelajuan tinggi tidak terbatas!", + "cards.subscription.description": "Langganan Pro", + "cards.subscription.renew": "Memperbaharui", + "cards.subscription.months": "Anda masih mempunyai %d bulan dari langganan Lantern Pro anda.", + "cards.subscription.days": "Anda masih mempunyai %d hari dari langganan Lantern Pro anda.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "HARI", + "cards.subscription.renew-link": "Memperbaharui langganan anda untuk masa lanjutan.", + "auth.email": "Emel", + "auth.username": "Nama Pengguna", + "auth.username.or.email": "Nama Pengguna atau E-mel", + "auth.signin": "Sign In", + "current.password": "Kata Laluan Semasa", + "new.password": "Kata Laluan Baharu", + "auth.change.password": "Ubah Kata Laluan", + "confirm.new.password": "Sahkan Kata Laluan Baharu", + "auth.password": "Kata Laluan", + "auth.have.recovery.phrase": "Ada Frasa Pemulihan?", + "auth.forgot.password": "Lupa atau tidak mempunyai kata laluan?", + "auth.create.account": "Cipta Akaun", + "auth.missing.username": "Tiada nama pengguna", + "auth.missing.current.password": "Tiada kata laluan semasa", + "auth.missing.new.password": "Tiada kata laluan baharu", + "auth.missing.confirm.password": "Tiada kata laluan pengesahan", + "invalid_credentials": "Kelayakan Tidak Sah", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Cipta Dompet", + "new.to.yinbi": "Baru dengan Yinbi?", + "setup.wallet": "Ya, mari sediakan dompet baharu!", + "web.wallet": "Tidak, saya mempunyai Dompet di Laman Web Yin.bi", + "yinbi.next": "Seterusnya", + "yinbi.amount": "Amaun", + "yinbi.missing.address": "Tidak ada alamat destinasi diberikan", + "yinbi.missing.amount": "Tiada amaun dinyatakan", + "yinbi.missing.email": "Tidak ada alamat e-mel dinyatakan", + "yinbi.missing.username": "Tiada nama pengguna dinyatakan", + "yinbi.missing.password": "Tiada kata laluan dinyatakan", + "yinbi.invalid.address": "{{destination}} bukan alamat Stellar yang sah", + "yinbi.send": "Hantar", + "yinbi.to": "Kepada:", + "yinbi.try_again": "Cuba lagi?", + "yinbi.success.transaction": "Transaksi Berjaya!", + "yinbi.failure.transaction": "Transaksi Gagal", + "yinbi.confirm.transaction": "Sahkan Transaksi", + "yinbi.sent.details": "Anda telah menghantar {{amount}} YNB ke {{destination}}", + "yinbi.sent.failure.details": "Transaksi anda gagal kerana sebab berikut:", + "yinbi.recipient": "Penerima", + "yinbi.available.send": "Anda ada {{balance}} YNB tersedia untuk dihantar", + "yinbi.wallet.header": "Dompet", + "yinbi.send.header": "Hantar Yinbi", + "yinbi.recovery.phrase": "Frasa Pemulihan Yinbi", + "yinbi.recover.account": "Masukkan atau Tampalkan Frasa Pemulihan Yinbi anda untuk memulihkan Yinbi Wallet, dan akaun Lantern anda", + "yinbi.recovery.desc": "Gunakan kaedah ini jika anda mahu daftar masuk ke Yinbi Wallet selain daripada akaun Lantern anda", + "yinbi.redeem.codes": "Tebus Kod Yinbi Pukal", + "yinbi.obtain.codes": "Kod Penebusan Yinbi Pukal boleh didapati daripada reseller.lantern.io", + "yinbi.receive.header": "Terima Yinbi", + "yinbi.this.is.your.wallet": "Ini adalah alamat Yinbi wallet anda di mana orang boleh menghantar YNB kepada anda.", + "yinbi.your.address": "Alamat Anda", + "yinbi.no.activity.header": "Tiada Aktiviti", + "yinbi.upgrade.pro.button": "Naik Taraf ke Pro dan Dapatkan Yinbi Percuma", + "yinbi.renew.pro.button": "Perbaharui Pro dan Dapatkan Yinbi Percuma", + "yinbi.wallet.activity_header": "Aktiviti", + "yinbi.wallet.send": "Hantar", + "yinbi.wallet.receive": "Terima", + "yinbi.wallet.balance": "Baki", + "yinbi.wallet.getlantern.pro": "Dapatkan Lantern Pro + Yinbi Percuma", + "yinbi.redemption.codes": "Kod Penebusan Yinbi", + "redeem_codes.title": "Tebus Kod Yinbi", + "redeem_codes.redeem_button_text": "Tebus", + "redeem_codes.cancel_button_text": "Batal", + "redeem_codes.success": "Berjaya", + "redeem_codes.errors.missing_codes": "Tiada kod yang sah dimasukkan", + "redeem_codes.errors.invalid_codes": "Ralat, sila semak kod yang diserlahkan. Kod yang dipotong telah tamat tempoh dan tidak dapat ditebus lagi.", + "yinbi.new.account.text": "Setelah anda menghantar atau menerima Yinbi, transaksi anda akan muncul di sini.", + "yinbi.createAccount": "Cipta Akaun", + "yinbi.confirm.account.text": "Untuk memastikan bahawa anda menulis frasa dengan betul, sila masukkan perkataan berikut dari frasa pemulihan anda", + "create_account.invalid_words.error": "Perkataan yang dimasukkan tidak sepadan dengan frasa laluan pemulihan", + "yinbi.recovery_text": "Ini adalah Frasa Pemulihan Yinbi Wallet anda. Ini adalah SATU-SATUNYA kaedah untuk\n memulihkan Yinbi Wallet anda sekiranya terdapat kata laluan yang terlupa. Gunakan\n pengurus kata laluan atau buat salinan cetak semasa menyimpan frasa ini.", + "yinbi.recovery_confirm_text": "Ini adalah Frasa Pemulihan Yinbi Wallet anda. Ini adalah SATU-SATUNYA kaedah untuk memulihkan Yinbi Wallet anda sekiranya terdapat kata laluan yang terlupa. Gunakan pengurus kata laluan atau buat salinan cetak semasa menyimpan frasa ini.", + "yinbi.import.wallet": "Import Dompet", + "yinbi.setup.wallet": "Sediakan Dompet", + "yinbi.importWallet": "Import Yin.bi Wallet", + "yinbi.import.wallet.continue": "Teruskan ke Dompet Anda", + "yinbi.import.wallet.success": "Import Dompet Berjaya!", + "yinbi.wallet.text": "Untuk mengakses Yinbi Wallet, anda boleh Cipta Akaun, Daftar Masuk atau\nImport dompet anda dari Yin.bi jika anda telah mendaftar di laman web Yin.bi\nsebelumnya.", + "yinbi.wallet.pro.text": "Untuk mengakses Yinbi Wallet, anda boleh Cipta Akaun, Import dompet anda dari Yin.bi jika anda telah mendaftar sebelumnya.", + "yinbi.recovery_subheader": "Frasa Pemulihan Yinbi Wallet", + "yinbi.import_wallet.subheader": "Import Yinbi Wallet", + "yinbi.import_wallet.text": "Daftar masuk menggunakan kelayakan Yin.bi anda untuk memindahkan dompet anda ke Lantern", + "yinbi.import_wallet.success": "Dompet anda berjaya diimport sila tambah e-mel anda untuk menyelesaikan pendaftaran akaun.", + "yinbi.import_wallet.success_subheader": "Import Berjaya!", + "yinbi.import_wallet.button": "Import Yin.bi Wallet", + "yinbi.import_wallet.success_button": "Pendaftaran Lengkap", + "yinbi.recovery_passphrase.label_text": "Frasa Pemulihan", + "yinbi.recovery_passphrase.copy_button_text": "Salin", + "terms_of_service.notice": "Notis", + "terms_of_service.i_agree": "Saya setuju", + "platinum": "Platinum", + "platinum.one_year": "Harga 1 tahun", + "platinum.two_years": "Harga 2 tahun", + "platinum.save": "Penjimatan hingga {{savings}}%!", + "platinum.unlimited": "Data Tidak Terbatas", + "platinum.logs": "Tiada log", + "platinum.devices": "Sambungkan sehingga 3 peranti", + "platinum.everything_in_pro": "Semua termasuk dalam Pro", + "platinum.faster_data": "Pusat data lebih pantas", + "platinum.dedicated": "Talian khusus", + "platinum.reliability": "Keutuhan Dipertingkatkan", + "platinum.platinum_one_year": "Lantern Platinum 1 tahun", + "platinum.platinum_two_years": "Lantern Platinum 2 tahun", + "platinum.pro_one_year": "Lantern Pro 1 tahun", + "platinum.pro_two_years": "Lantern Pro 2 tahun", + "platinum.total": "Jumlah", + "platinum.free": "Percuma", + "platinum.credit.days": "+ {{ days }} hari", + "platinum.credit.months": "{{ months }} bulan", + "platinum.upgrade": "Tingkatkan kepada Platinum", + "platinum.upgrade_details": "Talian Khusus + Pusat Data Terpantas!", + "platinum.unused_time_disclaimer": "Pengguna Pro yang membuat peningkatan kepada Platinum akan dapat lihat langganan Pro mereka yang telah ditukar itu disenaraikan sebagai masa tambahan di atas.", + "p2p.opt_in_description": "Gunakan Internet anda untuk membantu orang lain mengakses Internet tanpa tapisan", + "p2p.active_sharing_description": "Perkongsian Internet anda dihidupkan", + "p2p.dialog.title": "Kongsikan akses Internet", + "p2p.dialog.text.1": "Bantu orang lain dengan memberikan akses terbatas kepada Internet melalui perkongsian sambungan anda. Dengan membenarkan akses kepada Internet anda, anda akan menyertai rangkaian sukarelawan yang menjadikan Internet lebih terbuka.", + "p2p.dialog.text.2": "Perkongsian ini tidak akan menjejaskan identiti atau keselamatan anda. Anda boleh menghentikan perkongsian Internt anda pada bila-bila masa yang anda kehendaki.", + "p2p.dialog.yes_button": "YA, MULAKAN PERKONGSIAN", + "p2p.dialog.no_button": "BATAL", + "p2p.banner.introducing": "MEMPERKENALKAN", + "top_sites.top_sites": "Tapak Teratas" +} \ No newline at end of file diff --git a/locale/translation/my.json b/locale/translation/my.json new file mode 100644 index 000000000..99f6f51bd --- /dev/null +++ b/locale/translation/my.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "မီးအိမ်", + "pro": "Pro", + "BEAM": "မီးတန်း", + "TRAY_STATUS": "အခြေအနေ - %v", + "TRAY_CONNECT": "ချိတ်ဆက်ပါ", + "TRAY_DISCONNECT": "ချိတ်ဆက်မှုဖြတ်ပါ", + "TRAY_SHOW": "%s ပြပါ", + "TRAY_UPGRADE_TO_PRO": "Pro သို့ အဆင့်မြှင့်တင်ရန်", + "TRAY_QUIT": "%s ကို ပိတ်ပါ", + "BACKEND_DATA_TITLE": "မြန်နှုန်းမြင့် %sဒေတာများ မရှိတော့ပါ", + "BACKEND_DATA_MESSAGE": "%s ကို မြန်နှုန်းအပြည့်ဖြင့် ဆက်လက်အသုံးပြုရန် Pro သို့အဆင့်မြှင့်ပါ။", + "BACKEND_DATA_PERCENT_TITLE": "သင့် %s ဒေတာများ၏ %sသို့ ရောက်ရှိခဲ့သည်", + "BACKEND_DATA_PERCENT_MESSAGE": "သင့် %s မြန်နှုန်းမြင့်ဒေတာများ၏ %s ကို သင်အသုံးပြုခဲ့ပြီးပြီ။ ယခုအဆင့်မြှင့်ပါ", + "BACKEND_CLICK_LABEL": "ဖွင့်", + "BACKEND_CLICK_LABEL_OPEN": "ဖွင့်", + "BACKEND_CLICK_LABEL_HELP": "ကူညီပါ", + "BACKEND_CLICK_LABEL_GOT_IT": "နားလည်ပြီ", + "BACKEND_AUTOUPDATED_TITLE": "%s ကို ဗားရှင်း %s သို့အပ်ဒိတ်လုပ်ပါ", + "BACKEND_AUTOUPDATED_MESSAGE": "%s%s ကို ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ။ အသုံးပြုရန် ကျေးဇူးပြု၍ %sကို ပြန်လည်စတင်ပါ။", + "BACKEND_MITM_INSTALL_CERT": "%s သည် စွမ်းဆောင်ရည်တိုးတက်စေရန် စိတ်ကြိုက်လက်မှတ်ကို တပ်ဆင်လိုသည်", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "ကျေးဇူးပြု၍ သင့်စနစ်အားပြောင်းလဲမှုပြုရန် % v ကို ခွင့်ပြုပါ", + "BACKEND_ALERT_TITLE": "အရေးကြီးသတိပေးချက်က သင့်ရဲ့အာရုံစူးစိုက်မှုကို လိုအပ်ပါတယ်", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s သည် ချွတ်ယွင်းချက်စစ်ဆေးရှာဖွေရေးကိရိယာများ တပ်ဆင်ရန် သင့်ခွင့်ပြုချက်လိုအပ်သည်။ ဤသည်ကသင့် %sအတွေ့အကြုံကို တိုးတက်အောင်ကူညီပါလိမ့်မည်။", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "သီးသန့်စီစဉ်ထားရှိမှုကို သိမ်းဆည်း၍မရနိုင်ပါ", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "အပလီကေးရှင်း သီးသန့်စီစဉ်ထားရှိမှုကို သိမ်းဆည်း၍မရနိုင်ပါ။ ဝင်ရောက်ကြည့်ရှုမှုကို ကြားခံအဖြစ် မှန်ကန်စွာဆောင်ရွက်မည်ဟု %s မှ အာမမခံနိုင်ပါ။", + "about.content": "Lantern သည် ပွင့်လင်းသောအင်တာနက်အား မြန်ဆန်ပြီး ယုံကြည်စိတ်ချရသော အသုံးပြုနိုင်ခွင့်ကို ပေးအပ်သည့် အက်ပလီကေးရှင်းတစ်ခု ဖြစ်ပါသည်။", + "app.error": "တစ်ခုခုမှားယွင်းသွားသည်။", + "about.faq": "Lantern မကြာခဏမေးလေ့ရှိသောမေးခွန်းများကို ဖတ်ပါ", + "about.open": "လူတိုင်းအတွက် ပွင့်လင်းသောအင်တာနက်", + "about.questions": "မေးခွန်းများ ရှိပါသလား", + "about.title": "အကြောင်း", + "account.add.password": "အကောင့်စကားဝှက်ထည့်ပါ", + "account.agree.terms": "ကျွန်ုပ်၏စကားဝှက်ကို ပျောက်ဆုံးခြင်းသည် အကောင့်အား ဝင်ရောက်သုံးစွဲမှုကို\nဆုံးရှုံးခြင်းဟု နားလည်ပါသည်။ Lantern သည် သင်၏ စကားဝှက်ကို\nပြန်လည်ရယူရန် မကူညီနိုင်ပါ။", + "account.agree.terms.error": "ပထမဦးစွာ စည်းမျဉ်းများကို သဘောတူရမည်", + "account.cancel": "Pro အကောင့်ကိုဖျက်သိမ်းပါ", + "account.created": "အကောင့် ဖန်တီးပြီးပြီ။", + "account.create.pro.account.header": "Pro အကောင့် ဖန်တီးပါ", + "account.create.pro.account.text": "Lantern သည် အသုံးပြုသူ အကောင့်များအား ကိုင်တွယ်စီမံပုံကို ပြောင်းလဲပေးနေပါသည်။ ယခုမှစ၍ Pro သုံးစွဲသူများသည် အသုံးပြုသူအမည်နှင့် စကားဝှက်ကို ဖန်တီးရန်လိုမည်ဖြစ်သည်။ အခြားစက်များထဲသို့ ဝင်ရန်နှင့် လုပ်ဆောင်ချက်အသစ်များအား ဝင်ရောက်သုံးစွဲမှုကို ပံ့ပိုးပေးရန် ဤအထောက်အထားများကို အသုံးပြုပါမည်။", + "account.have.a.account": "အကောင့် ရှိပါသလား။", + "account.link.username.pro": "အသုံးပြုသူအမည်ကို Pro အကောင့်နှင့် ချိတ်ဆက်ပါ", + "account.recovery": "အကောင့်ပြန်လည်ဆယ်ယူရေး", + "account.recovery.link.device": "ချိတ်ဆက်မှုကိရိယာ", + "account.recovery.device.code": "ကိရိယာချိတ်ဆက်ကုဒ်", + "account.recovery.device.enter.code": "ကိရိယာချိတ်ဆက်မှု ပင်နံပါတ်ကို ရိုက်ထည့်ပါ", + "account.recovery.device.instructions.header": "ဤကိရိယာကို သင်၏ Pro အကောင့်နှင့်ချိတ်ဆက်ရန်-", + "account.recovery.device.instructions.step.one": "၁။ သင်၏ Desktop Pro ကိရိယာရှိ Account Management မျက်နှာပြင်မှ၊ သို့မဟုတ် Mobile Pro ကိရိယာရှိ မီနူးမှ 'ကိရိယာချိတ်ဆက်ရန်' ရွေးစရာကို ရွေးချယ်ပါ။", + "account.recovery.device.instructions.step.two": "၂။ ကိရိယာချိတ်ဆက်မှု ကုဒ်နံပါတ်ကို ရိုက်ထည့်ပြီး တင်သွင်းပါ။", + "account.recovery.device.instructions.part.three": "* ကိရိယာနှစ်ခုစလုံးသည် Lantern ၏ နောက်ဆုံးထွက်ဗားရှင်းကို အသုံးပြုထားကြောင်းသေချာပါစေ", + "account.recovery.method": "သင့်အကောင့်ကိုပြန်လည်ရယူရန် နည်းလမ်းတစ်ခုကို ရွေးချယ်ပါ", + "account.recovery.send.email": "အီးမေးလ်ပို့ပါ", + "account.recovery.submit": "တင်သွင်းပါ", + "account.recovery.success": "ချိတ်ဆက်မှုအောင်မြင်ပါသည်", + "account.pro_management": "Pro အကောင့်စီမံခန့်ခွဲမှု", + "account.free_management": "အကောင့်စီမံခန့်ခွဲမှု", + "account.free.cap": "အခမဲ့ဒေတာ {{mb}} MB ကျန်ရှိနေသည်။ {{reset}} တွင် ပြန်လည်သတ်မှတ်သည်", + "account.free.cap.upgrade": "အကန့်အသတ်မဲ့မြန်နှုန်းမြင့်ဒေတာအတွက် Pro ကိုအဆင့်မြှင့်ပါ", + "account.freelink.validFor": "%sအတွက်မှန်ကန်သည်", + "account.freelink.desc": "သင်၏ Pro အကောင့်ကိုအသုံးပြုရန်အတွက် ဤကိရိယာကိုခွင့်ပြုရန်-", + "account.freelink.step1": "၁။ သင်၏ Pro ကိရိယာရှိ မီနူးမှ 'ကိရိယာချိတ်ဆက်ရန်' ကိုရွေးပါ", + "account.freelink.step2": "၂။ ကိရိယာချိတ်ဆက်မှုကုဒ်နံပါတ်ကို ရိုက်ထည့်ပြီး တင်သွင်းပါ။", + "account.freelink.reminder": "* ကိရိယာနှစ်ခုစလုံးသည် Lantern ၏ နောက်ဆုံးထွက်ဗားရှင်းကို အသုံးပြုထားကြောင်းသေချာပါစေ", + "account.freelink.errorTitle": "ချိတ်ဆက်မှုအမှား", + "account.freelink.errorText": "သင်၏ Pro ကိရိယာတွင် ကုဒ်နံပါတ်ထည့်ပြီးတာ သေချာလား။", + "account.freelink.headerDesc": "ဒီကိရိယာကို သင်၏ Pro အကောင့်နှင့်ချိတ်ဆက်ပါ", + "account.freelink.title": "ကိရိယာချိတ်ဆက်ကုဒ်", + "account.pro.charge": "သင်၏ငွေတောင်းခံလွှာကုန်ဆုံးချိန်တွင် သင်၏အကောင့်ကို Lantern Pro နောက်တစ်နှစ်အတွက် အလိုအလျောက်ကောက်ခံပါမည်။", + "account.upgrade_pro": "Pro ကို အဆင့်မြှင့်တင်ပါ", + "account.upgrade": "အဆင့်မြှင့်တင်ပါ", + "account.upgrade_platinum": "Upgrade to Platinum", + "account.create": "အကောင့်ပြုလုပ်ပါ", + "account.email": "အီးမေးလ်", + "account.confirm.password": "စကားဝှက်အတည်ပြုခြင်း", + "account.password": "စကားဝှက်", + "account.pro.email": "အီးမေး-", + "account.pro.expiration": "Pro အကောင့်သက်တမ်းကုန်ဆုံးခြင်း", + "account.platinum.expiration": "Platinum Account Expiration", + "account.pro.expired": "သင်၏ Pro အကောင့်သက်တမ်းကုန်သွားပြီ။ အကန့်အသတ်မဲ့လစဉ်ဒေတာအတွက် ယခုသက်တမ်းတိုးပါ။", + "account.pro.expiry": "သင်၏ Pro အကောင့်သည် %s တွင် %s ရက်အတွင်း သက်တမ်းကုန်ဆုံးပါမည်။", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(ဤကိရိယာ)", + "account.pro.logout": "ထွက်သွားပါ", + "account.pro.removedevice": "ဖယ်ရှားလိုက်ပါ", + "account.pro.devices": "Lantern Pro စက်ပစ္စည်းများ (၃ခုအထိ)", + "account.pro.device.confirm.title": "စက်ပစ္စည်းကို ခွင့်ပြုချက်ပယ်ဖျက်ရန်", + "account.pro.device.confirm": "သင်၏ Lantern Pro အကောင့်မှ '{{device}}' ကို သင်ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။", + "account.pro.device.one.title": "ကိရိယာတစ်ခုတည်း", + "account.pro.device.one": "စိတ်မကောင်းပါ၊ သင်နောက်ဆုံးခွင့်ပြုထားသောကိရိယာကို သင်မဖယ်ရှားနိုင်ပါ။", + "account.pro.linkingcode": "ကိရိယာချိတ်ဆက်မှုကုဒ်-", + "account.pro.renew": "Pro အကောင့်ကို သက်တမ်းတိုးပါ", + "account.platinum.renew": "Renew Platinum Account", + "account.pro.renew_CN": "သက်တမ်းတိုး", + "account.prolink.errorTitle": "ချိတ်ဆက်မှုအမှား", + "account.prolink.errorText": "သင်သည် သင်၏အခြားစက်ပစ္စည်းမှ ကုဒ်နံပါတ်ကို မှန်ကန်စွာကူးယူထားကြောင်း သေချာပါသလား။", + "account.prolink.successTitle": "ကိရိယာချိတ်ဆက်ပြီး", + "account.prolink.successText": "သင်၏ကိရိယာကို အောင်မြင်စွာချိတ်ဆက်ပြီးပါပြီ။ သင်၏အခြားကိရိယာသည် အလိုအလျောက် Pro ဖြစ်လာစေရန် ခဏစောင့်ပါ။", + "account.signin": "ဆိုင်းအင်လုပ်ခြင်း", + "account.signout": "ဆိုင်းအောက်", + "account.submit": "တင်သွင်းပါ", + "account.username": "အသုံးပြုသူအမည်", + "account.switch.to.register": "အကောင့်ဖန်တီးမည်ကို ပြောင်းပါ", + "account.switch.to.signin": "ဝင်မည်သို့ ပြောင်းပါ", + "account.invalid.username": "သုံးစွဲသူအမည်မမှန်ကန်ပါ", + "account.invalid.email": "အီးမေးလ်မမှန်ကန်ပါ", + "account.password.mismatch": "အတည်ပြုစကားဝှက်က စကားဝှက်နှင့်မကိုက်ညီပါ", + "account.password.short": "စကားဝှက်က အရမ်းတိုတယ်", + "account.password.lowercase": "စကားဝှက်မှာ အနည်းဆုံးစာလုံးအသေးတစ်လုံး ပါရမယ်", + "account.password.uppercase": "စကားဝှက်မှာ အနည်းဆုံးစာလုံးအကြီးတစ်လုံး ပါရမယ်", + "account.password.number": "စကားဝှက်မှာ အနည်းဆုံးနံပါတ်တစ်လုံး ပါရမယ်", + "account.password.compromised": "စကားဝှက်သည် အားနည်းသောစကားဝှက်များစာရင်းတွင် ပေါ်နေသည်", + "modal.register.free.header": "Yinbi ပိုက်ဆံအိတ်ကိုဝင်ရောက်ရန် မှတ်ပုံတင်ပါ သို့မဟုတ် ဆိုင်းအင်လုပ်ပါ", + "modal.register.pro.header": "Yinbi Wallet ကို ဝင်ရန် အကောင့်စကားဝှက်ထည့်ပါ", + "modal.register.pro.signin.header": "Yinbi ဝေါလက်ကို ဝင်ရောက်သုံးစွဲရန် ဝင်ပါ", + "modal.register.free.text": "Yinbi ပိုက်ဆံအိတ်ကိုအသုံးပြုရန် သင့်တွင် Lantern အကောင့်တစ်ခုရှိရမည်၊ ဆက်လုပ်ရန်အတွက် မှတ်ပုံတင်ပါ သို့မဟုတ် ဆိုင်းအင်လုပ်ပါ", + "modal.register.pro.text": "Yinbi ပိုက်ဆံအိတ်ကိုသုံးရန် သင်၏ Lantern အကောင့်သို့ စကားဝှက်တစ်ခုထည့်ရမည်။", + "modal.register.pro.signin.text": "Yinbi ဝေါလက်ကိုသုံးရန် သင်၏ Lantern အကောင့်ထဲသို့ ဝင်ရပါမည်", + "adyen.paymentMethods.title": "ငွေပေးချေမှုနည်းလမ်းများ", + "adyen.paymentMethods.storedMethods": "သင့်ငွေပေးချေမှုနည်းလမ်းများ", + "adyen.paymentMethods.otherMethods": "အခြားနည်းလမ်းကိုရွေးချယ်ပါ", + "adyen.paymentMethods.moreMethodsButton": "နောက်ထပ်ငွေပေးချေမှုနည်းလမ်းများ", + "adyen.payButton": "ပေးဆောင်ပါ", + "adyen.payButton.formatted": "%@ ကို ပေးဆောင်ပါ", + "adyen.cancelButton": "ပယ်ဖျက်ပါ", + "adyen.dismissButton": "အိုကေ", + "adyen.storeDetails": "ကျွန်ုပ်၏နောက်တစ်ကြိမ်ငွေပေးချေမှုအတွက် သိမ်းဆည်းပါ", + "adyen.payment.redirecting": "သင့်ကို ပြန်လည်လမ်းညွှန်ပေးလိမ့်မည်", + "adyen.payment.processing": "သင့်ငွေပေးချေမှုကို လုပ်ဆောင်နေသည်", + "adyen.creditCard.title": "ကတ်အသေးစိတ်အချက်များ", + "adyen.creditCard.holderName": "ကတ်ကိုင်ဆောင်သူအမည်", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "ကတ်နံပါတ်", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "မမှန်ကန်သောကတ်နံပါတ်", + "adyen.creditCard.expiryDateField.title": "သက်တမ်းကုန်ဆုံးရက်", + "adyen.creditCard.expiryDateField.placeholder": "လ / နှစ်", + "adyen.creditCard.expiryDateField.invalid": "မမှန်ကန်သော သက်တမ်းကုန်ဆုံးရက်", + "adyen.creditCard.expiryDateField.month": "လ", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "နှစ်", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "အရစ်ကျအရေအတွက်", + "adyen.creditCard.storeDetailsButton": "ကျွန်ုပ်၏နောက်ငွေပေးချေမှုအတွက် ဒီကတ်ကိုမှတ်ထားပေးပါ", + "adyen.creditCard.oneClickVerification.title": "သင့်ကတ်ကို စစ်ဆေးအတည်ပြုပါ", + "adyen.creditCard.oneClickVerification.message": "%@ အတွက် CVC ကုဒ်ကို ရိုက်ထည့်ပါ", + "adyen.creditCard.oneClickVerification.invalidInput.title": "မမှန်ကန်သော CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "ကျေးဇူးပြု၍ မှန်ကန်သော CVC ကိုရိုက်ထည့်ပေးပါ။", + "adyen.sepaDirectDebit.ibanField.title": "အကောင့်နံပါတ် (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "မမှန်ကန်သောအကောင့်နံပါတ်", + "adyen.sepaDirectDebit.nameField.title": "ကိုင်ဆောင်သူအမည်", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "အောက်ပါငွေပမာဏကို ကျွန်ုပ်၏ဘဏ်အကောင့်မှ ငွေဖြည့်မည်ဟု ကျွန်ုပ်သဘောတူသည်။", + "adyen.sepa.ownerName": "ကိုင်ဆောင်သူအမည်", + "adyen.sepa.ibanNumber": "အကောင့်နံပါတ် (IBAN)", + "adyen.giropay.searchField.placeholder": "ဘဏ်အမည် / BIC / ဘဏ်ကုဒ်", + "adyen.giropay.minimumLength": "အနည်းဆုံး စာလုံး၃လုံး", + "adyen.giropay.noResults": "ရှာဖွေမှုရလဒ်မရှိပါ", + "adyen.error.title": "အမှား", + "adyen.error.subtitle.redirect": "ပြန်လည်လမ်းညွှန်မှု မအောင်မြင်ပါ", + "adyen.error.subtitle.payment": "ငွေပေးချေမှုမအောင်မြင်ပါ", + "adyen.error.subtitle.refused": "ငွေပေးချေမှုကိုငြင်းဆန်ခဲ့သည်", + "adyen.error.message.unknown": "မသိရှိသောအမှားတစ်ခု ဖြစ်ပွားခဲ့သည်", + "adyen.error.message.cannotConnectToInternet": "အင်တာနက်ဆက်သွယ်မှုမအောင်မြင်ပါ - ကျေးဇူးပြု၍ သင်၏အင်တာနက်ဆက်သွယ်မှုကိုစစ်ဆေးပါ။", + "adyen.error.message.cannotConnectToHost": "ကျွန်ုပ်တို့၏ငွေပေးချေမှုဆာဗာနှင့် ဆက်သွယ်မှုမအောင်မြင်ပါ။", + "adyen.error.retryButton": "ထပ်ကြိုးစားပါ", + "adyen.idealIssuer.selectField.title": "ဘဏ်", + "adyen.idealIssuer.selectField.placeholder": "သင့်ဘဏ်ကိုရွေးချယ်ပါ", + "adyen.creditCard.success": "ငွေပေးချေမှုအောင်မြင်သည်", + "adyen.oneClick.confirmationAlert.title": "%@ ငွေပေးချေမှုကိုအတည်ပြုပါ", + "adyen.redirect.cannotOpenApp.title": "အက်ပ်ကိုဖွင့်၍မရပါ", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "ဤကိရိယာတွင် ၎င်းကို ထည့်သွင်းမထားသောကြောင့် ဤအက်ပ်ကိုဖွင့်၍မရပါ။", + "adyen.holderName": "ကတ်ကိုင်ဆောင်သူအမည်", + "adyen.countryCode": "နိုင်ငံကုဒ်", + "adyen.telephone.number": "တယ်လီဖုန်းနံပါတ်", + "android.download": "Lantern Android", + "android.download.title": "Lantern Android ကို ဒေါင်းလုဒ်လုပ်ပါ", + "authorize.title": "Pro အတွက် ကိရိယာကိုခွင့်ပြုပါ", + "authorize.step1.have_pro_device": "ငါ့မှာ Lantern Pro ကိရိယာ နောက်တစ်ခုရှိသေးတယ်", + "authorize.step1.link": "ကိရိယာချိတ်ဆက်မှု", + "authorize.step1.email_linking": "အီးမေးလ်ချိတ်ဆက်မှု", + "authorize.device_linking_explanation": "အကယ်၍ သင်သည် အခြားကိရိယာတစ်ခုထဲသို့ဆိုင်းအင်ဝင်ပြီး ၎င်းမှာ သင်နှင့်အတူရှိပါက ဤနည်းလမ်းကိုသုံးပါ", + "authorize.device_email_explanation": "သင်၏ ကိရိယာချိတ်ဆက်မှု ပင်နံပါတ်ကို သင့်အီးမေးလ်သို့ ပို့စေလိုပါက ဤနည်းလမ်းကိုသုံးပါ", + "authorize.link_device": "ချိတ်ဆက်မှုကိရိယာ", + "authorize.step1.choose": "ကျေးဇူးပြု၍ သင်၏အကောင့်နှင့်ချိတ်ဆက်ရန် နည်းလမ်းကို ရွေးချယ်ပါ", + "authorize.step1.or": "ဒါမှမဟုတ်", + "authorize.step1.recover": "ကျွန်ုပ်၏ Lantern Pro အကောင့်ကို ပြန်လည်ရယူရန် လိုအပ်ပါသည်", + "authorize.step1.start": "ပြန်လည်ရယူရေးကိုစတင်ပါ", + "authorize.step1.no_mail": "သင့်ရဲ့အီးမေးလ်လိပ်စာကိုမမှတ်မိဘူးလား", + "authorize.step1.description": "သင်၏အီးမေးလ်ကို ရိုက်ထည့်ပါ၊ အကယ်၍ အကောင့်ရှိပါက ကိရိယာချိတ်ဆက်မှုကုဒ်နံပါတ်ကို အီးမေးလ်တစ်စောင်ဖြင့် ပို့ပေးပါမည်", + "authorize.step2b.enter_code": "သင်၏ အကောင့်ပြန်လည်ရယူရေး ကုဒ်နံပါတ်ကို ရိုက်ပါ", + "authorize.step2b.code": "အကောင့်ပြန်လည်ရယူရေးကုဒ်", + "authorize.step2b.instruction": "ဤအကောင့်တည်ရှိပါက ပြန်လည်ရယူရေးကုဒ်ပါသော အီးမေးလ်တစ်စောင်ကို {{email}} သို့ ပို့လိုက်ပါပြီ။ ဤအီးမေးလ်ရောက်ရှိရန် နာရီပေါင်းများစွာကြာနိုင်သည်။ သင် ၎င်းကိုမတွေ့ပါက သင်၏အမှိုက်စာဖိုင်တွဲကို စစ်ဆေးပါ။", + "authorize.step2b.no_mail": "အီးမေးလ်ကို မရရှိခဲ့ပါ", + "authorize.step3.recovery": "အကောင့်ပြန်လည်ရယူရေး", + "authorize.step3.no_email": "အိုး၊ ဒီအီးမေးလ်လိပ်စာကိုရှာရတာ အခက်တွေ့နေတယ်။ သင့်အကောင့်ကို ရှာဖွေဖို့ အကူအညီရရန် ကျေးဇူးပြု၍ အောက်ပါအချက်အလက်များကို ထပ်ပေးပါ။", + "authorize.step3.no_code_received": "ပြန်လည်ရယူရေးအီးမေးလ်ကို လက်ခံရရှိရန် အခက်အခဲရှိပါသလား။ အောက်ဖော်ပြပါအချက်အလက်များကိုဖြည့်စွက်ပြီး ၄၈ နာရီအတွင်း ကျွန်ုပ်တို့ဆက်သွယ်ပါမည်။", + "authorize.step3.your_email": "သင်၏အီးမေးလ်", + "authorize.step3.payment_method": "ငွေပေးချေမှုနည်းလမ်း", + "authorize.step3.payment_method_hint": "သင် Pro ရယူရန် အသုံးပြုခဲ့သော ငွေပေးချေမှုနည်းလမ်းကို ရွေးချယ်ပါ", + "authorize.step3.credit_card": "အကြွေးဝယ်ကဒ်", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "မိတ်ဆွေတစ်ဦးကို ညွှန်းပေးခြင်းဖြင့် Pro ကိုလက်ခံရရှိခဲ့သည်", + "authorize.step3.payment_account": "ငွေပေးချေမှုအကောင့်", + "authorize.step3.payment_account_hint": "သင်၏ Alipay အကောင့်အချက်အလက်ကိုရိုက်ထည့်ပါ", + "authorize.step3.referral_code": "သင်၏ရည်ညွှန်းကုဒ်", + "authorize.step3.purchase_date": "ဝယ်ယူသည့်နေ့ရက်", + "authorize.step3.note": "သင်၏အကောင့်ကို ရှာဖွေရာတွင် အကူအညီဖြစ်နိုင်သည့် အခြားအချက်အလက်များကို ကျေးဇူးပြု၍ ဖော်ပြပါ။", + "authorize.step4.title": "အကောင့်ပြန်လည်ရယူမှု ဆောင်ရွက်နေသည်", + "authorize.step4.text1": "ကျေးဇူးတင်ပါတယ်။ သင့်အကောင့်ပြန်လည်ရယူရေးတောင်းဆိုချက်ကို လက်ခံရရှိပါပြီ", + "authorize.step4.text2": "သင်၏ Pro အကောင့်အချက်အလက်များကိုပြန်လည်ရယူရန် ၄၈ နာရီခွင့်ပြုပါ။", + "authorize.step4.text3": "ကျွန်ုပ်တို့သည် ယခင်မျက်နှာပြင်တွင်ရိုက်ထည့်ခဲ့သော အီးမေးလ်လိပ်စာသို့ သတင်းအချက်အလက်များပေးပို့ပါမည်။", + "authorized.continue": "Pro ကိုဆက်သွားပါ", + "authorized.continue.lantern": "Lantern ကို ဆက်သွားပါ", + "authorized.text": "ဤစက်ပစ္စည်းသည် သင်၏ Lantern Pro အကောင့်ကိုအသုံးပြုရန် ခွင့်ပြုချက်ရပြီဖြစ်သည်။", + "authorized.title": "ကိရိယာခွင့်ပြုချက်", + "button.account": "အကောင့်", + "button.renew": "သက်တမ်းတိုး", + "button.upgrade": "အဆင့်မြှင့်တင်ပါ", + "button.upgrade_now": "ယခုအဆင့်မြှင့်ပါ", + "button.upgrade_to_lantern_pro": "Lantern Pro ကိုအဆင့်မြှင့်တင်ပါ", + "button.copy_your_code": "သင့်ရဲ့ကုဒ်ကူးယူပါ", + "button.try_again": "ထပ်ကြိုးစားပါ", + "button.continue": "ဆက်လုပ်ပါ", + "button.continue_to": "Continue to {{planType}}", + "bullet.click_button": "အောက်ကခလုတ်ကိုနှိပ်ပါ", + "bullet.paste_code": "မက်ဆေ့ခ်ျတစ်စောင်ထဲမှာ ကုဒ်နှင့် ဒေါင်းလုဒ်လင့်ခ်ကို paste လုပ်ပါ", + "bullet.send_to_friends": "သင့်သူငယ်ချင်းများထံပို့ပါ", + "cancel": "ပယ်ဖျက်ပါ", + "confirm": "အတည်ပြုပါ", + "norecoveryyinbi": "* Yinbi Wallet ကိုပြန်လည်မရယူနိုင်ပါ", + "email.recovery.check.email": "သင့်ရဲ့အီးမေးလ်ကို ပြန်လည်ရယူရေးကုဒ်ပါသော မက်ဆေ့ချ်ဝင်မဝင် စစ်ဆေးပါ", + "email.recovery.code.label": "ပြန်လည်ရယူရေးကုဒ်ကို ရိုက်ထည့်ပါ", + "email.recovery.no.code": "ကုဒ်မရဘူးလား", + "email.recovery.text": "သင်၏အီးမေးလ်ကို ရိုက်ထည့်ပေးပါ၊ သင့်စကားဝှက်ကိုပြန်လည်သတ်မှတ်ရန် ကုဒ်တစ်ခုပို့ပေးပါမည်။ သင့်တွင် Yinbi ပိုက်ဆံအိတ်ရှိပါက သင်၏ Yinbi ပိုက်ဆံအိတ်ကို ၎င်းက ပြန်လည်ရယူပေးမည်မဟုတ်ပါ။ Yinbi ပိုက်ဆံအိတ်ကိုပြန်လည်ရယူရန် Yinbi Recovery Phrase ထဲသို့ဝင်ရောက်ပါ။", + "email.recovery.desc": "သင်၏အီးမေးလ်သို့ ပြန်လည်ရယူရေးကုဒ်တစ်ခု ပေးပို့စေလိုပါက ဤနည်းလမ်းကိုအသုံးပြုပါ", + "device.recovery.desc": "အကယ်၍ သင်သည် အခြားကိရိယာတစ်ခုထဲသို့ဆိုင်းအင်ဝင်ပြီး ၎င်းမှာ သင်နှင့်အတူရှိပါက ဤနည်းလမ်းကိုသုံးပါ", + "google_search": "Google Search", + "giveaway.upgrade": "ဒီနေ့အခမဲ့ဖြန့်ဖြူးမှုကို လက်ခံရရှိရန် အဆင့်မြှင့်ပါ", + "giveaway.title_released_today": "{{formattedTokens}} YNB ကို ယနေ့ ထုတ်ဝေနေသည်", + "giveaway.what_is_it": "Yinbi Giveaway ဆိုတာ ဘာလဲ။", + "giveaway.description1": "Yinbi ဖောင်ဒေးရှင်းသည် Lantern Pro ဝယ်သူများကို ၈၈၈ ဘီလီယံ YNB cryptocurrency အား Lantern မှတစ်ဆင့်ပေးအပ်သည်။", + "giveaway.description2": "ထိုနေ့တွင်ထုတ်ဝေသော Yinbi အရေအတွက်၊ အဆင့်မြှင့်တင်/အသစ်ပြောင်းလဲသည့် လူအရေအတွက်နှင့် သင်ဝယ်ယူသောနှစ် သို့မဟုတ် အကောင့်အရေအတွက်အပေါ် အခြေခံ၍ နေ့စဉ်ကုန်ဆုံးချိန်တွင် YNB ကို ဖြန့်ဝေပါမည်။ YNB ကို Lantern ရှိ သင်၏ Yinbi ဝေါလက်ထဲသို့ တိုက်ရိုက်ထည့်သွင်းပါမည်။", + "giveaway.learn_more": "ပိုမိုသိရှိရန်", + "link_device": "Pro အကောင့်ရှိပြီးသားလား။ ကိရိယာကို ချိတ်ဆက်ပါ", + "email.recovery": "အီးမေးလ်ပြန်လည်ရယူခြင်း", + "email_taken": "အီးမေးလ်ကိုမှတ်ပုံတင်ပြီးဖြစ်သည်", + "username_taken": "အသုံးပြုသူအမည်ကိုမှတ်ပုံတင်ပြီးဖြစ်သည်", + "err.unknown_error": "မသိသောအမှား", + "err.internal_error": "အတွင်းပိုင်းအမှား", + "err.bad_input": "မကောင်းတဲ့ input", + "err.not_authorized": "ခွင့်ပြုမထားပါ", + "err.user_exists": "အသုံးပြုသူတည်ရှိပါသည်", + "err.no_such_user": "ထိုကဲ့သို့သောအသုံးပြုသူမရှိပါ", + "err.user_already_verified": "အသုံးပြုသူသည်အတည်ပြုပြီးဖြစ်သည်", + "err.invalid_user_verification": "မမှန်ကန်သောအသုံးပြုသူအတည်ပြုချက်", + "err.user_unverified": "အသုံးပြုသူကို အတည်မပြုနိုင်ပါ", + "err.operation_temporarily_unavailable": "လုပ်ငန်းဆောင်ရွက်မှုကို ယာယီမရနိုင်ပါ", + "err.wrong_or_inexistent_plan": "မှားယွင်းသော သို့မဟုတ် မတည်ရှိသော အစီအမံ", + "err.user_has_active_subscription": "အသုံးပြုသူသည်တက်ကြွစွာစာရင်းသွင်းထားပါသည်", + "err.payment_error": "ငွေပေးချေမှုအမှား", + "err.no_codes_left": "လွှဲပြောင်းကုဒ်မကျန်ပါ", + "err.wrong_code": "လွှဲပြောင်းကုဒ်မှားယွင်းနေသည်", + "err.redeeming_own_code_not_allowed": "မိမိကိုယ်ပိုင်ကုဒ်များကို လဲလှယ်ထုတ်ယူခွင့်မပြုပါ", + "err.wrong_charge_id": "မှားယွင်းစွာဖော်ပြထားသော ID", + "err.wrong_link_code": "link ကုဒ်မှားယွင်းနေသည်", + "err.invalid_credentials": "ထောက်ပံ့ပေးထားသော သုံးစွဲသူအထောက်အထားများမှာ မမှန်ကန်ပါ", + "footer.reseller": "ငွေရှာပါ၊ Lantern Pro ကို ပြန်လည်ရောင်းချသူအဖြစ် လုပ်ကိုင်ပါ။ ဤနေရာကိုကလစ်နှိပ်ပါ", + "footer.reseller.email_subject": "Lantern Reseller Program အကြောင်းပြောပြပါ။", + "footer.reseller.email_body": "သင် Lantern ပြန်လည်ရောင်းချသူဖြစ်လာသည့်အခါ Lantern Pro subscription ကို ရောင်းရတိုင်းတွင် ၂၅% အထိ သင် ရရှိရန်အခွင့်အရေးရှိသည်။ ပြန်လည်ရောင်းချသူဖြစ်လိုသည့်အကြောင်း အောက်တွင် ကျွန်ုပ်တို့အားအနည်းငယ်ပြောပြပါ။", + "feature.faster_speed": "ပိုမိုလျင်မြန်သော အမြန်နှုန်း", + "feature.faster": "ပိုမိုမြန်ဆန်သော ဒေတာစင်တာများ", + "feature.unlimited": "အကန့်အသတ်မဲ့ဒေတာ", + "feature.nologs": "မှတ်တမ်းမရှိ", + "feature.devices": "ကိရိယာ ၃ ခုအထိချိတ်ဆက်ပါ", + "feature.noads": "ကြော်ငြာမရှိပါ", + "feature.yinbi.tooltip": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro. YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern!", + "feature.antiblock": "ခံနိုင်ရည်ကိုပိတ်ဆို့", + "feature.data_center": "ပိုကောင်းတဲ့ဒေတာစင်တာများ", + "feature.free_yinbi": "အခမဲ့ Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "ပိုမြန်၊ ပိုအားကောင်း၊ အကန့်အသတ်မရှိ၊ လုံခြုံ။", + "free.link_account": "Pro အကောင့်ရှိပြီးသားလား။ သင့်အကောင့်ကိုချိတ်ဆက်ပါ", + "home.get_lantern_pro": "Lantern Pro ကိုရယူပါ", + "home.get_lantern_platinum": "Upgrade your plan", + "home.welcome_popup_subheader": "Lantern အသစ်မှ ကြိုဆိုပါသည်။", + "home.welcome_popup_content_1": "ကျွန်ုပ်တို့သည် Lantern ကို အပ်ဒိတ်လုပ်၍ လုပ်ဆောင်ချက်အသစ်များထည့်ကာ ကြိုးစားလုပ်ဆောင်ထားပါသည်။", + "home.welcome_popup_content_2": "ကျွန်ုပ်တို့၏ UI အသစ်၌ Lantern ကွန်ရက်တွင် မျှဝေလိုက်သော ဖိုင်များကို သင့်အားရှာဖွေခွင့်ပေးသော ရှာဖွေဘားတစ်ခုကို သင်တွေ့မည်ဖြစ်ပါသည်။ သင်ကိုယ်တိုင် ဖိုင်တစ်ခုကို ပို့စ်တင်ခြင်းဖြင့် အကြောင်းအရာကိုလည်း ဖြန့်ဝေနိုင်ပါသည်။ ဤသည်မှာ Beta လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်၊ ထို့ကြောင့် စမ်းသပ်လုပ်ဆောင်ကြည့်ပြီး သင့်အမြင်ကို ကျွန်ုပ်တို့ကိုပြောပါ၊ သင့်တုံ့ပြန်မှုကို အခြေခံ၍ ကျွန်ုပ်တို့သည် မြှင့်တင်မှုများကို ဆက်လက်လုပ်ဆောင်သွားပါမည်။", + "home.welcome_popup_button": "ကြိုးစားကြည့်ပါ", + "input.email": "အီးမေးလ်", + "input.your_email": "သင့်အီးမေးလ်လိပ်စာ", + "input.confirm_email": "အီးမေးလ်လိပ်စာကိုအတည်ပြုသည်", + "input.enter_email": "သင့်၏အီးမေးလ်လိပ်စာထည့်ပါ", + "input.use_valid_email": "မှန်ကန်သောအီးမေးလ်လိပ်စာတစ်ခုရေးပါ", + "input.email_not_match": "အီးမေးလ်အကွက်များမကိုက်ညီပါ", + "input.existing_email": "ရှိပြီးသား အီးမေးလ်", + "issue.your_email": "သင်၏အီးမေးလ်", + "issue.attach_image_failure": "ပုံအား တွဲချိတ်၍မရပါ", + "issue.try_again": "ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ", + "issue.select_issue": "ပြဿနာကိုရွေးချယ်ပါ", + "issue.selected_issue": "ပြဿနာကိုရွေးပါ", + "issue.select_issue_hint": "dropdown menu မှ ပြဿနာတစ်ခုကို ရွေးချယ်ပါ", + "issue.note": "သင်၏ပြဿနာကို ရှင်းလင်းဖော်ပြပါ", + "issue.description": "ပြဿနာရှင်းလင်းဖော်ပြချက်", + "issue.error": "ပြဿနာကို တိုင်ကြားရာတွင် အမှားအယွင်းရှိ", + "issue.submit": "အစီရင်ခံစာပို့ရန်", + "issue.report_screenshot": "ပုံဆွဲပါ (သို့) screenshot upload လုပ်ရန်နှိပ်ပါ", + "issue.reported": "သင်၏ပြဿနာကို တင်ပြသည့်အတွက် ကျေးဇူးတင်ပါသည်။ ကျွန်ုပ်တို့တတ်နိုင်သမျှအမြန်ဆုံး အီးမေးလ်ဖြင့်ပြန်ပို့ပါမည်", + "issue.report_sent": "ပို့ပြီးပါပြီ", + "issue.type.no_access": "ပိတ်ထားသောဆိုဒ်များကို ကြည့်၍မရပါ", + "issue.type.payment_fail": "ငွေပေးချေမှုကို အပြီးမသတ်နိုင်ပါ", + "issue.type.cannot_login": "log in ဝင်လို့မရပါ", + "issue.type.always_spinning": "spinner တင်ခြင်းသည်အဆုံးမဲ့လည်ပတ်နေသည်", + "issue.type.slow": "နှေးနှေး", + "issue.type.cannot_link_device": "ကိရိယာများကို ချိတ်ဆက်၍ မရပါ", + "issue.type.crashes": "Lantern ချွတ်ယွင်းမှုများ", + "issue.type.other": "အခြား", + "languages.title": "ဘာသာစကားများ", + "lantern.email": "Lantern အီးမေး", + "mobile.link": "သင့် Android ဖုန်းတွင် Lantern ကို download လုပ်ရန် link ကိုသုံးပါ။", + "mobile.title": "Android ဗားရှင်းရယူပါ", + "nav.about": "အကြောင်း", + "nav.account": "အကောင့်စီမံခန့်ခွဲမှု", + "nav.authorize": "ကိရိယာထည့်ပါ", + "nav.authorized": "ကိရိယာခွင့်ပြုချက်", + "nav.unauthorized_link": "Pro အတွက် Device ကို ခွင့်ပြုပါ", + "nav.language": "ဘာသာစကား", + "nav.lantern": "Lantern", + "nav.mobile": "မိုဘိုင်းဗားရှင်းရယူပါ", + "nav.report_issue": "ပြဿနာတစ်ခုသတင်းပို့ပါ", + "nav.settings": "ချိန်ညှိချက်များ", + "nav.support": "Support", + "nav.verify": "အကောင့်အတည်ပြုခြင်း", + "nav.yinbi": "Yinbi လဲလှယ်ရယူခြင်း", + "nav.home": "နေအိမ်", + "nav.discover": "ရှာဖွေပါ", + "nav.wallet": "ပိုက်ဆံအိတ်", + "nav.yinbi_wallet": "Yinbi ပိုက်ဆံအိတ်", + "notification.retry": "ပြန်ကြိုးစားပါ", + "notifications": "အသိပေးချက်များ", + "notifications.whatisnew": "ဘာထူးသလဲ။", + "password.change": "စကားဝှက်ကိုပြောင်းရန်", + "password.changed": "စကားဝှက်ပြောင်းထား", + "continue.to.pro": "Pro ကိုဆက်သွားပါ", + "username": "အသုံးပြုသူအမည်", + "password.new": "စကားဝှက်အသစ်", + "password.requirements": "
စကားဝှက်တွင်အောက်ပါတို့ပါရမည် -
  • အက္ခရာ ၈ လုံးနှင့်အထက်
  • စာလုံးအသေး ၁ လုံး၊
  • စာလုံးကြီးတစ်လုံး
  • အနည်းဆုံးနံပါတ်တစ်ခု
  • စိတ်မချရသောစကားဝှက်များစာရင်းတွင်မပါဝင်ရပါ
", + "password.reset": "စကားဝှက်အား မူလအတိုင်းပြန်ထားပါ", + "paxful.buy": "ဝယ်ပါ", + "paxful.payment": "ငွေပေးချေစနစ်", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "ကြိုး (USDT)", + "paxful.wallet": "အွန်လိုင်း ပိုက်ဆံအိတ်များ", + "paxful.bank": "ဘဏ်ငွေလွှဲပြောင်းခြင်းများ", + "paxful.gamer_card": "ဂိမ်းကဒ်များ", + "paxful.gift_card": "လက်ဆောင်ကဒ်များ", + "paxful.cash": "ငွေသားပေးချေမှု", + "paxful.digital_currency": "ဒစ်ဂျစ်တယ်ငွေကြေး", + "paxful.button": "အကောင်းဆုံးအပေးအယူများပြပါ", + "payment.close": "ပိတ်", + "payment.redirectErrorTitle": "ငွေပေးချေမှုဆာဗာကို ချိတ်ဆက်ရာတွင် ချို့ယွင်းချက်", + "payment.redirectErrorText": "ကျွန်ုပ်တို့သည် ဤပြဿနာကို ဖြေရှင်းရန်အတွက် လတ်တလော ဆောင်ရွက်နေပါသည်။ နောက်မှ ပြန်စစ်ဆေးပါ။", + "payment.wait_for_pro": "Lantern Pro ကို ဝယ်ယူသည့်အတွက် ကျေးဇူးတင်ပါသည်။ သင်၏ Lantern အလိုအလျောက် Pro ဖြစ်လာရန် ခဏစောင့်ပါ။", + "payment.moreOptions": "More Options", + "payment.fewerOptions": "Fewer Options", + "payment_methods.select_name": "ငွေပေးချေမှုနည်းလမ်းကိုရွေးချယ်ပါ", + "payment_methods.alipay": "Credit Card / Alipay", + "payment_methods.shetab": "လျင်မြန်သော World Pay (Shetab)", + "payment_methods.shetab.details.header": "Lantern Pro ကိုဝယ်ယူရန်", + "payment_methods.shetab.details.body": "ဆက်လက်ဝယ်ယူရန်ကို သင်နှိပ်ပါက ငွေပေးချေမှုကို အပြီးသတ်ရန်နှင့် သင်၏ activation ကုဒ်ကို စုဆောင်းရန်ပြင်ပ site တစ်ခုသို့ သင့်ကို ပြန်လည်လမ်းညွှန်လိမ့်မည်။", + "payment_methods.shetab.details.tutorial_header": "tutorials ရယူပါ", + "payment_methods.shetab.details.purchase_voucher_button": "ဆက်လက်ဝယ်ယူရန်", + "payment_methods.shetab.details.input_code_button": "Activation ကုဒ် ထည့်ရန်", + "plan.step1": "အဆင့် 1", + "plan.apply": "လျှောက်ထားပါ", + "plan.step2": "အဆင့် ၂", + "plan.most_popular": "လူကြိုက်အများဆုံး!", + "plan.step3": "အဆင့် 3", + "plan.choose_plan": "Plan ကိုရွေးချယ်ပါ", + "plan.enter_email": "အီးမေးလ်ထည့်ပါ", + "plan.choose_method": "Choose Payment Method", + "plan.bestValue": "အကောင်းဆုံးအပေးအယူများ", + "plan.per_month": "တစ်လလျှင်", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 နှစ်", + "plan.add_referral": "ရည်ညွှန်းကုဒ်ထည့်ပါ", + "plan.years": "{{years}} နှစ် အစီအစဉ်", + "plan.desc": "တစ်ကြိမ်လျှင် {{price}} နှုန်း တောင်းခံထားသည်", + "plan.bonus_months": "+ {{bonusMonths}} လများ", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(အမေရိကန်ဒေါ်လာ)", + "plan.time_unit": "/ YR", + "plan.select": "ရွေးချယ်ပါ", + "plan.two_year": "Two Year", + "plan.one_year": "One Year", + "plan.savings": "Save {{formattedDiscount}} %", + "plans.title": "Lantern Pro အစီအစဉ်များ", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Windows၊ Android၊ Mac၊ Ubuntu အတွက်ဖြစ်သည်။", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here.", + "plans.with_voucher_code": "Activation ကုဒ်ရှိပါသလား။ ဤနေရာကိုကလစ်နှိပ်ပါ။", + "pro.apply": "သင်၏ခရက်ဒစ်များကို သင်၏အကောင့်သို့ လာမည့်ငွေတောင်းခံကာလတွင် ထည့်ပါမည်။", + "pro.title": "သူငယ်ချင်းများကိုဖိတ်ပါ၊ နောက်ထပ် Pro များကို အခမဲ့ရယူပါ", + "pro.subtitle": "သင်၏သူငယ်ချင်းက နှစ်နှစ်အစီအစဉ်ဝယ်ယူသောအခါ နောက်ထပ် ၃ လထပ်တိုးမည့်အစီအစဉ်ကို သင်တို့နှစ်ဦးရမည်ဖြစ်ပြီး တစ်နှစ်အစီအစဉ်ဝယ်ယူလျှင် ၁ လစီအခမဲ့ရပါမည်။", + "pro.share": "ခရက်ဒစ်ပိုများများရရန် သင်၏ကုဒ်ကို သူငယ်ချင်းများနှင့်မျှဝေပါ။", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro ကို Activation လုပ်ခြင်း", + "promotion.enter_and_confirm_email": "ကျေးဇူးပြုပြီး သင့်အီးမေးလ်လိပ်စာကိုရိုက်ထည့်ပြီး အတည်ပြုပါ", + "promotion.code.hint": "သင့်သူငယ်ချင်း၏ ရည်ညွှန်းကုဒ်နံပါတ်ကို ရိုက်ပါ (မဖြစ်မနေမဟုတ်)။", + "promotion.code.label": "ရည်ညွှန်းကုဒ်", + "promotion.payment": "ငွေပေးချေမှုသို့ ဆက်သွားမည်", + "promotion.payment.btc": "₿ ဖြင့် ငွေပေးချေမည်", + "promotion.loading": "ဖွင့်နေသည် ...", + "promotion.howto_1y": "အကယ်၍ မိတ်ဆွေတစ်ဦးက သူ၏ရည်ညွှန်းကုဒ်ကို သင်နှင့်မျှဝေပါက checkout ပြီးသည်နှင့်တစ်ပြိုင်နက် Lantern Pro ကို တစ်လအခမဲ့ရယူရန် ကုဒ်ကိုထည့်ပါ။", + "promotion.howto_2y": "အကယ်၍ မိတ်ဆွေတစ်ဦးက သူ၏ရည်ညွှန်းကုဒ်ကို သင်နှင့်မျှဝေပါက checkout ပြီးသည်နှင့်တစ်ပြိုင်နက် Lantern Pro ကို သုံးလအခမဲ့ရယူရန် ကုဒ်ကိုထည့်ပါ။", + "promotion.pay": "{{amount}} ကို ပေးဆောင်ပါ", + "promotion.select": "ရွေးချယ်ပါ", + "promotion.promotion_applied_1y": "အပိုဆုကြေး +1 လ", + "promotion.promotion_applied_2y": "အပိုဆုကြေး +3 လ", + "promotion.too_many_referrals": "ဤရည်ညွှန်းကုဒ်ကို ထည့်ထားပြီးပြီ။ သင်၏အပိုလများကို ရရန် ယခု check out လုပ်ပါ။", + "promotion.activation.enter_and_confirm_email": "သင်၏ Lantern Pro အကောင့်ကိုမှတ်ပုံတင်ရန်သင်၏အီးမေးလ်လိပ်စာကိုထည့်သွင်းပြီးအတည်ပြုပါ။", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Activation ကုဒ်", + "promotion.activation.instructions": "သင့်အကောင့်ကိုမှတ်ပုံတင်ရန် သင့်အီးမေးလ်နှင့် ပြန်လည်ရောင်းချသူထံမှ ၂၅ လုံးပါသော activation ကုဒ်ကိုထည့်ပါ။", + "promotion.activation.howto": "အထက်တွင် သင်၏ စာလုံး၂၅လုံးပါ Lantern Pro activation code ကိုရိုက်ထည့်ပါ။ သင့်တွင်ကုဒ်မရှိပါက ယခင်မျက်နှာပြင်ပေါ်တွင် Pro ကို ဝယ်ပါ (သို့) Lantern Pro ပြန်လည်ရောင်းချသူကို အွန်လိုင်းတွင်ရှာဖွေပါ။", + "promotion.activation.continue": "Pro အတွက်မှတ်ပုံတင်ပါ", + "promotion.voucher.hint": "Activation ကုဒ်", + "promotion.voucher.howto": "သင်၏စာလုံး ၁၂ လုံးပါ Fast World Pay activation ကုဒ်ကို အထက်တွင် ထည့်ပါ", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code.", + "promotion.voucher.error.invalid_code": "မမှန်ကန်သော activation ကုဒ်", + "promotion.voucher.error.invalid_plan": "မမှန်ကန်သောအစီအစဉ်နှင့် သက်ဆိုင်သော activation ကုဒ်", + "promotion.voucher.error.already_redeemed": "Activation ကုဒ်ကို လဲလှယ်ရယူပြီးပါပြီ", + "referral.code": "ရည်ညွှန်းကုဒ်", + "referral.text": "ကျွန်တော့်ကုဒ် %sကိုသုံးပြီး သင်စာရင်းသွင်းသည့်အခါ ၃ လအခမဲ့ရယူပါ။", + "referral.description_free": "သင်၏ကုဒ်ကို သင်၏သူငယ်ချင်းများနှင့် မျှဝေပါ၊ ၎င်းတို့ Pro ကို ဝယ်ယူသောအခါ Lantern Pro ဝန်ဆောင်မှု 1 လကို အခမဲ့ရယူပါ။", + "referral.description_pro": "သင်၏ကုဒ်ကို သင်၏သူငယ်ချင်းများနှင့် မျှဝေပြီး ၎င်းတို့ Pro ကို ဝယ်ယူသောအခါ Lantern Pro ဝန်ဆောင်မှု ထပ်တိုး 1 လကို အခမဲ့ရယူပါ။", + "register": "မှတ်ပုံတင်ပါ", + "renew.subtitle_early": "အခမဲ့ ၃လအတွက် သက်တမ်းတိုးပါ", + "renew.subtitle_last_day": "အခမဲ့ ၃လအတွက် သက်တမ်းတိုးပါ", + "renew.subtitle_expired": "အခမဲ့ (၄၅) ရက်အတွက် သက်တမ်းတိုးပါ။", + "renew.details_early": "သင်၏ Lantern Pro အဖွဲ့ဝင်ဖြစ်မှုမှာ မကြာမီအဆုံးသတ်တော့မည်။ ယခုသက်တမ်းတိုးပြီး သုံးလအထိအခမဲ့ရယူပါ။", + "renew.details_last_day": "သင်၏ Lantern Pro အဖွဲ့ဝင်ဖြစ်မှုမှာ ယနေ့အဆုံးသတ်သည်။ ယခုသက်တမ်းတိုးပြီး သုံးလအထိအခမဲ့ရယူပါ။", + "renew.details_expired": "သင်၏ Lantern Pro အဖွဲ့ဝင်ဖြစ်မှုမှာ သက်တမ်းကုန်သွားပါပြီ။ ယခုသက်တမ်းတိုးပြီး ၄၅ ရက်အထိ အခမဲ့ရယူပါ။", + "renew.asterisk_early": "* ဤအချိန်ကန့်သတ်ထားသောကမ်းလှမ်းချက်သည် အစောပိုင်းသက်တမ်းတိုးမှုအတွက်သာ အကျုံးဝင်သည်။", + "renew.asterisk_last_day": "* ဤသည်မှာ အထူးကမ်းလှမ်းချက်ကို ရရန် သင်၏နောက်ဆုံးအခွင့်အရေးဖြစ်သည်။", + "renew.asterisk_expired": "* ဒါက အချိန်ကန့်သတ်ထားသော ကမ်းလှမ်းမှုပါ။", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + ၁လအခမဲ့", + "renew.plan_renewal_bonus_months": "$%d%s + အခမဲ့ %dလ", + "renew.plan_renewal_bonus_days": "$%d%s + အခမဲ့ %dရက်", + "renew.next": "နောက်တစ်ခု", + "renew.decline": "ကမ်းလှမ်းမှုကိုငြင်းဆို", + "renew.decline_question": "ဒီကမ်းလှမ်းချက်ကို သင်ငြင်းချင်တာ သေချာလား။", + "renew.decline_yes": "နောက်ပိုင်းတွင်သက်တမ်းတိုးပါ", + "renew.decline_dismiss": "ယခုသက်တမ်းတိုးပါ", + "renew.notification_title_30_days": "များစွာချွေတာနိုင်ရန်အတွက် Pro ကို ယခုသက်တမ်းတိုးလိုက်ပါ။", + "renew.notification_title_30_days_platinum": "Renew Platinum now for huge savings!", + "renew.notification_text_30_days": "Your {{planName}} account expires in {{remainingDays}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "{{planName}} discount ends tomorrow!", + "renew.notification_text_2_days": "Your {{planName}} account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "လျှော့စျေးအတွက်နောက်ဆုံးအခွင့်အရေး", + "renew.notification_text_last_day": "Your {{planName}} account has expired. Renew today and get up to 3 months free.", + "replica.upload": "တင်ပါ", + "replica.favorite": "ကြိုက်နှစ်သက်မှု", + "replica.added_to_favorites": "ကြိုက်နှစ်သက်မှုများထဲသို့ ထည့်ထားသည်", + "replica.filedrop_error": "ဤဖိုင်ကို အပ်လုဒ်လုပ်ရာတွင် အမှားအယွင်း", + "replica.filedrop_error.file-too-large": "အမြင့်ဆုံး ခွင့်ပြုထားသည့် ဖိုင်အရွယ်အစားမှာ {{fileSize}} ဖြစ်သည်", + "replica.filedrop_error.file-too-small": "ဖိုင်မှာ သေးလွန်းသည်", + "replica.filedrop_error.too-many-files": "ဖိုင်အလွန်များပြားသည်", + "replica.filedrop_error.file-invalid-type": "ဤဖိုင်အမျိုးအစားကို လက်ရှိတွင် ပံ့ပိုးမပေးထားပါ", + "replica.filedrop_remove_file": "စီတန်းစောင့်ဆိုင်းမှုမှ ဖယ်ရှားပါ", + "replica.post": "ဖိုင်ကို အပ်လုဒ်လုပ်ပါ", + "replica.relevance": "ဆီလျော်မှု", + "replica.upload_date": "တင်သည့်ရက်စွဲ", + "replica.gallery_view": "ပြခန်းမြင်ကွင်း", + "replica.list_view": "စာရင်းကြည့်ရန်", + "replica.copy_lantern_link": "Lantern Link ကိုကူးယူပါ", + "replica.documents": "စာရွက်စာတမ်းများ", + "replica.audio": "အော်ဒီယို", + "replica.application": "အက်ပလီကေးရှင်းများ", + "replica.image": "ပုံများ", + "replica.video": "ဗွီဒီယိုများ", + "replica.web": "ဝက်ဘ်", + "replica.news": "သတင်း", + "replica.upload_alert.dont_show": "ဒီဟာကိုနောက်တစ်ကြိမ်မပြပါနှင့်", + "replica.upload_alert.cancel": "တင်နေသည်ကို ပယ်ဖျက်ပါ", + "replica.upload_alert.resume": "တင်နေသည်ကို ဆက်လုပ်ပါ", + "replica.upload_alert.info": "အရေးကြီးသောသတင်းအချက်အလက်!", + "replica.upload_alert.desc1": "Lantern သို့တင်ထားသောဖိုင်များကို ဖြန့်ဝေထားပြီး ဗဟိုချုပ်ကိုင်မှုလျှော့ချထားသည်။ အခြားအသုံးပြုသူတစ်ဦး က ၎င်းတို့ကို ဝင်ကြည့်ပါက ၎င်းတို့ကို \"ကျွန်ုပ်၏ဖိုင်များ\" စာရင်းမှ ပယ်ဖျက်လိုက်လျှင်ပင် ကွန်ရက်အတွင်းမှ ၎င်းတို့ကို Lantern အပါအဝင် မည်သူမျှဖျက်၍မရတော့ပါ။", + "replica.upload_alert.desc2": "အထိခိုက်မခံသောအကြောင်းအရာများကို တင်စဉ် ကိုယ်ရေးကိုယ်တာအချက်အလက်များကို ဖိုင် (သို့) ဖိုင်အမည်တွင် အသုံးမပြုပါနှင့်။", + "replica.add_details": "အသေးစိတ်အချက်များ ထည့်ပါ", + "replica.cannot_edit": "တင်လိုက်သည်နှင့် ဖိုင်အမည်များကို တည်းဖြတ်၍မရတော့ပါ။", + "replica.next": "နောက်တစ်ခု", + "replica.previous": "ရှေ့", + "replica.selectAll": "အားလုံးရွေးပါ", + "replica.search_replica": "ရှာပါ", + "replica.search_results_info": "ဤတဘ်သည် Lantern ရလဒ်များကိုသာ ပြသသည်။", + "replica.search_results_info_message": "Lantern ရလဒ်များတွင် အသုံးပြုသူများက Lantern ကွန်ရက်သို့ အပ်လုဒ်လုပ်လိုက်သော အကြောင်းအရာများ ပါဝင်သည်။", + "replica.no_files_found": "No Results", + "replica.or_content": "အခြားလူများရှာရန်သင့်ကိုယ်ပိုင်အကြောင်းအရာ!", + "replica.try_again": "အခြားသော့ချက်စာလုံးတစ်လုံးကိုစမ်းကြည့်ပါ၊", + "replica.upload_success": "အောင်မြင်စွာတင်ပြီးပါပြီ", + "replica.cannot_preview": "ဤဖိုင်အမျိုးအစားအတွက် အစမ်းကြည့်၍ မရပါ", + "replica.no_description": "ဖော်ပြချက်များ ပေးမထားပါ", + "replica.size": "အရွယ်အစား", + "replica.uploaded": "တင်ပြီးပါပြီ", + "replica.invalid_link": "မမှန်ကန်သောလင့်ခ်", + "replica.close": "ပိတ်", + "replica.files": "ဖိုင်များ", + "replica.upload_history": "မှတ်တမ်းကို အပ်လုဒ်လုပ်ပါ", + "replica.my_favorites": "ကြိုက်နှစ်သက်မှုများ", + "replica.no_uploads": "အပ်လုဒ်များ မရှိသေးပါ", + "replica.no_favorites": "ကြိုက်နှစ်သက်မှုများ မရှိသေးပါ", + "replica.mime_type": "ဖိုင်အမျိုးအစား- {{mime}}", + "replica.image_loading_error": "ပုံကို ဖွင့်ရာတွင် ပြဿနာရှိသည်", + "replica.play": "ဖွင့်မည်", + "replica.pause": "ခေတ္တရပ်မည်", + "replica.scrub": "ဖျက်သိမ်းမည်", + "replica.skip_forward": "ရှေ့ကို ကျော်မည်", + "replica.skip_backwards": "နောက်ကို ကျော်မည်", + "replica.trending_videos": "ခေတ်မှီသောဗီဒီယိုများ", + "replica.file_uploaded": "အပ်လုဒ်လုပ်ထားသည်- လွန်ခဲ့သော {{days}} ရက်", + "replica.file_size": "အရွယ်အစား", + "replica.duration": "ကြာချိန်", + "replica.filename": "ဖိုင်နာမည်", + "replica.filename_required": "သင့်ဖိုင်ကို အမည်ပေးပါ", + "replica.description_optional": "ဖော်ပြချက် ထည့်ပါ", + "replica.expand": "အသေးစိတ်များ ချဲ့ပါ", + "replica.filetype": "ဖိုင်အမျိုးအစား", + "replica.sortby": "ဤအတိုင်း စဉ်မည်", + "replica.link": "ပုံတူပွားလင့်ခ်", + "replica.collapse": "ခွဲထုတ်မည်", + "replica.publish": "ထုတ်ဝေသည်", + "replica.cancel": "ပယ်ဖျက်ပါ", + "replica.progress_current_upload": "၏ အပ်လုဒ်", + "replica.progress_files": "ဖိုင်များ", + "replica.progress_of": "၏", + "replica.progress_upload_complete": "ပြီးစီးသည်", + "replica.progress_upload_failure": "အပ်လုဒ်လုပ်မှု မအောင်မြင်သဖြင့် ထပ်မံကြိုးစားပါ။", + "replica.upload_in_progress": "အပ်လုဒ် ဆက်လုပ်နေသည်", + "replica.upload_pending": "အပ်လုဒ် ဆိုင်းငံ့ထားသည်", + "replica.upload_error": "အပ်လုဒ် ချို့ယွင်းချက်", + "replica.upload_cancel": "အပ်လုဒ်ကို ပယ်ဖျက်ပါ", + "replica.upload_confirm": "အပ်လုဒ်ကို သင်ပယ်ဖျက်လိုသည်မှာ သေချာပါသလား။", + "replica.progress_view": "ကြည့်မည်", + "replica.delete": "ဖျက်ပါ", + "replica.remove": "ဖယ်ရှားပါ", + "replica.delete_file": "ဖိုင်ကိုဖျက်ပါ", + "replica.remove_favorite": "ကြိုက်နှစ်သက်မှုများထဲမှ ဖယ်ရှားပါ", + "replica.failed_to_delete": "ဖျက်ခြင်းမအောင်မြင်ပါ", + "replica.failed_to_remove": "ဖယ်ရှားရန် မအောင်မြင်ပါ", + "replica.link_lookup_failure": "link ရှာခြင်းမအောင်မြင်ပါ", + "replica.delete_file_confirmation_1": "သင်ဖျက်လိုသည်မှာ သေချာသလား", + "replica.delete_file_confirmation_2": "သင်၏တင်ပို့ချက်များမှ", + "replica.remove_favorite_confirmation_1": "သင် ဖယ်ရှားလိုသည်မှာ သေချာပါသလား", + "replica.remove_favorite_confirmation_2": "သင်၏ ကြိုက်နှစ်သက်မှုများမှ", + "replica.share_file": "ဖိုင်မျှဝေပါ", + "replica.download_and_view": "ဒေါင်းလုပ် / ကြည့်ရန်", + "replica.download": "ဒေါင်းလုပ်", + "replica.copy_link": "ပုံတူပွားလင့်ခ်ကို ကူးယူပါ", + "replica.find_file": "ဖိုင်ရှာပါ", + "replica.file_drop_prompt": "အပ်လုဒ်စတင်လုပ်ဆောင်ရန် ဖိုင်ကိုရွှေ့ပါ။", + "replica.empty_uploads_text1": "သင့်ရဲ့ပထမဆုံးပို့စ်ကို ဖန်တီးရန်", + "replica.empty_uploads_text2": "ဒီကို", + "replica.empty_uploads_text3": "နှိပ်ပါ", + "replica.error_header": "အိုး", + "replica.error": "သင့်တောင်းဆိုမှုကို စီမံခန့်ခွဲရာတွင် မှားယွင်းမှုတစ်ခု ဖြစ်ပေါ်ခဲ့သည်။ ထပ်မံကြိုးစားပါ။", + "replica.serp_empty": "ဤစုံစမ်းမေးမြန်းမှုအတွက် Google သည် မည်သည့်ရလဒ်ကိုမျှ ပြန်မပို့ထားပါ။", + "replica.disclaimer": "Lantern သည် သင်၏ရှာဖွေမှုများကို အမည်မဖော်ပြဘဲ ယင်းတို့ကို ပြင်ပအဖွဲ့အစည်းများထံ မရောက်ရှိစေရန် ကာကွယ်ပေးပါသည်", + "settings.general": "အထွေထွေ", + "settings.feedback": "တုံ့ပြန်ချက်", + "settings.autoLaunch": "Lantern ကို စနစ်စလည်ပတ်ချိန်မှာ ဖွင့်ပါ", + "settings.autoReport": "Lantern ကို အထောက်အကူပြုရန် အသုံးပြုမှုစာရင်းအင်းများကို လုံလုံခြုံခြုံအစီရင်ခံပါ", + "settings.lantern_ads": "Lantern ကြော်ငြာများကို ပြသပါ", + "settings.lantern_ads_tooltip": "Lantern သည် ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုကို ကူညီပံ့ပိုးပေးရန် သင့်အား ဝဘ်ဆိုက်အချို့တွင် ကြော်ငြာများကို ပြသသည်။ အသုံးပြုသူ အချက်အလက်ကို စုစည်းရယူထားခြင်း သို့မဟုတ် ကျွန်ုပ်တို့၏ ဆာဗာများသို့ လွှဲပြောင်းထားခြင်း မရှိပါ။ ဤရွေးစရာကို သင်ပိတ်လိုက်ပါက ကြော်ငြာများကို သင် ဆက်လက်မြင်နိုင်သေးသော်လည်း ၎င်းတို့သည် Lantern ကွန်ရက်မှလာခြင်း မဟုတ်ပါ။", + "settings.proxyAll": "Proxy အားလုံးအသွားအလာ", + "settings.proxyAllHelpTitle": "\"Proxy အားလုံးအသွားအလာ\" က ဘာလုပ်သလဲ။", + "settings.proxyAllHelp1": "အကယ်၍ ဖွင့်ထားလျှင် traffic အားလုံးကို Lantern မှတဆင့်ပို့လိမ့်မည် (လုံခြုံစိတ်ချရမှုအများဆုံး)။", + "settings.proxyAllHelp2": "အကယ်၍ ပိတ်ထားပါက ပိတ်ဆို့ခံထားရသောအသွားအလာကိုသာ Lantern မှ ပေးပို့လိမ့်မည် (အမြန်ဆုံး၊ အသုံးအများဆုံး)။", + "settings.show_advanced": "အဆင့်မြင့်ချိန်ညှိချက်များကိုပြပါ", + "settings.hide_advanced": "အဆင့်မြင့်ချိန်ညှိချက်များကိုဖျောက်ပါ", + "settings.systemProxy": "system proxy ကိုစီမံပါ", + "settings.title": "ချိန်ညှိချက်များ", + "settings.http_proxy": "HTTP(S) proxy-", + "settings.socks_proxy": "SOCKS proxy-", + "settings.caution": "သတိ-", + "settings.caution_text": "\"system proxy ကို စီမံပါ\" ကို အမှန်ခြစ်ဖြုတ်ထားသောအခါ သင်၏ browser နှင့် application များသည် Lantern ကို အလိုအလျောက်သုံးနိုင်မည်မဟုတ်ပါ။ ဤချိန်ညှိချက်များကို ကိုယ်တိုင်မည်သို့ပြုပြင်ရမည်ကို သင်သိလျှင် အထက်ပါအချက်အလက်များကို ရည်ညွှန်းပါ။", + "settings.select_language": "ဘာသာစကားရွေးပါ", + "settings.diagnostics": "ချို့ယွင်းချက်ရှာ အချက်အလက်များကို တွဲပါ", + "settings.diagnostics_tooltip": "ချို့ယွင်းချက်ရှာ အချက်အလက်များကို တွဲခြင်းသည် သင်၏ချိတ်ဆက်မှုမှ ရိုက်ယူထားသော Lantern အဖွဲ့ဒေတာကို ပေးပို့ပါမည်။ ယင်းက သင်၏ပြဿနာကို အမျိုးအစားခွဲခြားရန်နှင့် ဖြေရှင်းရန် ကျွန်ုပ်တို့၏ စွမ်းဆောင်နိုင်စွမ်းကို မြှင့်တင်ပေးမည်ဖြစ်သည်။", + "status.lantern": "Lantern သည်", + "status.click_reconnect": "ပြန်လည်ချိတ်ဆက်ရန်ဒီနေရာကိုနှိပ်ပါ", + "status.server_location": "ဆာဗာတည်နေရာ", + "status.tooltip1": "Lantern သည် သင်၏အကောင်းဆုံးဒေတာစင်တာများနှင့် သင့်ကိုချိတ်ဆက်ရန်အတွက် smart server ရွေးချယ်မှုကိုအသုံးပြုသည်။", + "status.tooltip2": "ကျွန်ုပ်တို့၏ သီးသန့် Lantern Pro ဒေတာစင်တာများမှ အထူးရွေးချယ်ထားသောဆာဗာဖြင့် ပိုမိုမြန်ဆန်သော အမြန်နှုန်းကို ရရန် Lantern Pro သို့အဆင့်မြှင့်ပါ", + "status.protected_connection": "သင်၏ဆက်သွယ်မှုကိုကာကွယ်ထားသည်", + "status.please_wait": "ဒီဟာက တစ်မိနစ်၊ နှစ်မိနစ်လောက် ကြာနိုင်တယ်", + "status.connecting": "ချိတ်ဆက်နေသည် ...", + "status.no_internet": "ပိတ်", + "status.no_internet_connection": "အင်တာနက်ဆက်သွယ်မှုမရှိပါ", + "status.connected": "ဖွင့်", + "status.disconnected": "ပိတ်", + "status.throttled": "မြန်နှုန်းထိန်းညှိမှု (ဒေတာအဖုံး)", + "status.no_system_proxy": "{{status}}၊ စနစ်ကြားခံကို မစီမံပါ", + "status.fail_to_set_system_proxy": "Lantern ကို system proxy အဖြစ်သတ်မှတ်ခြင်းမအောင်မြင်ပါ", + "status.fail_to_open_browser": "Lantern user interface ကို ပြသရန် browser window ကို ဖွင့်၍မရခဲ့ပါ", + "support.forum": "Lantern User Forum", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "{{buttonText}} ကိုနှိပ်ခြင်းအားဖြင့် ကျွန်ုပ်တို့၏ဝန်ဆောင်မှုစည်းကမ်းချက်များကို သင်သဘောတူသည်", + "terms_of_service.replica": "ကျွန်ုပ်တို့၏ထုတ်ကုန်များကို မည်သည့်နည်းနှင့်မဆို ရှာဖွေခြင်း၊ တင်ခြင်း သို့မဟုတ် အသုံးပြုခြင်းအားဖြင့် ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုဆိုင်ရာစည်းမျဉ်းများလျှို့ဝှက်ထိန်းသိမ်းမှုမူဝါဒ နှင့် DMCA မူဝါဒကို သင်သဘောတူသည်", + "top_sites.google": "ဂူဂဲလ်", + "top_sites.twitter": "တွစ်တာ", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "ဖေ့စ်ဘွတ်ခ်", + "top_sites.wikipedia": "ဝီကီပီးဒီးယား", + "verify.header": "ကိရိယာလင့်ခ်ချိတ်ဆက်မှု ပင်နံပါတ်ကို ရိုက်ထည့်ပါ", + "verify.code": "ကိရိယာချိတ်ဆက်ကုဒ်", + "verify.howto_1": "အကယ်၍ သင့်တွင် အခြားကိရိယာတစ်ခု၌ Lantern Pro အကောင့်တစ်ခုရှိပါက ထိုကိရိယာအားခွင့်ပြုရန်အတွက် ကုဒ်တစ်ခုကို လက်ခံရရှိရန် သင်၏အီးမေးလိပ်စာကို ဒီမှာထည့်ပါ။", + "verify.howto_1a": "သင်သည် လက်ရှိတွင် ခွင့်ပြုချက်မရှိသော Pro အသုံးပြုသူတစ်ဦး ဖြစ်သည်။ သင်၏ Pro အကောင့်ကို ခွင့်ပြုရန်သင်၏အီးမေးလ်လိပ်စာကို ဖြည့်ပါ။ ကိရိယာများစွာချိတ်ဆက်ရန် သင့်အားခွင့်ပြုလိမ့်မည်။", + "verify.howto_2": "ကိရိယာတစ်ခုကို သင်၏ Pro Account နှင့် ချိတ်ဆက်ရန်-", + "verify.howto_3": "၁။ သင့်အခြားစက်ပစ္စည်း၏ မီနူးမှ \"Authorize Device for Pro\" ကိုရွေးချယ်ပါ။", + "verify.howto_4": "၂။ အဆင့် ၁ မှရရှိသော ချိတ်ဆက်မှုပင်နံပါတ်ကို ထည့်ပြီး တင်သွင်းပါ။", + "verify.reminder": "* ကိရိယာနှစ်ခုစလုံးသည် Lantern ၏နောက်ဆုံးထွက်ဗားရှင်းကို အသုံးပြုထားကြောင်း သေချာပါစေ", + "verify.enter_pin": "ကိရိယာချိတ်ဆက်မှုပင်နံပါတ်ကို ရိုက်ထည့်ပါ", + "verify.submit": "တင်သွင်းပါ", + "verify.title": "အကောင့်အတည်ပြုခြင်း", + "welcomeToPro.continue": "Pro ကိုဆက်သွားပါ", + "welcomeToPro.invite": "သူငယ်ချင်းများကို ဖိတ်ပါ။ သူတို့က ၂ နှစ်အစီအစဉ်ကို ဝယ်တဲ့အခါ သင်တို့နှစ်ဦးလုံး ၃ လအခမဲ့ရလိမ့်မယ်၊ တစ်နှစ်အစီအစဉ်ဆို ၁ လစီရမယ်။ စတင်ဖိတ်ခေါ်ပါ။", + "welcomeToPro.thanks": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.title": "Lantern Pro မှ ကြိုဆိုပါတယ်", + "welomeToPro.title_exclamation": "Lantern Pro မှကြိုဆိုပါသည်။", + "purchase.failed": "Purchase failed. Please try again later.", + "purchase.success": "Purchase Success", + "purchase.success_title": "Welcome to Lantern {{planType}}!", + "purchase.success_content_pro": "You now have unlimited access using our fastest data centers. Up to three devices can be connected to your account.", + "purchase.success_content_platinum": "You now have unlimited access using our dedicated lines and fastest data centers. Up to three devices can be connected to your account.", + "welcomeToPro.description": "ယခုတွင် သင်သည် ပိတ်ဆို့ထားသောဆိုဒ်များနှင့် ဝန်ဆောင်မှုများကို အကန့်အသတ်မရှိအသုံးပြုခွင့်ရှိသည်", + "messages.copied_to_clipboard": "ကုဒ်ကူးယူပြီးပြီ။ သင်၏သူငယ်ချင်းများနှင့် မျှဝေပါ။", + "messages.datacap": "မင်းရဲ့မြန်နှုန်းမြင့်ဒေတာကို မင်းသုံးပြီးပြီ။ အကန့်အသတ်မဲ့မြန်နှုန်းမြင့်ဒေတာအတွက် Pro ကိုအဆင့်မြှင့်ပါ။", + "messages.fatal_error": "တောင်းပန်ပါသည်၊ Lantern ဆာဗာများနှင့်ဆက်သွယ်ရာတွင် ကျွန်ုပ်တို့အခက်အခဲရှိနေသည်။ ကျေးဇူးပြု၍ သင်၏အင်တာနက်ဆက်သွယ်မှုကို စစ်ဆေးပြီး ထပ်မံကြိုးစားပါ။", + "messages.backend_gone": "တောင်းပန်ပါသည်၊ Lantern သည်အလုပ်မလုပ်တော့ဘဲ ဖြစ်နေပုံရသည်။ Lantern ကို ပြန်ဖွင့်ပြီးထပ်မံကြိုးစားပါ။", + "messages.get_help": "အကူအညီရယူပါ", + "freeProCredits.title": "သူငယ်ချင်းများကိုဖိတ်ကြားသည်", + "freeProCredits.shareWithFriends": "အခမဲ့လများရရန် သင်၏ code ကို သူငယ်ချင်းများနှင့်မျှဝေပါ။", + "freeProCredits.shareWithFriendsDesc": "သင့်သူငယ်ချင်းက ၂ နှစ်အစီအစဉ်ကို ဝယ်တဲ့အခါ သင်တို့နှစ်ဦးလုံး ၃ လအခမဲ့ရလိမ့်မယ်၊ တစ်နှစ်အစီအစဉ်ဆို ၁ လစီရမယ်။", + "cards.serverLocation.unknown": "မသိဘူး", + "cards.serverLocation.description": "အကောင်းဆုံးဆာဗာတည်နေရာ", + "cards.serverLocation.description-free": "ဆာဗာတည်နေရာ", + "cards.serverLocation.description-upgrade": "ပိုမိုမြန်သောဆာဗာများအတွက်အဆင့်မြှင့်တင်ခြင်း", + "cards.serverLocation.title": "လက်ရှိတည်နေရာ-", + "cards.serverLocation.location": "%s၊ %s", + "cards.serverLocation.text": "Lantern သည် တိုကျို၊ စင်္ကာပူ၊ ဟောင်ကောင်၊ ဆန်ဖရန်စစ္စကို၊ နယူးယောက်၊ အမ်စတာဒမ်၊ ဘန်ဂလိုနှင့် အခြားဒေတာစင်တာများမှ အမြန်ဆုံးဆက်သွယ်မှုကို သင့်အတွက်အလိုအလျောက်ရှာဖွေရန် smart server ရွေးချယ်မှုကိုအသုံးပြုသည်။", + "cards.serverLocation.text-free": "Lantern သည် အကောင်းဆုံးဒေတာစင်တာများနှင့် သင့်ကိုချိတ်ဆက်ရန်အတွက် smart server selection ကိုအသုံးပြုသည်။", + "cards.serverLocation.upgrade-link": "ကျွန်ုပ်တို့၏ သီးသန့် Lantern Pro ဒေတာစင်တာများမှ အထူးဆာဗာရွေးချယ်မှုဖြင့် ပိုမိုမြန်ဆန်သော Lantern Pro သို့အဆင့်မြှင့်ပါ။", + "cards.httpsUpgrades.description": "HTTPS အဆင့်မြှင့်တင်မှုများ", + "cards.httpsUpgrades.title": "HTTPS အဆင့်မြှင့်တင်မှုများ - %d", + "cards.httpsUpgrades.text": "Lantern သည် သင်အင်တာနက်သုံးနေစဉ် အချက်အလက်များကိုလျှို့ဝှက်ထားရန် ဖြစ်နိုင်လျှင် မလုံခြုံသော HTTP connection ကို encrypted HTTPS connection များသို့ အလိုအလျောက်အဆင့်မြှင့်သည်။", + "cards.adsBlocked.description": "ကြော်ငြာပိတ်ထား", + "cards.adsBlocked.title": "ပိတ်ထားသောကြော်ငြာများ - %d", + "cards.adsBlocked.text": "Lantern သည် ဝက်ဘ်စာမျက်နှာဖွင့်ချိန်ကို မြန်ဆန်စေရန်၊ bandwidth ကိုချွေတာရန်နှင့် browsing အတွေ့အကြုံကိုချောမွေ့စေရန် ထိုးဖောက်ဝင်ရောက်သောကြော်ငြာများကို ပိတ်ဆို့ထားသည်။", + "cards.dataUsage.description": "ဒေတာအသုံးပြုမှု", + "cards.dataUsage.upgrade": "ယခုအဆင့်မြှင့်ပါ", + "cards.dataUsage.mb-used": "သင်၏ လစဉ်မြန်နှုန်းမြင့်ဒေတာထဲမှ %d/%dMB ကို သင်အသုံးပြုခဲ့သည်။", + "cards.dataUsage.upgrade-link": "အကန့်အသတ်မရှိမြန်ဆန်သော ဝန်ဆောင်မှုအတွက် ယခုအဆင့်မြှင့်ပါ။", + "cards.subscription.description": "Pro စာရင်းသွင်းခြင်း", + "cards.subscription.renew": "သက်တမ်းတိုး", + "cards.subscription.months": "သင်၏စာရင်းသွင်းမှုတွင် Lantern Pro %dလ ကျန်ရှိပါတယ်။", + "cards.subscription.days": "သင်၏စာရင်းသွင်းမှုတွင် Lantern Pro %dရက်ကျန်ရှိပါတယ်။", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "နေ့ရက်များ", + "cards.subscription.renew-link": "အချိန်ပိုထည့်ရန်သင်၏စာရင်းသွင်းမှုကိုသက်တမ်းတိုးပါ။", + "auth.email": "အီးမေးလ်", + "auth.username": "အသုံးပြုသူအမည်", + "auth.username.or.email": "အသုံးပြုသူအမည် သို့မဟုတ် အီးမေးလ်", + "auth.signin": "ဆိုင်းအင်လုပ်ခြင်း", + "current.password": "လက်ရှိစကားဝှက်", + "new.password": "စကားဝှက်အသစ်", + "auth.change.password": "စကားဝှက်ကိုပြောင်းရန်", + "confirm.new.password": "စကားဝှက်အသစ်ကိုအတည်ပြုပါ", + "auth.password": "စကားဝှက်", + "auth.have.recovery.phrase": "ပြန်လည်ရယူရေး စကားစု ရှိပါသလား။", + "auth.forgot.password": "စကားဝှက်မေ့နေပါသလား၊ လုံးဝမရှိဘူးလား။", + "auth.create.account": "အကောင့်ပြုလုပ်ပါ", + "auth.missing.username": "အသုံးပြုသူအမည်ပျောက်နေသည်", + "auth.missing.current.password": "လက်ရှိစကားဝှက်ပျောက်နေသည်", + "auth.missing.new.password": "စကားဝှက်အသစ်ပျောက်နေသည်", + "auth.missing.confirm.password": "အတည်ပြု စကားဝှက်ပျောက်နေသည်", + "invalid_credentials": "မမှန်ကန်သောအထောက်အထားများ", + "yinbi.wallet": "Yinbi ပိုက်ဆံအိတ်", + "create.wallet": "ပိုက်ဆံအိတ်ဖန်တီးပါ", + "new.to.yinbi": "Yinbi အခုမှစသုံးတာလား။", + "setup.wallet": "ဟုတ်တယ်၊ ပိုက်ဆံအိတ်အသစ်တစ်ခု ဖန်တီးကြစို့။", + "web.wallet": "ဟင့်အင်း၊ ကျွန်ုပ်သည် Yin.bi ဝက်ဘ်ဆိုက်ပေါ်တွင်ပိုက်ဆံအိတ်ရှိသည်", + "yinbi.next": "နောက်တစ်ခု", + "yinbi.amount": "ပမာဏ", + "yinbi.missing.address": "ဦးတည်ရာလိပ်စာမရှိပါ", + "yinbi.missing.amount": "သတ်မှတ်ထားသောပမာဏမရှိပါ", + "yinbi.missing.email": "အီးမေးလ်လိပ်စာမသတ်မှတ်ပါ", + "yinbi.missing.username": "အသုံးပြုသူအမည်မသတ်မှတ်ပါ", + "yinbi.missing.password": "စကားဝှက်မရှိပါ", + "yinbi.invalid.address": "{{destination}} မှာ မှန်ကန်သော Stellar လိပ်စာမဟုတ်ပါ", + "yinbi.send": "ပို့ပါ", + "yinbi.to": "သို့-", + "yinbi.try_again": "ထပ်ကြိုးစားမလား။", + "yinbi.success.transaction": "ငွေသွင်းငွေထုတ်အောင်မြင်ပါတယ်", + "yinbi.failure.transaction": "ငွေသွင်းငွေထုတ်မအောင်မြင်ပါ", + "yinbi.confirm.transaction": "ငွေသွင်းငွေထုတ်အတည်ပြုပါ", + "yinbi.sent.details": "{{amount}} YNB ကို {{destination}} သို့ သင်ပို့ခဲ့တယ်", + "yinbi.sent.failure.details": "အောက်ပါအကြောင်းပြချက်များကြောင့် သင်၏ငွေသွင်းငွေထုတ်မအောင်မြင်ခဲ့ပါ-", + "yinbi.recipient": "လက်ခံသူ", + "yinbi.available.send": "သင့်မှာ ပေးပို့ရန် {{balance}} YNB ရနိုင်သည်", + "yinbi.wallet.header": "ပိုက်ဆံအိတ်", + "yinbi.send.header": "Yinbi ပို့ပါ", + "yinbi.recovery.phrase": "Yinbi Recovery Phrase", + "yinbi.recover.account": "သင်၏ Yinbi Wallet နှင့် Lantern အကောင့်ကိုပြန်လည်ရယူရန်သင်၏ Yinbi Recovery Phrase ကိုရိုက်ထည့်ပါ", + "yinbi.recovery.desc": "သင်၏ Lantern အကောင့်အပြင် Yinbi ပိုက်ဆံအိတ်တစ်ခုကို ဆိုင်းအင်လုပ်လိုလျှင် ဤနည်းလမ်းကိုသုံးပါ", + "yinbi.redeem.codes": "Yinbi ကုဒ်များကို အလုံးအရင်းဖြင့်လဲလှယ်ရယူပါ", + "yinbi.obtain.codes": "Yinbi အလုံးအရင်းလဲလှယ်ရယူမှုကုဒ်များကို reseller.lantern.io မှရယူနိုင်သည်", + "yinbi.receive.header": "Yinbi ကိုလက်ခံပါ", + "yinbi.this.is.your.wallet": "ဤသည်မှာ သင်၏ Yinbi ပိုက်ဆံအိတ်လိပ်စာဖြစ်ပြီး လူများက သင့်ထံ YNB ပေးပို့နိုင်သည်။", + "yinbi.your.address": "သင်၏လိပ်စာ", + "yinbi.no.activity.header": "လှုပ်ရှားမှုမရှိပါ", + "yinbi.upgrade.pro.button": "Pro သို့ အဆင့်မြှင့်တင်ပြီး အခမဲ့ Yinbi ရယူပါ", + "yinbi.renew.pro.button": "Pro ကိုသက်တမ်းတိုးပြီးအခမဲ့ရယူပါ", + "yinbi.wallet.activity_header": "လှုပ်ရှားမှု", + "yinbi.wallet.send": "ပို့ပါ", + "yinbi.wallet.receive": "လက်ခံရရှိသည်", + "yinbi.wallet.balance": "လက်ကျန်ငွေ", + "yinbi.wallet.getlantern.pro": "Lantern Pro ကိုအခမဲ့ရယူပါ", + "yinbi.redemption.codes": "Yinbi လဲလှယ်ရယူမှုကုဒ်များ", + "redeem_codes.title": "Yinbi ကုဒ်များကို လဲလှယ်ရယူပါ", + "redeem_codes.redeem_button_text": "လဲလှယ်ရယူပါ", + "redeem_codes.cancel_button_text": "ပယ်ဖျက်ပါ", + "redeem_codes.success": "အောင်မြင်သည်", + "redeem_codes.errors.missing_codes": "ခိုင်လုံသောကုဒ်များကို ရိုက်မထည့်ထားပါ", + "redeem_codes.errors.invalid_codes": "ချို့ယွင်းချက်။ အသားပေးဖော်ပြထားသော ကုဒ်များကို စစ်ဆေးပါ။ Cross-out ကုဒ်သက်တမ်းကုန်သွားပြီ၊", + "yinbi.new.account.text": "Yinbi ကို သင်ပေးပို့ သို့မဟုတ် လက်ခံရရှိသည်နှင့်တပြိုင်နက် သင်၏အရောင်းအဝယ်များသည် ဒီမှာပေါ်လာလိမ့်မည်။", + "yinbi.createAccount": "အကောင့်ပြုလုပ်ပါ", + "yinbi.confirm.account.text": "သင် ဤစကားစုကို မှန်ကန်စွာချရေးထားကြောင်း သေချာစေရန် သင်၏ပြန်လည်ရယူရေးစကားစုမှ အောက်ပါစကားလုံးများကို ဖြည့်ပါ", + "create_account.invalid_words.error": "ထည့်သွင်းလိုက်သောစကားလုံးများသည် ပြန်လည်ရယူရေးစကားစုနှင့် မကိုက်ညီပါ", + "yinbi.recovery_text": "၎င်းသည် သင်၏ Yinbi Wallet Recovery Phrase ဖြစ်သည်။ စကားဝှက်မေ့နေပါက သင့် Yinbi Wallet ကိုပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ဤစကားစုကိုသိမ်းဆည်းသောအခါ စကားဝှက်မန်နေဂျာကိုသုံးပါ (သို့) မိတ္တူကူးပါ။", + "yinbi.recovery_confirm_text": "၎င်းသည် သင်၏ Yinbi Wallet Recovery Phrase ဖြစ်သည်။ စကားဝှက်မေ့နေပါက သင့် Yinbi Wallet ကိုပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ဤစကားစုကိုသိမ်းဆည်းသောအခါ စကားဝှက်မန်နေဂျာကိုသုံးပါ (သို့) မိတ္တူကူးပါ။", + "yinbi.import.wallet": "ဝေါလက်ကို သွင်းပါ", + "yinbi.setup.wallet": "ဝေါလက်ကို စီမံသတ်မှတ်ပါ", + "yinbi.importWallet": "Yin.bi ပိုက်ဆံအိတ်ကိုသွင်းပါ", + "yinbi.import.wallet.continue": "သင်၏ဝေါလက်သို့ ဆက်သွားပါ", + "yinbi.import.wallet.success": "ဝေါလက်တင်သွင်းမှု အောင်မြင်ပါပြီ။", + "yinbi.wallet.text": "Yinbi Wallet ကို ဝင်ရောက်ရန် သင်သည် Yin.bi\nဝက်ဘ်ဆိုက်၌ အရင်ကလက်မှတ်ထိုးခဲ့ဖူးပါက Yin.bi မှ အကောင့်တစ်ခုဖွင့်ရန်၊ ဝင်ရန်\nသို့မဟုတ် သင်၏ပိုက်ဆံအိတ်အားတင်သွင်းရန် ပြုလုပ်နိုင်သည်။", + "yinbi.wallet.pro.text": "Yinbi Wallet ကို ဝင်ရောက်ရန် သင်သည် Yin.bi ဝက်ဘ်ဆိုက်၌ အရင်ကလက်မှတ်ထိုးခဲ့ဖူးပါက Yin.bi မှ အကောင့်တစ်ခုဖွင့်ရန်၊ ဝင်ရန် သို့မဟုတ် သင်၏ပိုက်ဆံအိတ်အားတင်သွင်းရန် ပြုလုပ်နိုင်သည်။", + "yinbi.recovery_subheader": "Yinbi Wallet Recovery Phrase", + "yinbi.import_wallet.subheader": "Yinbi ပိုက်ဆံအိတ်ကိုသွင်းပါ", + "yinbi.import_wallet.text": "သင်၏ပိုက်ဆံအိတ်ကို Lantern သို့ လွှဲပြောင်းရန် သင်၏ Yin.bi အထောက်အထားများကို အသုံးပြု၍ ဆိုင်းအင်လုပ်ပါ", + "yinbi.import_wallet.success": "သင်၏ပိုက်ဆံအိတ်ကိုအောင်မြင်စွာတင်သွင်းနိုင်ပါပြီ၊ ကျေးဇူးပြု၍ သင်၏အကောင့်မှတ်ပုံတင်ခြင်းပြီးဆုံးရန်သင်၏အီးမေးလ်ကိုထည့်ပါ။", + "yinbi.import_wallet.success_subheader": "တင်သွင်းမှု အောင်မြင်ပါပြီ", + "yinbi.import_wallet.button": "Yin.bi ပိုက်ဆံအိတ်ကိုသွင်းပါ", + "yinbi.import_wallet.success_button": "ပြီးပြည့်စုံသောမှတ်ပုံတင်", + "yinbi.recovery_passphrase.label_text": "Recovery Phrase", + "yinbi.recovery_passphrase.copy_button_text": "ကူးပါ", + "terms_of_service.notice": "အသိပေးစာ", + "terms_of_service.i_agree": "ကျွန်တော်သဘောတူသည်", + "platinum": "Platinum", + "platinum.one_year": "1 year pricing", + "platinum.two_years": "2 year pricing", + "platinum.save": "Up to {{savings}}% savings!", + "platinum.unlimited": "Unlimited Data", + "platinum.logs": "မှတ်တမ်းများ မရှိပါ", + "platinum.devices": "ကိရိယာ ၃ ခုအထိချိတ်ဆက်ပါ", + "platinum.everything_in_pro": "Everything included in Pro", + "platinum.faster_data": "ပိုမိုမြန်ဆန်သော ဒေတာစင်တာများ", + "platinum.dedicated": "Dedicated line", + "platinum.reliability": "Increased Reliability", + "platinum.platinum_one_year": "Lantern Platinum 1 year", + "platinum.platinum_two_years": "Lantern Platinum 2 years", + "platinum.pro_one_year": "Lantern Pro 1 year", + "platinum.pro_two_years": "Lantern Pro 2 years", + "platinum.total": "Total", + "platinum.free": "Free", + "platinum.credit.days": "+ {{ days }} days", + "platinum.credit.months": "{{ months }} month(s)", + "platinum.upgrade": "Upgrade to Platinum", + "platinum.upgrade_details": "Dedicated Line + Faster Data centers!", + "platinum.unused_time_disclaimer": "Pro users upgrading to Platinum will see their converted Pro subscription listed as added time above.", + "p2p.opt_in_description": "လူများ အင်တာနက်ကို ဆင်ဆာတည်းဖြတ်ခြင်း မရှိဘဲ ဝင်ရောက်အသုံးပြုနိုင်စေရန် သင့်အင်တာနက်ကို အသုံးပြုပါ", + "p2p.active_sharing_description": "သင်၏အင်တာနက်မျှဝေမှုကို ဖွင့်ထားသည်", + "p2p.dialog.title": "အင်တာနက် အသုံးပြုခွင့်ကို မျှဝေပါ", + "p2p.dialog.text.1": "သင့်ချိတ်ဆက်မှုကို မျှဝေခြင်းဖြင့် အင်တာနက်ကို အကန့်အသတ်ဖြင့် ဝင်ရောက်ခွင့်ရသည့် အခြားသူများကို ကူညီပေးပါ။ သင့်အင်တာနက်ကို အသုံးပြုခွင့်ပေးခြင်းဖြင့် သင်သည် အင်တာနက်ကို ပိုမိုပွင့်လင်းလာစေသည့် စေတနာ့ဝန်ထမ်း ကွန်ရက်တစ်ခု၏ တစ်စိတ်တစ်ပိုင်း ဖြစ်လာပါမည်။", + "p2p.dialog.text.2": "မျှဝေခြင်းသည် သင်၏အထောက်အထား သို့မဟုတ် လုံခြုံမှုကို ထိခိုက်မည် မဟုတ်ပါ။ သင်၏ အင်တာနက်မျှဝေခြင်းကို အချိန်မရွေး ရပ်တန့်နိုင်သည်။", + "p2p.dialog.yes_button": "ဟုတ်ကဲ့၊ မျှဝေခြင်း စတင်ပါ", + "p2p.dialog.no_button": "ပယ်ဖျက်ပါ", + "p2p.banner.introducing": "မိတ်ဆက်", + "top_sites.top_sites": "ထိပ်ဆုံးဆိုဒ်များ" +} \ No newline at end of file diff --git a/locale/translation/nb.json b/locale/translation/nb.json new file mode 100644 index 000000000..773f9924a --- /dev/null +++ b/locale/translation/nb.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Koble til", + "TRAY_DISCONNECT": "Koble fra", + "TRAY_SHOW_LANTERN": "Vis Lantern", + "TRAY_UPGRADE_TO_PRO": "Oppgrader til Pro", + "TRAY_QUIT": "Avslutt Lantern", + "BACKEND_DATA_TITLE": "Ikke mer høyhastighets Lantern data", + "BACKEND_DATA_MESSAGE": "Vennligst oppdater til Pro for å bruke Lantern med full hastighet ", + "BACKEND_DATA_PERCENT_TITLE": "%s av din Lantern-data brukt", + "BACKEND_DATA_PERCENT_MESSAGE": "Du har brukt %s av din Lantern høyhastighetsdata for denne måneden. Oppgrader nå.", + "BACKEND_CLICK_LABEL": "Åpne", + "BACKEND_CLICK_LABEL_OPEN": "Åpne", + "BACKEND_CLICK_LABEL_HELP": "Hjelp", + "BACKEND_CLICK_LABEL_GOT_IT": "Skjønner", + "BACKEND_AUTOUPDATED_TITLE": "Oppgrader Lantern til versjon %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s har blitt lastet ned. Start Lantern på nytt for å bruke det.", + "BACKEND_MITM_INSTALL_CERT": "Lantern ønsker å installere et egendefinert sertifikat for å avblokkere trafikken din.", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Tillat %v å gjøre endringer på systemet ditt", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern er et program som tilbyr rask, pålitelig og sikker tilgang til det åpne Internett.", + "about.faq": "Les Lanterns O-S-S", + "about.open": "Åpent Internett for alle", + "about.questions": "Spørsmål?", + "about.title": "Om", + "account.cancel": "Si opp Pro-konto", + "account.free.cap": "{{mb}} MB gjenstående av din månedlige gratisdata", + "account.free.cap.upgrade": "Oppgrader til Pro for ubegrenset høyhastighetsdata", + "account.freelink.validFor": "gyldig i %s", + "account.freelink.desc": "For å lenke denne enheten til din Pro-konto:", + "account.freelink.step1": "1. Åpne 'Legg til enhet'-menyvalget på din Pro-enhet.", + "account.freelink.step2": "2. Skriv inn enhetslenkingskoden, og send inn.", + "account.freelink.reminder": "* Forsikre deg om at du har oppdatert til siste versjon av Lantern på din Pro-enhet", + "account.freelink.errorTitle": "Feil under sammenlenking", + "account.freelink.errorText": "Er du sikker på at du skrev inn koden på din Pro-enhet?", + "account.freelink.headerDesc": "Lenk denne enheten til din Pro-konto", + "account.freelink.title": "Kode for sammenlenking av enheter", + "account.pro.charge": "Din konto vil automatisk bli belastet for medlemskap for ett nytt år med Lantern Pro når den betalte perioden utløper.", + "account.upgrade": "Oppgrader til Pro", + "account.pro.email": "E-postadresse:", + "account.pro.expired": "Din Pro-konto har utløpt. Forny for ubegrenset månedlig data.", + "account.pro.expiry": "Din Pro-konto utløper om %s dager på %s", + "account.pro.bonusMonths": "Dette inkluderer dine {{bonusMonths}} bonusmåneder!", + "account.pro.thisdevice": "(Denne enheten)", + "account.pro.logout": "LOGG UT", + "account.pro.removedevice": "FJERN", + "account.pro.devices": "Enheter autorisert til å bruke din Pro-konto:", + "account.pro.device.confirm.title": "Fjern autorisering for enhet", + "account.pro.device.confirm": "Er du sikker på at du vil fjerne \"{{device}}\" fra din Lantern Pro-konto?", + "account.pro.device.one.title": "Bare én enhet", + "account.pro.device.one": "Beklager, du kan ikke fjerne din sist autoriserte enhet.", + "account.pro.linkingcode": "Kode for sammenlenking av enheter", + "account.pro.renew": "FORNY PRO-KONTO", + "account.prolink.errorTitle": "Feil under sammenlenking", + "account.prolink.errorText": "Er du sikker på at du kopierte koden på rett vis fra din andre enhet?", + "account.prolink.successTitle": "Enhet lenket", + "account.prolink.successText": "Du har lenket din enhet. Vent en stund før din andre enhet automatisk blir Pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Avbryt", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kortnummer", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Måned", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "År", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Feil", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Prøv igjen", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Autoriser enhet for Pro", + "authorize.step1.have_pro_device": "Jeg har en annen Lantern Pro-enhet", + "authorize.step1.link": "Lenk denne enheten", + "authorize.step1.or": "eller", + "authorize.step1.recover": "Jeg må gjenopprette min Lantern Pro-konto", + "authorize.step1.start": "start gjenoppretting", + "authorize.step1.no_mail": "Husker du ikke din e-postadresse?", + "authorize.step2b.enter_code": "Skriv inn din kontogjenopprettingskode", + "authorize.step2b.code": "Kontogjenopprettingskode", + "authorize.step2b.instruction": "En e-post med gjenopprettelseskoden har blitt sendt til {{email}}. Det kan ta flere timer for denne e-posten kommer fram. Sjekk spøppelpost-mappa di hvis du ikke finner den.", + "authorize.step2b.no_mail": "Mottok ingen e-post", + "authorize.step3.recovery": "Kontogjenoppretting", + "authorize.step3.no_email": "Oida! Vi har problemer med å finne den e-postadressen. Oppgi mer informasjon nedenfor for å hjelpe oss å finne kontoen din.", + "authorize.step3.no_code_received": "Har du problemer med å motta gjenopprettelsese-posten? Skriv inn informasjonen nedenfor og vi vil ta kontakt med deg i løpet av de neste 48 timene.", + "authorize.step3.your_email": "Din e-post", + "authorize.step3.payment_method": "Betalingsmetode", + "authorize.step3.payment_method_hint": "Velg ønsket betalingsmetode for kjøp av Pro", + "authorize.step3.credit_card": "Betalingskort", + "authorize.step3.alipay": "Alipay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Mottok Pro ved å referere en venn", + "authorize.step3.payment_account": "Betalingskonto", + "authorize.step3.payment_account_hint": "Skriv inn din Alipay-kontoinformasjon", + "authorize.step3.referral_code": "Din referent-kode", + "authorize.step3.purchase_date": "Kjøpsdato", + "authorize.step3.note": "Skriv ned all informasjon som kan hjelpe oss å finne kontoen din.", + "authorize.step4.title": "Konto-gjenoppretting underveis", + "authorize.step4.text1": "Takk, vi har mottatt din kontogjenopprettingsforespørsel.", + "authorize.step4.text2": "Gi oss 48 timer til å hente din Pro-kontoinformasjon.", + "authorize.step4.text3": "Vi vil sende informasjonen til e-postadressen oppgitt i forrige steg.", + "authorized.continue": "Fortsett til Pro", + "authorized.text": "Denne enheten er nå autorisert til å bruke din Lantern Pro-konto.", + "authorized.title": "Enhet autorisert", + "button.renew": "Forny", + "button.upgrade": "Oppgrader", + "button.upgrade_now": "Oppgrader nå", + "button.upgrade_to_lantern_pro": "Oppgrader til Lantern Pro", + "button.copy_your_code": "Kopier din kode", + "button.try_again": "Prøv igjen", + "button.continue": "Fortsett", + "bullet.click_button": "Klikk på knappen nedenfor", + "bullet.paste_code": "Lim inn koden og nedlastingslenken i en melding", + "bullet.send_to_friends": "Send til dine venner", + "cancel": "Avbryt", + "confirm": "Bekreft", + "google_search": "Google-søk", + "link_device": "Har du allerede en Pro-konto? Lenk enheten", + "err.unknown_error": "Ukjent feil", + "err.internal_error": "Intern feil", + "err.bad_input": "Feilaktig inndata", + "err.not_authorized": "Not authorized", + "err.user_exists": "Brukeren finnes", + "err.no_such_user": "Ingen slik bruker", + "err.user_already_verified": "Brukeren er allerede bekreftet", + "err.invalid_user_verification": "Ugyldig brukerbekreftelse", + "err.user_unverified": "Brukeren er ikke bekreftet", + "err.operation_temporarily_unavailable": "Operasjonen er ikke tilgjengelig for øyeblikket", + "err.wrong_or_inexistent_plan": "Feil eller ikke-eksisterende plan", + "err.user_has_active_subscription": "Brukeren har aktivt abonnement", + "err.payment_error": "Betailingsfeil", + "err.no_codes_left": "Ingen referent-koder igjen", + "err.wrong_code": "Feil referent-kode", + "err.redeeming_own_code_not_allowed": "Å løse inn koder for seg selv tillates ikke", + "err.wrong_charge_id": "Feil betalings-ID", + "footer.reseller": "Tjen penger. Bli en Lantern Pro selger. Klikk her", + "footer.reseller.email_subject": "Fortell meg mer om Lantern Pro-salgsprogrammet.", + "footer.reseller.email_body": "Når du blir en Lantern-selger har du muligheten til å tjene opptil 25% på hvert salg av Lantern Pro-abonnementer. Fortell oss litt om hvorfor du ønsker å bli en selger nedenfor.", + "feature.faster_speed": "Høyere hastighet", + "feature.faster": "Faster data centers", + "feature.unlimited": "Ubegrenset data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Ingen reklame", + "feature.antiblock": "Blokkeringsmotstandig", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Raskere. Sterkere. Ubegrenset. Sikkert.", + "free.link_account": "Har du allerede en Pro-konto? Lenk sammen kontoen din.", + "home.get_lantern_pro": "Få Lantern Pro", + "input.email": "E-post", + "input.your_email": "Din e-postadresse", + "input.confirm_email": "Bekreft e-postadresse", + "input.enter_email": "Skriv inn din e-postadresse", + "input.use_valid_email": "Skriv inn en gyldig e-postadresse", + "input.email_not_match": "E-postfeltene samsvarer ikke", + "issue.your_email": "Din e-post", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Prøv igjen", + "issue.select_issue": "Velg et problem", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Velg et problem fra rullegardinsmenyen", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Feil ved rapportering av feil", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Kan ikke nå blokkerte sider", + "issue.type.payment_fail": "Kan ikke fullføre betalingen", + "issue.type.cannot_login": "Kan ikke logge inn", + "issue.type.always_spinning": "Innlastingssymbolet spinner endeløst", + "issue.type.slow": "Treg", + "issue.type.cannot_link_device": "Kan ikke sammenlenke enheter", + "issue.type.crashes": "Lantern-kræsj", + "issue.type.other": "Annet", + "languages.title": "Språk", + "mobile.link": "Bruk lenken for å laste ned Lantern på din Android-enhet.", + "mobile.title": "Hent Android-versjonen", + "nav.about": "Om", + "nav.account": "Kontobehandling", + "nav.authorize": "Legg til enhet", + "nav.authorized": "Enhet autorisert", + "nav.unauthorized_link": "Autoriser enhet for Pro", + "nav.language": "Språk", + "nav.lantern": "Lantern", + "nav.mobile": "Hent mobil-versjon", + "nav.report_issue": "Rapporter en feil", + "nav.settings": "Innstillinger", + "nav.verify": "Kontobekreftelse", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Forsøk på nytt", + "notifications.whatisnew": "What's New?", + "payment.close": "Lukk", + "payment.wait_for_pro": "Takk for at du kjøpte Lantern Pro. Vente en stund før din Lantern automatisk blir Lantern Pro.", + "payment_methods.select_name": "Velg betalingsmetode", + "payment_methods.alipay": "Betalingskort/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "For å kjøpe Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi-veivisning", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Det beste kjøpet.", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "ett år", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "%.02f¥", + "plan.price.usd": "%.02f$", + "plan.currency.cny": "(CNY)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/ÅR", + "plan.select": "Velg", + "plans.title": "Lantern Pro-planer", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Dine kreditter vil bli lagt til kontoen din i neste betalingsrunde.", + "pro.title": "Inviter venner, får mer Pro gratis", + "pro.subtitle": "Når din venn kjøper toårsplanen får hver av dere tre måneder med Pro gratis, énårsplanen gir hver av dere én måned gratis.", + "pro.share": "Del koden din med venner for å starte opptjeningen av kreditter.", + "promotion.title": "Til betaling for Lantern Pro", + "promotion.title.activation": "Lantern Pro-aktivisering", + "promotion.enter_and_confirm_email": "Skriv inn og bekreft din e-postadresse", + "promotion.code.hint": "Skriv inn din venns referent-kode (valgfritt)", + "promotion.code.label": "Referent-kode", + "promotion.payment": "Fortsett til betaling", + "promotion.loading": "Laster…", + "promotion.howto_1y": "Hvis en venn delte sin referent-kode med deg, skriv inn koden for å få én måned med Lantern Pro gratis etter utsjekking.", + "promotion.howto_2y": "Hvis en venn delte sin referent-kode med deg, skriv inn koden for å motta tre måneder med Lantern Pro gratis etter betaling.", + "promotion.pay": "Betal {{amount}}", + "promotion.select": "Velg", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Denne referent-koden har allerede blitt lagt til. Betal nå for å motta dine ekstramåneder.", + "promotion.activation.enter_and_confirm_email": "Skriv inn og bekreft din e-postadresse for å registrere din Lantern Pro-konto.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Skriv inn din aktiveringskode", + "promotion.activation.howto": "Skriv din 25 tegn lange Lantern Pro-aktiviseringskode ovenfor. Hvis du ikke har en kode, kjøp Pro på forrige skjerm eller se etter en Lantern Pro selger på nett.", + "promotion.activation.continue": "Fortsett til Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Del din referent-kode", + "referral.text": "Bruk koden min %s og få tre måneder gratis når du melder deg på.", + "renew.title_30_days": "Forny nå for 3 måneder gratis!", + "renew.title_2_days": "Lantern Pro utløper i morgen.\nForny nå og få 3 måneder gratis!", + "renew.title_last_day": "Lantern Pro utløper i dag.\nIkke gå glipp av din Pro-rabatt!", + "renew.title_expired": "Lantern Pro har utløpt", + "renew.details_30_days": "Ditt Lantern Pro-medlemskap slutter snart, forny nå og nyt opptil tre måneder gratis! Dette tidsbegrensede tilbudet er bare gyldig for tidlige fornyelser.", + "renew.details_2_days": "Ditt Lantern Pro-medlemskap slutter snart, forny nå og nyt opptil tre måneder gratis! Dette tidsbegrensede tilbudet er bare gyldig for tidlige fornyelser.", + "renew.details_last_day": "Forny nå og få opptil tre måneder gratis!\nDette er siste sjanse til å benytte seg av dette tilbudet.\nLantern Pro-brukere får mer fart, ubegrenset data, bedre blokkeringsmotstandsdyktighet, tre enheter og ingen reklame.", + "renew.details_expired": "Forny nå og få 45 dager ekstra gratis. Tilbudet er tidsbegrenset.\nLantern Pro-brukere får mer hastighet, ubegrenset data, bedre blokkeringsmotstandsdyktighet, tre enheter og ingen reklame.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 GRATIS MÅNED", + "renew.plan_renewal_bonus_months": "$%d%s + %d GRATISMÅNEDER", + "renew.plan_renewal_bonus_days": "$%d%s + %d GRATISMÅNEDER", + "renew.next": "neste", + "renew.decline": "Avslå tilbud", + "renew.decline_question": "Er du sikker på at du vil avslå dette tilbudet?", + "renew.decline_yes": "Forny senere", + "renew.decline_dismiss": "Forny nå", + "renew.notification_title_30_days": "Forny Pro for store kostnadskutt!", + "renew.notification_text_30_days": "Din Lantern Pro-konto utløper om {{days}} dager. Forny nå og få opptil 3 måneder gratis.", + "renew.notification_title_2_days": "Tilbudet om Lantern Pro-rabatt utgår i morgen!", + "renew.notification_text_2_days": "Din Pro-konto utløper i morgen. Ikke gå glipp av denne muligheten til store kostnadskutt.", + "renew.notification_title_last_day": "Siste sjanse for kostnadskutt.", + "renew.notification_text_last_day": "Din Lantern Pro konto har utløpt. Forny i dag og få opptil 3 måneder gratis.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Dokumenter", + "replica.other": "Annet", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Neste", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Lukk", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Avbryt", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Nedlasting", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Generelt", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Kjør Lantern ved systemoppstart", + "settings.autoReport": "Rapprter bruksstatistikk sikkert for å bidra til Lantern", + "settings.proxyAll": "Kjør all trafikk gjennom proxy", + "settings.proxyAllHelpTitle": "HVA GJØR \"MELLOMTJEN ALL TRAFIKK\"?", + "settings.proxyAllHelp1": "Hvis påskrudd, vil all trafikk bli sendt gjennom Lantern (det sikreste valget)", + "settings.proxyAllHelp2": "Hvis avskrudd, vil blokkert trafikk bli sendt gjennom Lantern (raskeste valg, mest vanlig).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Behandle systemmellomtjener", + "settings.title": "Innstillinger", + "settings.http_proxy": "HTTP(S)-mellomtjener:", + "settings.socks_proxy": "SOCKS-mellomtjener:", + "settings.caution": "Vær forsiktig:", + "settings.caution_text": "Når du fjerner markeringen av \"Behandle systemmellomtjener\" vil din nettleser og dine probgrammer ikke være i stand til å bruke Lantern automatisk. Hvis du vet hvordan du manuelt setter opp disse innstillingene, henvend deg til informasjonen ovenfor.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Tjenerplassering", + "status.tooltip1": "Lantern bruker smart tjenerutvelgelse for å koble deg til våre beste datasentre.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Kobler til...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Hastighet nedsatt (båndbreddebegrensning)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Ønsker du å lenke en annen enhet til denne Pro-kontoen? Skriv inn din enhetslenkingskode nedenfor", + "verify.code": "Kode for sammenlenking av enheter", + "verify.howto_1": "Hvis du har en Lantern Pro-konto på en annen enhet, skriv inn din e-postadresse her for å motta en kode for å autorisere enheten", + "verify.howto_1a": "Du er for tiden en uautorisert Pro-bruker. Skriv inn din e-postadresse for å autorisere din Pro-konto. Dette vil la deg lenke flere enheter.", + "verify.howto_3": "1. Åpne \"Autoriser enhet for Pro\"-menyvalget på din uautoriserte enhet.", + "verify.howto_4": "2. Skriv inn lenkingskoden du fikk i steg 1, og send inn.", + "verify.reminder": "* Forsikre deg om at du har oppgradert til siste versjon av Lantern på din uautoriserte enhet", + "verify.submit": "Send inn", + "verify.title": "Kontobekreftelse", + "welcomeToPro.continue": "Fortsett til Pro", + "welcomeToPro.invite": "Inviter venner og hver av dere vil få tre måneder gratis når de kjøper toårsplanen. Énårsplanen gir hver av dere én måned gratis. Send ut invitasjonene.", + "welcomeToPro.thanks": "Takk for at du kjøpte Lantern Pro!", + "welcomeToPro.title": "Velkommen til Lantern Pro", + "messages.copied_to_clipboard": "Kode kopiert. Del den med dine venner!", + "messages.datacap": "Du har brukt din gratishøyhastighetsdata. Oppgrader til Pro for ubegrenset sådan.", + "messages.fatal_error": "Beklager, vi har problemer med å koble til Lantern-tjenerne. Sjekk din internettilkobling og prøv igjen.", + "messages.backend_gone": "Beklager, Lanter ser ikke til å kjøre lenger. Start det på nytt og prøv igjen.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Inviter venner", + "freeProCredits.shareWithFriends": "Del din kode med venner for å få gratismåneder!", + "freeProCredits.shareWithFriendsDesc": "Når din venn kjøper toårsplanen vil hver av dere få tre måneder gratis, énårsplanen gir hver av dere én måned gratis.", + "cards.serverLocation.unknown": "Ukjent", + "cards.serverLocation.description": "Optimisert tjenerplassering", + "cards.serverLocation.description-free": "Tjenerplassering", + "cards.serverLocation.description-upgrade": "Oppgrader for raskere tjenere", + "cards.serverLocation.title": "Nåværende plassering:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern bruker smart tjenervalg for å automatisk finne den raskeste tilkoblingen fra deg til våre datasenter i Tokyo, Singapore, Hongkong, San Fransisco, New York, Amsterdam, Bangalore med mer.", + "cards.serverLocation.text-free": "Lantern bruker smart tjenerutvelgelse for å koble deg til våre beste datasentre.", + "cards.serverLocation.upgrade-link": "Oppgrader til Lantern Pro for raskere hastighet og optimisert tjenerutvelgelse fra får eksklusive Lantern Pro-datasentre.", + "cards.httpsUpgrades.description": "HTTPS-oppgraderinger", + "cards.httpsUpgrades.title": "HTTPS-oppgraderinger: %d", + "cards.httpsUpgrades.text": "Lantern oppgraderer automatisk usikrede HTTP-tilkoblinger til krypterte HTTPS-tilkoblinger når mulig for å holde informasjonen din privat når du surfer på nettet.", + "cards.adsBlocked.description": "Reklamer blokkert", + "cards.adsBlocked.title": "Blokkerte reklamer: %d", + "cards.adsBlocked.text": "Lantern blokkerer pågående reklame for å forbedre sidelastingstid, spare båndbredde, og for å gi deg en bedre nettlesningsopplevelse.", + "cards.dataUsage.description": "Databruk", + "cards.dataUsage.upgrade": "Oppgrader nå", + "cards.dataUsage.mb-used": "Du har brukt %d/%dMB av din månedlige høyhastighetsdata.", + "cards.dataUsage.upgrade-link": "Oppgrader til Pro for ubegrenset høyhastighetsdata!", + "cards.subscription.description": "Pro-abonnement", + "cards.subscription.renew": "Forny", + "cards.subscription.months": "Du har %d måneder av Lantern Pro igjen i ditt abonnement.", + "cards.subscription.days": "Du har %d dager av Lantern Pro igjen i dit abonnement.", + "cards.subscription.unit.months": "MÅN.", + "cards.subscription.unit.days": "DAG.", + "cards.subscription.renew-link": "Forny ditt abonnement for å legge til mer tid." +} \ No newline at end of file diff --git a/locale/translation/nl.json b/locale/translation/nl.json new file mode 100644 index 000000000..0d8b9b7eb --- /dev/null +++ b/locale/translation/nl.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Verbinden", + "TRAY_DISCONNECT": "Verbreek verbinding", + "TRAY_SHOW_LANTERN": "Lantern tonen", + "TRAY_UPGRADE_TO_PRO": "Upgraden naar Pro", + "TRAY_QUIT": "Lantern afsluiten", + "BACKEND_DATA_TITLE": "Geen hoge snelheid Lantern data over", + "BACKEND_DATA_MESSAGE": "Kies Pro om Lantern op volle snelheid te gebruiken!", + "BACKEND_DATA_PERCENT_TITLE": "%s van je Lantern gegevens bereikt", + "BACKEND_DATA_PERCENT_MESSAGE": "Je hebt %1$s gebruikt van je Lantern hoge datasnelheid voor deze maand. Nu upgraden!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "Ik snap het", + "BACKEND_AUTOUPDATED_TITLE": "Werk Lantern bij tot versie %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s is gedownload. Herstart Lantern om te gebruiken", + "BACKEND_MITM_INSTALL_CERT": "Lantern wil een aangepast certificaat installeren om uw netverkeer te deblokkeren.", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Sta %v toe veranderingen te maken op uw systeem", + "BACKEND_ALERT_TITLE": "Een kritieke waarschuwing vereist uw aandacht", + "about.content": "Lantern is een app die snelle, betrouwbare en veilig toegang bied tot het open internet.", + "about.faq": "Lees de Lantern FAQs", + "about.open": "Vrij Internet voor iedereen", + "about.questions": "Vragen?", + "about.title": "Over", + "account.cancel": "Pro Account annuleren", + "account.free.cap": "{{mb}} MB over van uw maandelijkse gratis data", + "account.free.cap.upgrade": "Upgrade naar Pro voor ongelimiteerd hoge datasnelheid", + "account.freelink.validFor": "geldig voor %s", + "account.freelink.desc": "Om dit apparaat te linken aan je Pro-account:", + "account.freelink.step1": "1. Open het 'Apparaat toevoegen' menupunt in je Pro apparaat.", + "account.freelink.step2": "2. Vul de apparaat link-code in en klik op indienen. ", + "account.freelink.reminder": "* Controleer of je de nieuwste versie van Lantern gebruikt op je Pro-apparaat.", + "account.freelink.errorTitle": "Fout tijdens het verbinden", + "account.freelink.errorText": "Controleer of je de code hebt ingegeven in je Pro-apparaat?", + "account.freelink.headerDesc": "Verbind dit toestel met je Pro-account", + "account.freelink.title": "Apparaat link-code ", + "account.pro.charge": "Er wordt automatisch een jaar in rekening gebracht op je account voor Lantern Pro tegen het einde van de looptijd.", + "account.upgrade": "Upgraden naar Pro", + "account.pro.email": "Email Adres:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(Dit toestel)", + "account.pro.logout": "UITLOGGEN", + "account.pro.removedevice": "VERWIJDER", + "account.pro.devices": "Geauthotiseerde apparaten aangesloten op uw Pro account:", + "account.pro.device.confirm.title": "Apparaat loskoppelen", + "account.pro.device.confirm": "Weet u zeker dat u '{{device}}' wilt verwijderen van uw Lantern Pro account?", + "account.pro.device.one.title": "Maar één apparaat", + "account.pro.device.one": "Sorry maar je kunt het apparaat niet verwijderen dat je als laatste hebt geautoriseerd", + "account.pro.linkingcode": "Apparaat link-code ", + "account.pro.renew": "HERNIEUW PRO ACCOUNT", + "account.prolink.errorTitle": "Fout tijdens het verbinden", + "account.prolink.errorText": "Weet je zeker dat je code foutloos hebt gekopieerd van je andere apparaat?", + "account.prolink.successTitle": "Apparaat gelinkt", + "account.prolink.successText": "Je toestel linken is gelukt! Na enkele ogenblikken zal je andere apparaat automatisch pro worden.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Annuleren", + "adyen.dismissButton": "Oké", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kaartnummer", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Maand", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Jaar", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Fout", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Probeer opnieuw", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Autoriseer apparaat voor Pro", + "authorize.step1.have_pro_device": "Ik heb nog een Lantern Pro apparaat", + "authorize.step1.link": "Dit toestel linken", + "authorize.step1.or": "of", + "authorize.step1.recover": "Ik moet mijn Lantern Pro account herstellen", + "authorize.step1.start": "herstel beginnen", + "authorize.step1.no_mail": "Weet je je e-mailadres niet meer?", + "authorize.step2b.enter_code": "Vul je account herstelcode in", + "authorize.step2b.code": "Account-herstel code", + "authorize.step2b.instruction": "Een e-mail met een herstelcode is verzonden naar {{email}}. Het kan enkele uren duren voordat de mail wordt ontvangen. Check ook je spam als je deze niet kunt vinden tussen je gewone berichten.", + "authorize.step2b.no_mail": "Geen e-mail ontvangen", + "authorize.step3.recovery": "Account-herstel", + "authorize.step3.no_email": "Oeps! We kunnen dat e-mailadres niet vinden. Geef onderstaand meer informatie zodat we je accountgegevens kunnen traceren.", + "authorize.step3.no_code_received": "Problemen met het ontvangen van herstelbericht? Geef de informatie hieronder door en we nemen binnen 48 uur contact op.", + "authorize.step3.your_email": "Uw e-mail", + "authorize.step3.payment_method": "Betaalwijze", + "authorize.step3.payment_method_hint": "Selecteer de betaalwijze die je hebt gebruikt om Pro aan te schaffen", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Pro ontvangen met verwijzingscode", + "authorize.step3.payment_account": "Betaalrekening", + "authorize.step3.payment_account_hint": "Vul je Alipay account in", + "authorize.step3.referral_code": "Uw Referentie Code", + "authorize.step3.purchase_date": "Aankoopdatum", + "authorize.step3.note": "Noteer ook andere informatie die ons kan helpen om je account te traceren.", + "authorize.step4.title": "Accountherstel in bewerking", + "authorize.step4.text1": "Bedankt. We hebben je aanvraag accountherstel ontvangen.", + "authorize.step4.text2": "Het kan 48 uur duren om je Pro-account te herstellen.", + "authorize.step4.text3": "We zullen informatie sturen naar het e-mailadres dat is ingevuld op het vorige scherm.", + "authorized.continue": "Doorgaan met Pro", + "authorized.text": "Dit toestel is nu geautoriseerd om je Lantern Pro account te gebruiken!", + "authorized.title": "Apparaat authorisatie", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade naar Lantern Pro", + "button.copy_your_code": "Kopieer uw code", + "button.try_again": "Probeer opnieuw", + "button.continue": "Ga verder", + "bullet.click_button": "Klik op de knop beneden", + "bullet.paste_code": "Plak de code & dowload link in een bericht", + "bullet.send_to_friends": "Stuur naar vrienden", + "cancel": "Annuleren", + "confirm": "Bevestigen", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Onbekende fout", + "err.internal_error": "Interne fout", + "err.bad_input": "Verkeerde invoer", + "err.not_authorized": "Not authorized", + "err.user_exists": "Bestaande gebruiker", + "err.no_such_user": "Gebruiker bestaat niet", + "err.user_already_verified": "Gebruiker al geverifieerd", + "err.invalid_user_verification": "Ongeldige gebruiker verificatie", + "err.user_unverified": "Gebruiker ongeverifieerd", + "err.operation_temporarily_unavailable": "Bewerking tijdelijk niet beschikbaar", + "err.wrong_or_inexistent_plan": "Abonnement verkeerd of bestaat niet", + "err.user_has_active_subscription": "Gebruiker heeft een actief abonnement", + "err.payment_error": "Betaalfout", + "err.no_codes_left": "Geen verwijscode over", + "err.wrong_code": "Fouts verwijscode", + "err.redeeming_own_code_not_allowed": "Het inlossen van eigen codes is niet toegestaan", + "err.wrong_charge_id": "Verkeerde ID", + "footer.reseller": "Geld verdienen! Word een Lantern Pro wederverkoper. Klik hier", + "footer.reseller.email_subject": "Wat betekent Lantern reseller!", + "footer.reseller.email_body": "Wanneer je een Lantern reseller bent heb je de mogelijkheid om 25% op elke verkoop te verdienen van een Lantern Pro abonnement. Vertel ons hieronder waarom je een reseller wilt worden.", + "feature.faster_speed": "Hoge Snelheid", + "feature.faster": "Faster data centers", + "feature.unlimited": "Ongelimiteerde data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Geen advertenties", + "feature.antiblock": "Blokkade resistent", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Krijg Lantern Pro", + "input.email": "E-mail", + "input.your_email": "Je e-mailadres", + "input.confirm_email": "Bevestig het e-mailadres", + "input.enter_email": "Vul je e-mailadres in", + "input.use_valid_email": "Typ een geldig e-mailadres", + "input.email_not_match": "E-mailvelden stemmen niet overeen", + "issue.your_email": "Uw e-mail", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Probeer opnieuw", + "issue.select_issue": "Selecteer een probleem", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Selecteer een probleem uit de selectielijst", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Fout tijdens het rapporteren van een probleem", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Kan geblokkeerde websites niet openen", + "issue.type.payment_fail": "Kan betaling niet afronden", + "issue.type.cannot_login": "Kan niet inloggen", + "issue.type.always_spinning": "Laden duurt oneindig lang", + "issue.type.slow": "Langzaam", + "issue.type.cannot_link_device": "Kan geen toestellen linken", + "issue.type.crashes": "Lantern crasht", + "issue.type.other": "Anders", + "languages.title": "Talen", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Over", + "nav.account": "Accountbeheer", + "nav.authorize": "Apparaat toevoegen", + "nav.authorized": "Apparaat authorisatie", + "nav.unauthorized_link": "Autoriseer apparaat voor Pro", + "nav.language": "Taal", + "nav.lantern": "Lantern", + "nav.mobile": "Download mobiele versie", + "nav.report_issue": "Rapport verzenden", + "nav.settings": "Instellingen", + "nav.verify": "Account verificatie", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Opnieuw proberen", + "notifications.whatisnew": "What's New?", + "payment.close": "Sluiten", + "payment.wait_for_pro": "Bedankt voor de aanschaf van Lantern Pro! Een ogenblik geduld AUB. Lantern wordt automatisch Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Beste deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 jaar", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Selecteer", + "plans.title": "Lantern Pro abonnementen", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Voor Windows, ndroid, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Je bonus wordt bijgeschreven op je account met de volgende factuur.", + "pro.title": "Nodig vrienden uit en ontvang meer Pro gratis", + "pro.subtitle": "Wanneer je vriend een tweejarig abonnement neemt ontvangt ieder van jullie 3 extra maanden van Pro, met een eenjarig abonnement ontvangt een ieder 1 maand gratis.", + "pro.share": "Deel je code met vrienden en verdien meer bonus!", + "promotion.title": "Lantern Pro afrekenen", + "promotion.title.activation": "Lantern Pro activatie", + "promotion.enter_and_confirm_email": "Vul je e-mailadres in en bevestig dit", + "promotion.code.hint": "Vul de verwijscode in van je vriend (optioneel)", + "promotion.code.label": "Verwijscode", + "promotion.payment": "Naar betaling", + "promotion.loading": "Bezig met laden...", + "promotion.howto_1y": "Als je een verwijscode hebt ontvangen van een vriend, vul de code in om een gratis maand voor Lantern Pro te ontvangen na het afrekenen.", + "promotion.howto_2y": "Als je een verwijscode hebt ontvangen van een vriend, vul de code in om drie gratis maanden voor Lantern Pro te ontvangen na het afrekenen.", + "promotion.pay": "Betaal {{amount}}", + "promotion.select": "Selecteer", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Deze verwijscode is al toegevoegd. Reken nu af en ontvang je extra maanden.", + "promotion.activation.enter_and_confirm_email": "AUB e-mailadres invullen en bevestigen om je Lantern Pro account te registreren.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Vul de activatiecode in", + "promotion.activation.howto": "Vul de 25 tekens in van de Lantern Pro activatiecode hierboven. Als je geen code hebt, schaf AUB Pro aan op het vorige scherm of zoek online een Lantern Pro reseller.", + "promotion.activation.continue": "Doorgaan met Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Deel je verwijscode", + "referral.text": "Gebruik mijn code %s en ontvang 3 maanden gratis wanneer je registreert!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Documenten", + "replica.other": "Anders", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Volgende", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Sluiten", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Annuleren", + "replica.delete": "Verwijder", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Downloaden", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Algemeen", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Lantern openen bij systeemstart", + "settings.autoReport": "Veilig rapporteren van gebruiksstatistieken om Lantern te helpen verbeteren", + "settings.proxyAll": "Proxy al het verkeer", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Beheer systeem proxy", + "settings.title": "Instellingen", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Waarschuwing:", + "settings.caution_text": "Wanneer je het vinkje weghaalt bij \"Beheer system proxy\" kunnen je browser en apps niet automatisch Lantern gebruiken. Indien je weet hoe je deze instelling handmatig moet configureren zie bovenstaande informatie.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Verbinden...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Nog een toestel linken aan dit Pro-account? Vul je Apparaat link-code hieronder in", + "verify.code": "Apparaat link-code ", + "verify.howto_1": "Als je een Lantern Pro account hebt op een ander apparaat vul hier je e-mailadres in en ontvang een code om dat toestel te autoriseren.", + "verify.howto_1a": "Je bent nu een niet-geautoriseerde Pro gebruiker. Vul je e-mailadres in om je Pro-account te autoriseren. Daarna kan je meerdere toestellen linken.", + "verify.howto_3": "1. Open het menupunt 'Autoriseer apparaat voor Pro' in je niet-geautoriseerde apparaat.", + "verify.howto_4": "2. Vul de link-code in verkregen in stap 1 en indienen.", + "verify.reminder": "* Controleer of je de nieuwste versie van Lantern gebruikt op je niet-geautoriseerde apparaat.", + "verify.submit": "Indienen", + "verify.title": "Account verificatie", + "welcomeToPro.continue": "Doorgaan met Pro", + "welcomeToPro.invite": "Nodig vrienden uit en je ontvangt ieder 3 gratis maanden wanneer ze een tweejarig abonnement aanschaffen, bij een eenjarig abonnement ontvangt eenider 1 gratis maand. Begin met uitnodigen!", + "welcomeToPro.thanks": "Bedankt voor het aanschaffen van Lantern Pro!", + "welcomeToPro.title": "Welkom bij Lantern Pro", + "messages.copied_to_clipboard": "Code gekopieerd. Deel deze met je vrienden!", + "messages.datacap": "Je gratis datasnelheid is gebruikt. Upgrade naar Pro voor onbeperkt hoge datasnelheid.", + "messages.fatal_error": "Sorry, de Lantern servers lijken moeilijk bereikbaar. Controleer uw internetverbinding en probeer het opnieuw.", + "messages.backend_gone": "Sorry, Lantern lijkt niet langer te werken. Herstart Lantern en probeer het opnieuw.", + "messages.get_help": "Krijg Hulp", + "freeProCredits.title": "Vrienden uitnodigen", + "freeProCredits.shareWithFriends": "Deel je code met vrienden en verdien gratis maanden!", + "freeProCredits.shareWithFriendsDesc": "Wanneer je vriend een tweejarig abonnement aanschaft ontvangen jullie allebei 3 maanden gratis, bij een eenjarig abonnement ontvangen jullie beiden 1 maand gratis.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/pl.json b/locale/translation/pl.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/pl.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/pt.json b/locale/translation/pt.json new file mode 100644 index 000000000..0b5206957 --- /dev/null +++ b/locale/translation/pt.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Estado: %v", + "TRAY_CONNECT": "Conectar", + "TRAY_DISCONNECT": "Desconectar", + "TRAY_SHOW_LANTERN": "Mostre o Lantern", + "TRAY_UPGRADE_TO_PRO": "Atualizar para Pro", + "TRAY_QUIT": "Encerre o Programa Lanterna", + "BACKEND_DATA_TITLE": "Não há mais dados Lantern de alta velocidade ", + "BACKEND_DATA_MESSAGE": "Por favor atualize para Pro para continuar usando o Lantern à toda velocidade!", + "BACKEND_DATA_PERCENT_TITLE": "Atingido %s de seus dados Lantern", + "BACKEND_DATA_PERCENT_MESSAGE": "Você usou %s de seus dados Lantern de alta velocidade para o mês. Atualize agora!", + "BACKEND_CLICK_LABEL": "Abrir", + "BACKEND_CLICK_LABEL_OPEN": "Abrir", + "BACKEND_CLICK_LABEL_HELP": "Ajuda", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern é um aplicativo que fornece acesso rápido, confiável e seguro à internet aberta.", + "about.faq": "Ler as Perguntas Mais Frequentes do Lantern", + "about.open": "Internet Aberta para Todos", + "about.questions": "Dúvidas?", + "about.title": "Sobre", + "account.cancel": "Cancelar conta Pro", + "account.free.cap": "{{mb}} MB restantes de seus dados mensais gratuitos", + "account.free.cap.upgrade": "Atualize para Pro para obter dados de alta velocidade ilimitados", + "account.freelink.validFor": "válido para %s", + "account.freelink.desc": "Para vincular esse dispositivo a sua conta Pro:", + "account.freelink.step1": "1. Abra o item 'Adicionar Dispositivo' no menu de seu dispositivo Pro.", + "account.freelink.step2": "2. Digite o código de vinculação do dispositivo, e envie.", + "account.freelink.reminder": "* Verifique se você está atualizado com a última versão do Lantern em seu dispositivo Pro", + "account.freelink.errorTitle": "Erro de vinculação", + "account.freelink.errorText": "Você tem certeza que digitou o código em seu dispositivo Pro?", + "account.freelink.headerDesc": "Vincular este dispositivo a sua conta Pro", + "account.freelink.title": "Código de vinculação do dispositivo", + "account.pro.charge": "Sua conta será cobrada automaticamente por mais um ano de Lantern Pro ao final do ciclo de faturamento.", + "account.upgrade": "Atualizar para Pro", + "account.pro.email": "Endereço de email:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(Esse Dispositivo)", + "account.pro.logout": "SAIR", + "account.pro.removedevice": "REMOVER", + "account.pro.devices": "Dispositivos autorizados para usar sua conta Pro:", + "account.pro.device.confirm.title": "Desautorizar Dispositivo", + "account.pro.device.confirm": "Você tem certeza que quer remover '{{device}}' de sua conta Lantern Pro?", + "account.pro.device.one.title": "Somente um dispositivo", + "account.pro.device.one": "Desculpe, mas você não pode remover seu último dispositivo autorizado.", + "account.pro.linkingcode": "Código de vinculação do dispositivo:", + "account.pro.renew": "RENOVAR CONTA PRO", + "account.prolink.errorTitle": "Erro de vinculação ", + "account.prolink.errorText": "Você tem certeza que copiou corretamente o código do seu outro dispositivo?", + "account.prolink.successTitle": "Dispositivo Vinculado", + "account.prolink.successText": "Você vinculou com sucesso seu dispositivo! Por favor, aguarde um momento para seu outro dispositivo automaticamente tornar-se Pro.", + "adyen.paymentMethods.title": "Métodos de Pagamento", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Cancela", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Número do cartão", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/AA", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Mês", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "AA", + "adyen.creditCard.expiryDateField.year": "Ano", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Erro", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Tentar novamente", + "adyen.idealIssuer.selectField.title": "Banco", + "adyen.idealIssuer.selectField.placeholder": "Selecione seu banco", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Autorizar dispositivo para Pro", + "authorize.step1.have_pro_device": "Tenho outro dispositivo Lantern Pro", + "authorize.step1.link": "Vincular o dispositivo", + "authorize.step1.or": "ou", + "authorize.step1.recover": "Preciso recuperar minha conta Lantern Pro", + "authorize.step1.start": "Iniciar recuperação", + "authorize.step1.no_mail": "Não lembra de seu endereço de email?", + "authorize.step2b.enter_code": "Digite seu código de recuperação de conta", + "authorize.step2b.code": "Código de recuperação da conta", + "authorize.step2b.instruction": "Um email com um código de recuperação foi enviado para {{email}}. Esse email pode levar várias horas para chegar. Por favor, verifique sua pasta de spam se você não encontrá-lo.", + "authorize.step2b.no_mail": "Não recebeu email", + "authorize.step3.recovery": "Recuperação de conta", + "authorize.step3.no_email": "Oops! Estamos tendo problemas para encontrar esse endereço de email. Por favor, forneça mais informações abaixo para nos ajudar a localizar sua conta.", + "authorize.step3.no_code_received": "Está com problemas para receber o email de recuperação? Digite as informações abaixo e entraremos em contato com você dentro de 48 horas.", + "authorize.step3.your_email": "Seu Email", + "authorize.step3.payment_method": "Método de pagamento", + "authorize.step3.payment_method_hint": "Selecione o método de pagamento usado para obter o Pro", + "authorize.step3.credit_card": "Cartão de crédito", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Recebido Pro por referência de um amigo", + "authorize.step3.payment_account": "Conta de pagamento", + "authorize.step3.payment_account_hint": "Digite suas informações de conta Alipay", + "authorize.step3.referral_code": "Seu código de referência", + "authorize.step3.purchase_date": "Data de compra", + "authorize.step3.note": "Tenha atenção a qualquer outra informação que pode nos ajudar a localizar sua conta.", + "authorize.step4.title": "Recuperação de conta em andamento", + "authorize.step4.text1": "Obrigado! Recebemos seu pedido de recuperação de conta.", + "authorize.step4.text2": "Por favor aguarde 48 horas para recuperar suas informações da conta Pro.", + "authorize.step4.text3": "Nós enviaremos as informações para o endereço de email digitado na tela anterior.", + "authorized.continue": "Continuar Pro", + "authorized.text": "Esse dispositivo agora está autorizado a usar sua conta Lantern Pro!", + "authorized.title": "Dispositivo autorizado", + "button.renew": "Renew", + "button.upgrade": "Atualizar", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Atualizar para Lantern Pro", + "button.copy_your_code": "Copie seu código", + "button.try_again": "Tentar novamente", + "button.continue": "Continue", + "bullet.click_button": "Clique no botão abaixo", + "bullet.paste_code": "Cole o código & baixe o link em uma mensagem", + "bullet.send_to_friends": "Envie para seus amigos", + "cancel": "Cancela", + "confirm": "Confirmar", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Erro desconhecido", + "err.internal_error": "Erro interno", + "err.bad_input": "Entrada incorreta", + "err.not_authorized": "Não autorizado", + "err.user_exists": "Usuário existe", + "err.no_such_user": "Nenhum usuário encontrado", + "err.user_already_verified": "Usuário já verificado", + "err.invalid_user_verification": "Verificação de usuário inválida", + "err.user_unverified": "Usuário não verificado", + "err.operation_temporarily_unavailable": "Operação temporariamente indisponível", + "err.wrong_or_inexistent_plan": "Plano errado ou inexistente", + "err.user_has_active_subscription": "Usuário tem assinatura ativa", + "err.payment_error": "Erro de pagamento", + "err.no_codes_left": "Sem códigos de referência", + "err.wrong_code": "Código de referência incorreto", + "err.redeeming_own_code_not_allowed": "Resgatar códigos de si mesmo não é permitido", + "err.wrong_charge_id": "ID de cobrança incorreto", + "footer.reseller": "Faça dinheiro! Torne-se um revendedor Lantern Pro. Clique aqui", + "footer.reseller.email_subject": "Fale-me sobre o Programa de Revendedor do Lantern", + "footer.reseller.email_body": "Quando você se tornar um Revendedor Latern você terá a oportunidade de fazer até 25% o sobre cada venda de uma assinatura do Lantern Pro. Conte-nos, abaixo, um pouco sobre o motivo pelo qual você quer se tornar um revendedor.", + "feature.faster_speed": "Velocidade mais rápida", + "feature.faster": "Faster data centers", + "feature.unlimited": "Dados ilimitados", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Sem propagandas", + "feature.antiblock": "Resistente à bloqueio", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Obter Lantern Pro", + "input.email": "Email", + "input.your_email": "Seu endereço de email", + "input.confirm_email": "Confirmar endereço de email", + "input.enter_email": "Digite seu email", + "input.use_valid_email": "Escreva um endereço de email válido", + "input.email_not_match": "Campos de email não coincidem", + "issue.your_email": "Seu Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Por favor tente novamente", + "issue.select_issue": "Por favor, selecione um problema", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Selecione um problema no menu suspenso", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Problema no relatório de erros", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Não é possível acessar sites bloqueados", + "issue.type.payment_fail": "Não é possível completar o pagamento", + "issue.type.cannot_login": "Não é possível entrar", + "issue.type.always_spinning": "Carregando spinner, gira sem parar", + "issue.type.slow": "Lento", + "issue.type.cannot_link_device": "Não é possível conectar dispositivos", + "issue.type.crashes": "Falhas do Lantern", + "issue.type.other": "Outros", + "languages.title": "Idiomas", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Sobre", + "nav.account": "Gerenciamento da conta", + "nav.authorize": "Adicionar dispositivo", + "nav.authorized": "Dispositivo autorizado ", + "nav.unauthorized_link": "Autorizar dispositivo para Pro", + "nav.language": "Idioma", + "nav.lantern": "Lantern", + "nav.mobile": "Obter versão para dispositivos móveis ", + "nav.report_issue": "Relatar um problema", + "nav.settings": "Configurações", + "nav.verify": "Verificação de conta", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Início", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Tentar novamente", + "notifications.whatisnew": "What's New?", + "payment.close": "Fechar", + "payment.wait_for_pro": "Obrigado por sua compra do Lantern Pro! Por favor aguarde um momento para seus Lantern automaticamente tornar-se Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Melhor oferta!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 ano", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Selecionar", + "plans.title": "Planos Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Para Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Seus créditos serão aplicados a sua conta no próximo ciclo de faturamento.", + "pro.title": "Convide amigos, receba mais Pro de graça", + "pro.subtitle": "Quando o seu amigo compra o plano de dois anos, cada um recebe 3 meses adicionais de Pro, o plano de um ano dá 1 mês grátis para cada um.", + "pro.share": "Compartilhe seu código com seus amigos para começar a ganhar mais créditos!", + "promotion.title": "Sair do Lantern Pro", + "promotion.title.activation": "Ativação do Lantern Pro", + "promotion.enter_and_confirm_email": "Por favor digite e confirme seu endereço de email", + "promotion.code.hint": "Digite o código de referência do seu amigo (opcional)", + "promotion.code.label": "Código de referência", + "promotion.payment": "Continue ao Pagamento", + "promotion.loading": "Carregando...", + "promotion.howto_1y": "Se um amigo compartilhar seu código de referência com você, digite o código para receber um mês de Lantern Pro gratuitamente após a saída.", + "promotion.howto_2y": "Se um amigo compartilhar seu código de referência com você, digite o código para receber três meses de Lantern Pro gratuitamente após a saída.", + "promotion.pay": "Pagar {{amount}}", + "promotion.select": "Selecionar", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "Esse código de referência já foi adicionado. Finalize agora para receber seus meses extras.", + "promotion.activation.enter_and_confirm_email": "Por favor digite e confirme seu endereço de email para registrar sua conta Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Digite seu código de ativação", + "promotion.activation.howto": "Por favor, digite seu código de ativação de 25 caracteres do Lantern Pro acima. Se você não tem um código, por favor compre o Pro na tela anterior ou procure um revendedor Lantern Pro online.", + "promotion.activation.continue": "Continuar Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Compartilhe seu código ", + "referral.text": "Use meu código %s e receba 3 meses grátis quando você se inscrever!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Docs", + "replica.other": "Outros", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Próximo", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Tamanho", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Fechar", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Cancela", + "replica.delete": "Apagar", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Baixe", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Geral", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Executar Lantern no início do sistema", + "settings.autoReport": "Relate seguramente estatísticas de uso para contribuir com o Lantern", + "settings.proxyAll": "Proxy todo o tráfego", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Gerenciar proxy do sistema", + "settings.title": "Configurações", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Cuidado:", + "settings.caution_text": "Quando você desmarcar \"Gerenciar proxy do sistema\" seu navegador e aplicações não serão capazes de usar o Lantern automaticamente. Se você sabe como configurar manualmente estas configurações, consulte as informações acima.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Conectando...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Quer vincular outro dispositivo para esta conta Pro? Digite seu Código de Vinculação de Dispositivo abaixo", + "verify.code": "Código de vinculação do dispositivo", + "verify.howto_1": "Se você tem uma conta Lantern Pro em outro dispositivo, por favor digite seu endereço de email aqui para receber um código para autorizar o dispositivo", + "verify.howto_1a": "Você atualmente é um usuário Pro autorizado. Por favor, digite seu endereço de email para autorizar sua conta Pro. Isto lhe permitirá vincular múltiplos dispositivos.", + "verify.howto_3": "1. Abra o item 'Autorizar Dispositivo para Pro' no menu do seu dispositivo não autorizado.", + "verify.howto_4": "2. Digite o código de vinculação obtido no passo 1, e envie.", + "verify.reminder": "* Verifique se você está atualizado com a última versão do Lantern em seu dispositivo não autorizado", + "verify.submit": "Enviar", + "verify.title": "Verificação de conta", + "welcomeToPro.continue": "Continuar Pro", + "welcomeToPro.invite": "Convide amigos e cada um receberá 3 meses gratuitos quando eles comprarem o plano de dois anos, o plano de um ano dá a cada um, 1 mês grátis. Comece a convidar!", + "welcomeToPro.thanks": "Obrigado por sua compra do Lantern Pro!", + "welcomeToPro.title": "Bem vindo ao Lantern Pro", + "messages.copied_to_clipboard": "Código copiado. Compartilhe-o com seus amigos!", + "messages.datacap": "Você usou seus dados de alta velocidade grátis. Atualize para Pro para dados ilimitados.", + "messages.fatal_error": "Desculpe, estamos tendo problemas para entrar em contato com os servidores Lantern. Por favor, verifique sua conexão com a Internet e tente novamente.", + "messages.backend_gone": "Desculpe, Lantern parece não estar mais em execução. Por favor reinicie o Lantern e tente novamente.", + "messages.get_help": "Obter Ajuda", + "freeProCredits.title": "Convide amigos", + "freeProCredits.shareWithFriends": "Compartilhe seu código com amigos para ganhar meses grátis!", + "freeProCredits.shareWithFriendsDesc": "Quando seus amigos comprarem o plano de dois anos, cada um receberá 3 meses grátis, o plano de um ano permite a cada um obter 1 mês grátis", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/pt_PT.json b/locale/translation/pt_PT.json new file mode 100644 index 000000000..4e084bba9 --- /dev/null +++ b/locale/translation/pt_PT.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Estado: %v", + "TRAY_CONNECT": "Ligar", + "TRAY_DISCONNECT": "Desligar", + "TRAY_SHOW_LANTERN": "Mostrar Lantern", + "TRAY_UPGRADE_TO_PRO": "Atualizar para Pro", + "TRAY_QUIT": "Sair do Lantern", + "BACKEND_DATA_TITLE": "Sem mais alta velocidade de dados no Lantern", + "BACKEND_DATA_MESSAGE": "Por favor, atualize para a versão Pro para continuar a utilizar o Lantern, a toda a velocidade.", + "BACKEND_DATA_PERCENT_TITLE": "Atingiu %s dos seus dados do Lantern", + "BACKEND_DATA_PERCENT_MESSAGE": "Utilizou %s da alta velocidade de dados do Lantern para o mês. Atualize agora!", + "BACKEND_CLICK_LABEL": "Abrir", + "BACKEND_CLICK_LABEL_OPEN": "Abrir", + "BACKEND_CLICK_LABEL_HELP": "Ajuda", + "BACKEND_CLICK_LABEL_GOT_IT": "Percebi", + "BACKEND_AUTOUPDATED_TITLE": "Atualizar Lantern para a versão %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Foi transferido Lantern %s. Por favor, reinicie o Lantern para o utilizar.", + "BACKEND_MITM_INSTALL_CERT": "Lantern quer instalar um certificado personalizado para desbloquear o seu tráfego", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Por favor, permita que o %v faça alterações no seu sistema", + "BACKEND_ALERT_TITLE": "Alerta critico que precisa da sua atenção", + "about.content": "Lantern é uma aplicação que fornece um acesso rápido, seguro e de confiança para uma Internet livre.", + "about.faq": "Leia as perguntas e respostas do Lantern", + "about.open": "Internet Livre para Toda a Gente", + "about.questions": "Questões?", + "about.title": "Sobre", + "account.cancel": "Cancelar Contra Pro", + "account.free.cap": "{{mb}} MB restantes dos seus dados mensais gratuitos", + "account.free.cap.upgrade": "Atualize para a versão Pro para uma alta velocidade ilimitada de dados", + "account.freelink.validFor": "válido para %s", + "account.freelink.desc": "Para associar este dispositivo à sua conta Pro:", + "account.freelink.step1": "1. Abra o item de menu 'Adicionar Dispositivo' no seu dispositivo Pro.", + "account.freelink.step2": "2. Introduza o código de associação do dispositivo e submeta.", + "account.freelink.reminder": "* Confirme que possui a versão mais recente de Lantern no seu dispositivo Pro", + "account.freelink.errorTitle": "Erro de Associação", + "account.freelink.errorText": "Tem a certeza que introduziu o código no seu dispositivo Pro?", + "account.freelink.headerDesc": "Ligar este dispositivo à sua conta Pro", + "account.freelink.title": "Código de associação do dispositivo", + "account.pro.charge": "A sua conta será debitada automaticamente para outro ano do Lantern Pro no final do seu ciclo de faturação.", + "account.upgrade": "Atualizar para Pro", + "account.pro.email": "Endereço de e-mail:", + "account.pro.expired": "A sua conta Pro expirou. Renove agora para dados mensais ilimitados.", + "account.pro.expiry": "A sua conta Pro expira em %s dias em %s.", + "account.pro.bonusMonths": "Inclui os seus {{bonusMonths}} meses de bónus!", + "account.pro.thisdevice": "(Este Dispositivo)", + "account.pro.logout": "TERMINAR SESSÃO", + "account.pro.removedevice": "REMOVER", + "account.pro.devices": "Dispositivos autorizados para utilizar a sua conta Pro:", + "account.pro.device.confirm.title": "Desautorizar Dispositivo", + "account.pro.device.confirm": "Tem a certeza que deseja remover {{device}} da sua conta do Lantern Pro?", + "account.pro.device.one.title": "Apenas Um Dispositivo", + "account.pro.device.one": "Desculpe, mas não pode remover o seu último dispositivo autorizado.", + "account.pro.linkingcode": "Código de associação do dispositivo:", + "account.pro.renew": "RENOVAR CONTA PRO", + "account.prolink.errorTitle": "Erro de Associação", + "account.prolink.errorText": "Tem a certeza que copiou o código corretamente do seu outro dispositivo?", + "account.prolink.successTitle": "Dispositivo Associado", + "account.prolink.successText": "Conseguiu associar o seu dispositivo! Por favor espere um momento para o seu outro dispositivo se tornar automaticamente pro.", + "adyen.paymentMethods.title": "Métodos de Pagamento", + "adyen.paymentMethods.storedMethods": "Os seus métodos de pagamento", + "adyen.paymentMethods.otherMethods": "Escolha outro método", + "adyen.paymentMethods.moreMethodsButton": "Mais métodos de pagamento", + "adyen.payButton": "Pagar", + "adyen.payButton.formatted": "Pagar %@", + "adyen.cancelButton": "Cancelar", + "adyen.dismissButton": "ACEITAR", + "adyen.storeDetails": "Salvar para o meu próximo pagamento", + "adyen.payment.redirecting": "Será redireccionado", + "adyen.payment.processing": "O seu pagamento está a ser processado", + "adyen.creditCard.title": "Detalhes de cartão", + "adyen.creditCard.holderName": "Nome no cartão", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Número do Cartão", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Número de cartão inválido", + "adyen.creditCard.expiryDateField.title": "Data de expiração", + "adyen.creditCard.expiryDateField.placeholder": "MM/AA", + "adyen.creditCard.expiryDateField.invalid": "Data de expiração inválida", + "adyen.creditCard.expiryDateField.month": "Mês", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "AA", + "adyen.creditCard.expiryDateField.year": "Ano", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Número de prestações", + "adyen.creditCard.storeDetailsButton": "Recordar este cartão para o meu próximo pagamento", + "adyen.creditCard.oneClickVerification.title": "Verificar o seu cartão", + "adyen.creditCard.oneClickVerification.message": "Por favor introduza o código CVC de %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC inválido", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Por favor introduza um CVC válido para continuar", + "adyen.sepaDirectDebit.ibanField.title": "Número de conta (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Número de conta inválido", + "adyen.sepaDirectDebit.nameField.title": "Nome do Portador", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Nome do Portador", + "adyen.sepa.ibanNumber": "Número de conta (IBAN", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Mín. 3 carateres", + "adyen.giropay.noResults": "Nenhuns resultados de pesquisa", + "adyen.error.title": "ErroErro", + "adyen.error.subtitle.redirect": "Redirecionamento falhou", + "adyen.error.subtitle.payment": "Pagamento falhou", + "adyen.error.subtitle.refused": "Pagamento recusado", + "adyen.error.message.unknown": "Ocorreu um erro desconhecido", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Repetir", + "adyen.idealIssuer.selectField.title": "Banco", + "adyen.idealIssuer.selectField.placeholder": "Selecione o seu banco", + "adyen.creditCard.success": "Pagamento Bem Sucedido", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Não é possível a abrir a aplicação", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Nome no cartão", + "adyen.countryCode": "Código do País", + "adyen.telephone.number": "Número de telefone", + "authorize.title": "Autorizar Dispositivo para PRO", + "authorize.step1.have_pro_device": "Eu tenho outro dispositivo com o Lantern Pro", + "authorize.step1.link": "Associar este disp.", + "authorize.step1.or": "ou", + "authorize.step1.recover": "Eu preciso de recuperar a minha conta do Lantern Pro", + "authorize.step1.start": "Iniciar Recuperação", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Código de Recuperação de Conta", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Não recebeu a mensagem", + "authorize.step3.recovery": "Recuperação de Conta", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "O Seu E-mail", + "authorize.step3.payment_method": "Método de Pagamento", + "authorize.step3.payment_method_hint": "Selecione o método de pagamento que utilizou para obter a versão Pro", + "authorize.step3.credit_card": "Cartão de Crédito", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Recebeu a versão Pro por referir um amigo", + "authorize.step3.payment_account": "Conta de Pagamento", + "authorize.step3.payment_account_hint": "Insira a informação da sua conta Alipay", + "authorize.step3.referral_code": "O Seu Código de Referência", + "authorize.step3.purchase_date": "Data de Compra", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continuar para PRO", + "authorized.text": "Este dispositivo não está autorizado para utilizar a sua conta do Lantern Pro!", + "authorized.title": "Dispositivo Autorizado", + "button.renew": "Renovar", + "button.upgrade": "Atualizar", + "button.upgrade_now": "Atualizar Agora", + "button.upgrade_to_lantern_pro": "Atualizar para Lantern Pro", + "button.copy_your_code": "Copie o seu código", + "button.try_again": "Repetir", + "button.continue": "Continuar", + "bullet.click_button": "Clique no botão abaixo", + "bullet.paste_code": "Cole o código e a hiperligação de transferência numa mensagem", + "bullet.send_to_friends": "Envie para os seus amigos", + "cancel": "Cancelar", + "confirm": "Confirmar", + "google_search": "Pesquisa Google", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Erro desconhecido", + "err.internal_error": "Erro interno", + "err.bad_input": "Inserção errada", + "err.not_authorized": "Não autorizado", + "err.user_exists": "O utilizador já existe", + "err.no_such_user": "Não existe tal utilizador", + "err.user_already_verified": "Utlizador já verificado", + "err.invalid_user_verification": "Verificação de utilizador inválida", + "err.user_unverified": "Utilizador não verificado", + "err.operation_temporarily_unavailable": "Operação temporariamente indisponível", + "err.wrong_or_inexistent_plan": "Plano errado ou inexistente", + "err.user_has_active_subscription": "O utilizador tem uma subscrição ativa", + "err.payment_error": "Erro de pagamento", + "err.no_codes_left": "Não tem mais códigos de referência", + "err.wrong_code": "Código de referência errado", + "err.redeeming_own_code_not_allowed": "Não pode redimir os seus próprios códigos", + "err.wrong_charge_id": "Id. de custo errada", + "footer.reseller": "Ganhe Dinheiro! Seja um Revendedor do Lantern Pro. Clique Aqui", + "footer.reseller.email_subject": " Digam-me mais sobre o 'Programa de Revenda' do Lantern!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Velocidade Mais Rápida", + "feature.faster": "Faster data centers", + "feature.unlimited": "Dados ilimitados", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "Sem Anúncios", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Obter Lantern Pro", + "input.email": "E-mail", + "input.your_email": "O Seu Endereço de E-mail", + "input.confirm_email": "Confirmar Endereço de E-mail", + "input.enter_email": "Insira o seu e-mail", + "input.use_valid_email": "Digite um endereço de e-mail válido", + "input.email_not_match": "Os campos de e-mail não coincidem", + "issue.your_email": "O Seu E-mail", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Por favor, tente novamente", + "issue.select_issue": "Por favor, selecione um problema", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Selecione um problema no menu suspenso", + "issue.note": "Descreva o seu problema", + "issue.description": "Issue Description", + "issue.error": "Erro ao reportar o seu problema", + "issue.submit": "Enviar Relatório", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Não é possível aceder aos \"sites\" bloqueados", + "issue.type.payment_fail": "Não é possível concluir o pagamento", + "issue.type.cannot_login": "Não é possível iniciar a sessão", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Mostrar", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lanterna cracha", + "issue.type.other": "Outros", + "languages.title": "Idiomas", + "mobile.link": "Use a hiperligação para transferir o Lantern no seu dispositivo Android:", + "mobile.title": "Obter Versão de Android", + "nav.about": "Sobre", + "nav.account": "Gestão de Conta", + "nav.authorize": "Adicionar Dispositivo", + "nav.authorized": "Dispositivo Autorizado", + "nav.unauthorized_link": "Autorizar Dispositivo para PRO", + "nav.language": "Idioma", + "nav.lantern": "Lantern", + "nav.mobile": "Obter Versão Móvel", + "nav.report_issue": "Comunicar um problema", + "nav.settings": "Definições", + "nav.verify": "Verificação de Conta", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Início", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Repetir", + "notifications.whatisnew": "What's New?", + "payment.close": "Fechar", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Selecione o método de pagamento", + "payment_methods.alipay": "Cartão de Crédito/AliPay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Para comprar Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Tutorial em Farsi", + "payment_methods.shetab.details.purchase_voucher_button": "Continuar para Comprar", + "payment_methods.shetab.details.input_code_button": "Inserir Código de Ativação", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Melhor oferta!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 ano", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Selecionar", + "plans.title": "Planos Pro do Lantern", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Para Android, Mac, Ubuntu e Windows.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Tem um código de ativação? Clique aqui.", + "pro.apply": "Os seus créditos irão ser aplicados à sua conta no próximo ciclo de faturação.", + "pro.title": "Convide amigos, obtenha mais Pro gratuitamente", + "pro.subtitle": "Quando o seu amigo compra o plano de dois anos, os dois obtêm 3 meses adicionais de Pro, o plano de um ano oferece aos dois, 1 mês grátis.", + "pro.share": "Partilhe o seu código com os amigos, para começar a ganhar mais créditos!", + "promotion.title": "Lantern Pro - Finalizar Compra", + "promotion.title.activation": "Lantern Pro - Ativação", + "promotion.enter_and_confirm_email": "Por favor, insira e confirme o seu endereço de e-mail", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Código de Referência", + "promotion.payment": "Continuar para Pagamento", + "promotion.loading": "A carregar...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pagar {{amount}}", + "promotion.select": "Selecionar", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Inserir o seu Código de Ativação", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continuar para PRO", + "promotion.voucher.hint": "Código de Ativação", + "promotion.voucher.howto": "Por favor, insira o código de ativação do Fast World Pay de 12 carateres ou mais", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Código de ativação inválido", + "promotion.voucher.error.invalid_plan": "Código de ativação associado com um plano inválido", + "promotion.voucher.error.already_redeemed": "O código de ativação já foi resgatado", + "referral.code": "Share your referral code", + "referral.text": "Utiliza o meu código %s e obtém 3 meses gratuitos quando te registares!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "seguinte", + "renew.decline": "Recusar Oferta", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renovar mais tarde", + "renew.decline_dismiss": "Renovar agora", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "O desconto do Lantern Pro termina amanhã!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Última chance para um desconto!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Documentos", + "replica.other": "Outros", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Seguinte", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Fechar", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Cancelar", + "replica.delete": "Eliminar", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Transferir", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "Geral", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Executar o Lantern no arranque do sistema", + "settings.autoReport": "Comunique as estatísticas de utilização em segurança para contribuir para o Lantern", + "settings.proxyAll": "Proxy todo o tráfego", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Gerir proxy do sistema", + "settings.title": "Definições", + "settings.http_proxy": "Proxy HTTP(S):", + "settings.socks_proxy": "Proxy SOCKS:", + "settings.caution": "Cuidado:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Localização do Servidor", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "A conetar ...", + "status.no_internet": "Off", + "status.no_internet_connection": "Sem ligação à Internet", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Código de associação do dispositivo", + "verify.howto_1": "Se tiver uma conta Lantern Pro noutro dispositivo, por favor, insira o seu endereço de e-mail aqui para receber um código para autorizar o dispositivo", + "verify.howto_1a": "Atualmente é um utilizador Pro não autorizado. Por favor, insira o seu endereço de e-mail para autorizar a sua conta Pro. Isso permitirá que associe múltiplos dispositivos.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Submeter", + "verify.title": "Verificação de Conta", + "welcomeToPro.continue": "Continuar para PRO", + "welcomeToPro.invite": "Convide amigos e cada um de vocês irá ter 3 meses gratuitos quando eles comprarem o plano de dois anos, o plano de um ano oferece aos dois 1 mês grátis. Comece a convidar!", + "welcomeToPro.thanks": "Obrigado por comprar o Lantern Pro!", + "welcomeToPro.title": "Bem-vindo ao Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Desculpe, parece que o Lantern já não está a funcionar. Por favor, reinicie o Lantern e tente novamente.", + "messages.get_help": "Obter Ajuda", + "freeProCredits.title": "Convide Amigos", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Desconhecido", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Localização do Servidor", + "cards.serverLocation.description-upgrade": "Atualizar para Servidores Mais Rápidos", + "cards.serverLocation.title": "Localização atual:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "Atualizações de HTTPS", + "cards.httpsUpgrades.title": "Atualizações HTTPS: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Anúncios Bloqueados", + "cards.adsBlocked.title": "Anúncios bloqueados: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Utilização de Dados", + "cards.dataUsage.upgrade": "Atualize agora", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Subscrição Pro", + "cards.subscription.renew": "Renovar", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DIAS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/ro.json b/locale/translation/ro.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/ro.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/ru.json b/locale/translation/ru.json new file mode 100644 index 000000000..3043dc77e --- /dev/null +++ b/locale/translation/ru.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Статус: %v", + "TRAY_CONNECT": "Подключиться", + "TRAY_DISCONNECT": "Отключиться", + "TRAY_SHOW": "Показать %s", + "TRAY_UPGRADE_TO_PRO": "Перейти на Pro", + "TRAY_QUIT": "Выйти из %s", + "BACKEND_DATA_TITLE": "Лимит скоростного трафика %s исчерпан", + "BACKEND_DATA_MESSAGE": "Перейдите на версию Pro, чтобы продолжать пользоваться %s на максимальной скорости.", + "BACKEND_DATA_PERCENT_TITLE": "Использовано %s из лимита по трафику %s", + "BACKEND_DATA_PERCENT_MESSAGE": "Вы использовали %s из %s для скоростного трафика. Перейдите на расширенную версию!", + "BACKEND_CLICK_LABEL": "Открыть", + "BACKEND_CLICK_LABEL_OPEN": "Открыть", + "BACKEND_CLICK_LABEL_HELP": "Справка", + "BACKEND_CLICK_LABEL_GOT_IT": "Понятно", + "BACKEND_AUTOUPDATED_TITLE": "Обновить %s до версии %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Загружено: %s %s. Перезапустите %s, чтобы начать работу.", + "BACKEND_MITM_INSTALL_CERT": "%s хочет установить специальный сертификат для повышения производительности", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Разрешите %v внести изменения в систему", + "BACKEND_ALERT_TITLE": "Важное критическое предупреждение", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s нуждается в вашем разрешении на установку диагностических инструментов. Это поможет нам повысить удобство вашей работы с %s.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Не удается сохранить настройки", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Не удается сохранить настройки приложения. %s не может гарантировать корректное проксирование трафика.", + "about.content": "Lantern - это приложение, которое предоставляет быстрый, надежный и безопасный доступ к открытому Интернету.", + "app.error": "Произошла ошибка.", + "about.faq": "Ознакомьтесь с ответами на часто задаваемые вопросы о Lantern", + "about.open": "Открытый Интернет для всех", + "about.questions": "Вопросы?", + "about.title": "О программе", + "account.add.password": "Добавить пароль аккаунта", + "account.agree.terms": "Я понимаю, что при потере пароля я потеряю доступ к своему аккаунту.\nLantern не сможет помочь\nвосстановить ваш пароль.", + "account.agree.terms.error": "Сначала нужно принять условия", + "account.cancel": "Отменить аккаунт Pro", + "account.created": "Аккаунт создан!", + "account.create.pro.account.header": "Создать аккаунт Pro", + "account.create.pro.account.text": "Lantern меняет порядок работы с аккаунтами. В дальнейшем пользователям Pro придется создавать имя пользователя и пароль. Эти учетные данные будут использоваться для входа на других устройствах и предоставления доступа к новым функциям.", + "account.have.a.account": "У вас есть аккаунт?", + "account.link.username.pro": "Привязать имя пользователя к аккаунту Pro", + "account.recovery": "Восстановление аккаунта", + "account.recovery.link.device": "Привязать устройство", + "account.recovery.device.code": "Код привязки стройства", + "account.recovery.device.enter.code": "Введите или вставьте код привязки устройства", + "account.recovery.device.instructions.header": "Чтобы привязать это устройство к аккаунту Pro:", + "account.recovery.device.instructions.step.one": "1. Выберите параметр «Привязать устройство» в пункте «Управление учетной записью» на устройстве Pro для рабочего стола или в меню на мобильном устройстве Pro.", + "account.recovery.device.instructions.step.two": "2. Введите код привязки устройства и отправьте его.", + "account.recovery.device.instructions.part.three": "* Убедитесь, что на обоих устройствах установлена последняя версия Lantern.", + "account.recovery.method": "Выберите способ восстановления аккаунта", + "account.recovery.send.email": "Отправить Email", + "account.recovery.submit": "Отправить", + "account.recovery.success": "Привязка завершена!", + "account.pro_management": "Управление аккаунтом Pro", + "account.free_management": "Управление аккаунтом", + "account.free.cap": "Осталось {{mb}} МБ бесплатного трафика. Лимит будет сброшен {{reset}}", + "account.free.cap.upgrade": "Перейдите на версию Pro, чтобы получить безлимитный трафик с высокой скоростью", + "account.freelink.validFor": "действует до %s", + "account.freelink.desc": "Чтобы разрешить этому устройству использовать вашу учетную запись Pro:", + "account.freelink.step1": "1. Выберите параметр «Привязать устройство» в меню на устройстве Pro.", + "account.freelink.step2": "2. Введите код привязки устройства и отправьте его.", + "account.freelink.reminder": "* Убедитесь, что на обоих устройствах установлена последняя версия Lantern.", + "account.freelink.errorTitle": "Ошибка привязки", + "account.freelink.errorText": "Вы ввели код на устройстве Pro?", + "account.freelink.headerDesc": "Привязка устройства к аккаунту Pro", + "account.freelink.title": "Код привязки стройства", + "account.pro.charge": "В конце платежного цикла с вашего аккаунта будет автоматически взиматься плата за следующий год подписки на Lantern Pro.", + "account.upgrade_pro": "Перейти на Pro", + "account.upgrade": "Обновить", + "account.upgrade_platinum": "Обновить до Platinum", + "account.create": "Создать аккаунт", + "account.email": "Электронная почта", + "account.confirm.password": "Подтвердите пароль", + "account.password": "Пароль", + "account.pro.email": "Электронная почта:", + "account.pro.expiration": "Срок действия учетной записи Pro", + "account.platinum.expiration": "Истечение срока действия аккаунта Platinum", + "account.pro.expired": "Срок действия вашего аккаунта Pro истек. Продлите подписку сейчас, чтобы получить безлимитный месячный трафик.", + "account.pro.expiry": "Срок действия вашего аккаунта Pro истекает через %s дн. - %s.", + "account.pro.bonusMonths": "Включает ваши {{bonusMonths}} бонусные месяцы!", + "account.pro.thisdevice": "(Это устройство)", + "account.pro.logout": "Выйти", + "account.pro.removedevice": "УДАЛИТЬ", + "account.pro.devices": "Устройства Lantern Pro (не более 3)", + "account.pro.device.confirm.title": "Отменить авторизацию устройства", + "account.pro.device.confirm": "Удалить устройство «{{device}}» из вашего аккаунта Lantern Pro?", + "account.pro.device.one.title": "Только одно устройство", + "account.pro.device.one": "Удалить последнее авторизованное устройство нельзя.", + "account.pro.linkingcode": "Код привязки устройства:", + "account.pro.renew": "Обновить аккаунт Pro", + "account.platinum.renew": "Обновить аккаунт Platinum", + "account.pro.renew_CN": "Возобновить ", + "account.prolink.errorTitle": "Ошибка привязки", + "account.prolink.errorText": "Вы правильно скопировали код с другого устройства?", + "account.prolink.successTitle": "Устройство привязано", + "account.prolink.successText": "Вы успешно привязали устройство. Через мгновение другое устройство автоматически получит статус Pro.", + "account.signin": "Вход", + "account.signout": "Выход", + "account.submit": "Отправить", + "account.username": "Имя пользователя", + "account.switch.to.register": "Переключиться, чтобы создать аккаунт", + "account.switch.to.signin": "Переключиться, чтобы войти", + "account.invalid.username": "Недопустимое имя пользователя", + "account.invalid.email": "Недопустимый адрес электронной почты", + "account.password.mismatch": "Пароли на совпадают", + "account.password.short": "Пароль слишком короткий", + "account.password.lowercase": "Пароль должен содержать не менее одной строчной буквы", + "account.password.uppercase": "Пароль должен содержать не менее одной прописной буквы", + "account.password.number": "Пароль должен содержать не менее одной цифры", + "account.password.compromised": "Пароль находится в списке раскрытых паролей", + "modal.register.free.header": "Зарегистрируйтесь или войдите в систему, чтобы пользоваться кошельком Yinbi", + "modal.register.pro.header": "Добавьте пароль аккаунта, чтобы пользоваться кошельком Yinbi", + "modal.register.pro.signin.header": "Войдите в систему, чтобы пользоваться кошельком Yinbi", + "modal.register.free.text": "Чтобы пользоваться кошельком Yinbi, вам требуется аккаунт Lantern. Зарегистрируйтесь или\nвойдите в систему, чтобы продолжить.", + "modal.register.pro.text": "Чтобы пользоваться кошельком Yinbi, укажите пароль для своего аккаунта Lantern.", + "modal.register.pro.signin.text": "Чтобы использовать кошелек Yinbi, войдите в свой аккаунт Lantern", + "adyen.paymentMethods.title": "Способы оплаты", + "adyen.paymentMethods.storedMethods": "Ваши способы оплаты", + "adyen.paymentMethods.otherMethods": "Выберите другой способ", + "adyen.paymentMethods.moreMethodsButton": "Дополнительные способы оплаты", + "adyen.payButton": "Оплатить", + "adyen.payButton.formatted": "Оплатить %@", + "adyen.cancelButton": "Отменить", + "adyen.dismissButton": "Ок", + "adyen.storeDetails": "Сохранить для следующего платежа", + "adyen.payment.redirecting": "Вы будете перенаправлены", + "adyen.payment.processing": "Ваш платеж обрабатывается", + "adyen.creditCard.title": "Реквизиты платежной карты", + "adyen.creditCard.holderName": "Имя владельца карты", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Номер карты", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Не верный номер карты", + "adyen.creditCard.expiryDateField.title": "Cрок действия", + "adyen.creditCard.expiryDateField.placeholder": "ММ/ГГ", + "adyen.creditCard.expiryDateField.invalid": "Недействительный срок действия", + "adyen.creditCard.expiryDateField.month": "Месяц", + "adyen.creditCard.expiryDateField.month.placeholder": "ММ", + "adyen.creditCard.expiryDateField.year.placeholder": "ГГ", + "adyen.creditCard.expiryDateField.year": "Год", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Количество платежей", + "adyen.creditCard.storeDetailsButton": "Запомнить эту карту для следующего платежа", + "adyen.creditCard.oneClickVerification.title": "Подтвердите карту", + "adyen.creditCard.oneClickVerification.message": "Введите код CVC для %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Неверный CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Введите действительный CVC, чтобы продолжить.", + "adyen.sepaDirectDebit.ibanField.title": "Номер счета (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Неверный номер счета", + "adyen.sepaDirectDebit.nameField.title": "Имя владельца", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Я соглашаюсь с тем, что указанная ниже сумма будет списана с моего банковского счета.", + "adyen.sepa.ownerName": "Имя владельца", + "adyen.sepa.ibanNumber": "Номер счета (IBAN)", + "adyen.giropay.searchField.placeholder": "Название банка / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Минимум 3 символа", + "adyen.giropay.noResults": "Поиск не дал результатов", + "adyen.error.title": "Ошибка", + "adyen.error.subtitle.redirect": "Ошибка перенаправления", + "adyen.error.subtitle.payment": "Сбой оплаты", + "adyen.error.subtitle.refused": "Платеж отклонен", + "adyen.error.message.unknown": "Произошла неизвестная ошибка", + "adyen.error.message.cannotConnectToInternet": "Не удалось подключиться к Интернету: проверьте настройки.", + "adyen.error.message.cannotConnectToHost": "Не удалось подключиться к нашему платежному серверу.", + "adyen.error.retryButton": "Повторите попытку", + "adyen.idealIssuer.selectField.title": "Банк", + "adyen.idealIssuer.selectField.placeholder": "Выберите банк", + "adyen.creditCard.success": "Платеж выполнен", + "adyen.oneClick.confirmationAlert.title": "Подтвердить платеж %@", + "adyen.redirect.cannotOpenApp.title": "Не удается открыть приложение", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Не удалось открыть приложение, потому что оно не установлено на этом устройстве.", + "adyen.holderName": "Имя владельца карты", + "adyen.countryCode": "Код страны", + "adyen.telephone.number": "Номер телефона", + "android.download": "Lantern Андроид", + "android.download.title": "Загрузить Lantern для Android", + "authorize.title": "Авторизовать устр. для Pro", + "authorize.step1.have_pro_device": "У меня есть еще одно устройство Lantern Pro", + "authorize.step1.link": "Привязка устройств", + "authorize.step1.email_linking": "Привязка адреса электронной почты", + "authorize.device_linking_explanation": "Используйте этот способ, если вы выполнили вход на другом устройстве, которое у вас с собой", + "authorize.device_email_explanation": "Используйте этот способ, чтобы получить код привязки устройства на свою электронную почту", + "authorize.link_device": "Привязать устройство", + "authorize.step1.choose": "Выберите способ привязки своего аккаунта", + "authorize.step1.or": "или", + "authorize.step1.recover": "Мне нужно восстановить мой аккаунт Lantern Pro", + "authorize.step1.start": "Начать восстановление", + "authorize.step1.no_mail": "Забыли свой адрес электронной почты?", + "authorize.step1.description": "Введите свой адрес электронной почты. Если с ней связан аккаунт, мы вышлем вам письмо с кодом привязки устройства", + "authorize.step2b.enter_code": "Введите свой код восстановления аккаунта", + "authorize.step2b.code": "Код восстановления аккаунта", + "authorize.step2b.instruction": "Если этот аккаунт существует, на адрес электронной почты {{email}} отправлено письмо с кодом восстановления. Оно будет доставлено в течение нескольких часов. Если вы не нашли письмо, проверьте папку со спамом.", + "authorize.step2b.no_mail": "Письмо не пришло", + "authorize.step3.recovery": "Восстановление аккаунта", + "authorize.step3.no_email": "Не удалось найти этот адрес электронной почты. Представьте дополнительные сведения ниже. Это поможет нам найти ваш аккаунт.", + "authorize.step3.no_code_received": "Не приходит письмо с кодом восстановления? Укажите данные ниже, и мы свяжемся с вами в течение 48 часов.", + "authorize.step3.your_email": "Ваш Email", + "authorize.step3.payment_method": "Способ оплаты", + "authorize.step3.payment_method_hint": "Выберите способ оплаты, который вы использовали, чтобы получить версию Pro", + "authorize.step3.credit_card": "Кредитная карта", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Версия Pro получена благодаря предоставлению другу реферального кода ", + "authorize.step3.payment_account": "Аккаунт для оплаты", + "authorize.step3.payment_account_hint": "Введите данные аккаунта Alipay", + "authorize.step3.referral_code": "Ваш реферальный код ", + "authorize.step3.purchase_date": "Дата покупки", + "authorize.step3.note": "Обратите внимание на любую другую информацию, которая может помочь нам найти ваш аккаунт.", + "authorize.step4.title": "Идет восстановление аккаунта", + "authorize.step4.text1": "Спасибо! Мы получили ваш запрос на восстановление аккаунта.", + "authorize.step4.text2": "На получение данных о вашем аккаунте Pro может потребоваться 48 часов.", + "authorize.step4.text3": "Мы отправим сведение адрес электронной почты, указанный на предыдущем экране.", + "authorized.continue": "Продолжить с версией Pro", + "authorized.continue.lantern": "Использовать Lantern", + "authorized.text": "Теперь на этом устройстве можно использовать ваш аккаунт Lantern Pro.", + "authorized.title": "Устройство авторизовано", + "button.account": "Аккаунт", + "button.renew": "Возобновить", + "button.upgrade": "Обновить", + "button.upgrade_now": "Обновить сейчас", + "button.upgrade_to_lantern_pro": "Обновление до Lantern Pro", + "button.copy_your_code": "Скопируйте код", + "button.try_again": "Повторите попытку", + "button.continue": "Продолжить", + "button.continue_to": "Продолжить с {{planType}}", + "bullet.click_button": "Нажмите кнопку ниже", + "bullet.paste_code": "Вставьте код и ссылку для загрузки в сообщении", + "bullet.send_to_friends": "Отправьте своим друзьям", + "cancel": "Отменить", + "confirm": "Подтвердить", + "norecoveryyinbi": "* Не восстанавливает кошелек Yinbi", + "email.recovery.check.email": "Проверьте, не пришло ли вам электронное письмо с кодом восстановления", + "email.recovery.code.label": "Введите или вставьте код восстановления", + "email.recovery.no.code": "Не получили код?", + "email.recovery.text": "Введите свой адрес электронной почты, и мы вышлем вам код для сброса пароля.\nЕсли у вас есть кошелек Yinbi, он НЕ будет восстановлен. Для этого нужно ввести фразу для восстановления кошелька Yinbi.", + "email.recovery.desc": "Используйте этот способ, чтобы получить код восстановления на свой адрес электронной почты", + "device.recovery.desc": "Используйте этот способ, если вы выполнили вход на другом устройстве, которое у вас с собой", + "google_search": "Поиск в Google", + "giveaway.upgrade": "Перейдите на расширенную подписку, чтобы воспользоваться сегодняшним бесплатным предложением", + "giveaway.title_released_today": "Сегодня выпускается {{formattedTokens}} YNB", + "giveaway.what_is_it": "В чем заключается предложение от Yinbi?", + "giveaway.description1": "Фонд Yinbi Foundation раздает 888 миллиардов единиц криптовалюты YNB только через Lantern и только покупателям Lantern Pro.", + "giveaway.description2": "Средства в YNB будут выдаваться в конце каждого дня с учетом объема выпущенной в этот день криптовалюты Yinbi, количества людей, которые обновили/продлили подписку, а также срока действия вашей подписки в годах или количества приобретенных учетных записей. Средства в YNB будут зачисляться прямо на ваш кошелек Yinbi в Lantern.", + "giveaway.learn_more": "Подробнее", + "link_device": "У вас уже есть аккаунт Pro? Привяжите устройство", + "email.recovery": "Восстановление с помощью электронной почты", + "email_taken": "Адрес электронной почты уже зарегистрирован", + "username_taken": "Имя пользователя уже зарегистрировано", + "err.unknown_error": "Неизвестная ошибка", + "err.internal_error": "Внутренняя ошибка", + "err.bad_input": "Ошибка входных данных", + "err.not_authorized": "Не авторизовано", + "err.user_exists": "Пользователь существует", + "err.no_such_user": "Пользователь отсутствует", + "err.user_already_verified": "Пользователь уже проверен", + "err.invalid_user_verification": "Ошибка проверки пользователя", + "err.user_unverified": "Пользователь не проверен", + "err.operation_temporarily_unavailable": "Операция временно недоступна", + "err.wrong_or_inexistent_plan": "Неправильный или несуществующий план", + "err.user_has_active_subscription": "У пользователя есть активная подписка", + "err.payment_error": "Ошибка оплаты", + "err.no_codes_left": "Не осталось реферальных кодов", + "err.wrong_code": "Неправильный реферальный код", + "err.redeeming_own_code_not_allowed": "Использовать собственные коды запрещено", + "err.wrong_charge_id": "Неправильный идентификатор", + "err.wrong_link_code": "Неправильный код ссылки", + "err.invalid_credentials": "Предоставлены недействительные учетные данные пользователя", + "footer.reseller": "Зарабатывайте! Станьте реселлером Lantern Pro. Щелкните здесь", + "footer.reseller.email_subject": "Узнать о программе Lantern Reseller", + "footer.reseller.email_body": "Когда вы станете реселлером Lantern, у вас будет возможность заработать до 25% при каждой продаже подписки на Lantern Pro. Расскажите немного о том, почему вы хотите стать реселлером ниже.", + "feature.faster_speed": "Высокая скорость", + "feature.faster": "Более быстрые центры обработки данных", + "feature.unlimited": "Безлимитный трафик", + "feature.nologs": "Журналы отсутствуют", + "feature.devices": "Подключение до трех устройств", + "feature.noads": "Без рекламы", + "feature.yinbi.tooltip": "Фонд Yinbi раздает 888 миллиардов криптовалюты YNB покупателям Lantern Pro исключительно через Lantern. YNB будет распределяться в конце каждого дня исходя из количества Yinbi, выпущенного в этот день, количества людей, перешедших на новую версию, а также количества лет или приобретенных вами аккаунтов. YNB будет зачисляться непосредственно на ваш кошелек Yinbi в Lantern!", + "feature.antiblock": "Защита от блокировок", + "feature.data_center": "Более подходящие центры обработки данных", + "feature.free_yinbi": "Бесплатная криптовалюта Yinbi!", + "free.title": "Lantern Pro", + "free.desc": "Скорость. Производительность. Безлимитный трафик. Безопасность.", + "free.link_account": "У вас уже есть аккаунт Pro? Привяжите свой аккаунт.", + "home.get_lantern_pro": "Получить Lantern Pro", + "home.get_lantern_platinum": "Обновить план", + "home.welcome_popup_subheader": "Добро пожаловать в новую версию Lantern!", + "home.welcome_popup_content_1": "Мы постоянно обновляем Lantern и добавляем новые функции.", + "home.welcome_popup_content_2": "В новом интерфейсе есть строка для поиска общих файлов в сети Lantern. Вы также можете публиковать собственные файлы. Эта функция находится на этапе бета-тестирования. Попробуйте ее в деле и поделитесь своим мнением с нами. Мы продолжим развивать продукт на основании ваших отзывов.", + "home.welcome_popup_button": "Попробовать", + "input.email": "Электронная почта", + "input.your_email": "Ваш адрес электронной почты", + "input.confirm_email": "Подтвердите адрес электронной почты", + "input.enter_email": "Введите свой адрес электронной почты", + "input.use_valid_email": "Укажите действительный адрес электронной почты", + "input.email_not_match": "Поля электронной почты не совпадают", + "input.existing_email": "Существующий адрес электронной почты", + "issue.your_email": "Ваш Email", + "issue.attach_image_failure": "Не удается прикрепить изображение", + "issue.try_again": "Пожалуйста, попытайтесь еще раз", + "issue.select_issue": "Выберите проблему", + "issue.selected_issue": "Выбор проблемы", + "issue.select_issue_hint": "Выберите проблему в раскрывающемся списке", + "issue.note": "Опишите свою проблему", + "issue.description": "Описание проблемы", + "issue.error": "Ошибка при сообщении о проблеме", + "issue.submit": "Отправить отчет", + "issue.report_screenshot": "Перетащите изображение или нажмите кнопку, чтобы загрузить снимок экрана", + "issue.reported": "Спасибо, что сообщили о своей проблеме. Из-за большого потока обращений мы не можем отвечать на большинство из них, однако будьте уверены, мы прилагаем все усилия, чтобы совершенствовать Lantern на основании ваших отзывов.", + "issue.report_sent": "Отчет отправлен", + "issue.type.no_access": "Не удается получить доступ к заблокированным сайтам", + "issue.type.payment_fail": "Не удается выполнить платеж", + "issue.type.cannot_login": "Не удается войти в систему", + "issue.type.always_spinning": "Индикатор загрузки вращается без остановки", + "issue.type.slow": "Медленный", + "issue.type.cannot_link_device": "Не удается привязать устройства", + "issue.type.crashes": "Сбои Lantern", + "issue.type.other": "Другое", + "languages.title": "Языки", + "lantern.email": "Адрес электронной почты Lantern", + "mobile.link": "Воспользуйтесь ссылкой, чтобы загрузить Lantern на устройство Android:", + "mobile.title": "Получить версию Android", + "nav.about": "О программе", + "nav.account": "Управление аккаунтом", + "nav.authorize": "Добавить устройство", + "nav.authorized": "Устройство авторизовано", + "nav.unauthorized_link": "Авторизовать устр. для Pro", + "nav.language": "Язык", + "nav.lantern": "Lantern", + "nav.mobile": "Получить мобильную версию", + "nav.report_issue": "Сообщить о проблеме", + "nav.settings": "Настройки", + "nav.support": "Поддержка", + "nav.verify": "Проверка аккаунта", + "nav.yinbi": "Получение Yinbi", + "nav.home": "Главная", + "nav.discover": "Обзор", + "nav.wallet": "Кошелек", + "nav.yinbi_wallet": "Кошелек Yinbi", + "notification.retry": "Повторить", + "notifications": "Уведомления", + "notifications.whatisnew": "Что нового?", + "password.change": "Изменить пароль", + "password.changed": "Пароль изменен", + "continue.to.pro": "Продолжить с версией Pro", + "username": "Имя пользователя", + "password.new": "Новый пароль", + "password.requirements": "
Пароль должен:
  • содержать не менее 8 символов;
  • содержать 1 строчную букву;
  • содержать 1 прописную букву;
  • содержать не менее 1 цифры;
  • не быть в списке раскрытых паролей.
", + "password.reset": "Сброс пароля", + "paxful.buy": "Купить", + "paxful.payment": "Способ оплаты", + "paxful.bitcoin": "Биткойн (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Онлайн-кошельки", + "paxful.bank": "Банковские переводы", + "paxful.gamer_card": "Игровые карточки", + "paxful.gift_card": "Подарочные карты", + "paxful.cash": "Платеж наличными", + "paxful.digital_currency": "Криптовалюты", + "paxful.button": "Показать выгодные предложения", + "payment.close": "Закрыть", + "payment.redirectErrorTitle": "Ошибка при подключении к платежному серверу", + "payment.redirectErrorText": "Мы сейчас работаем над решением этой проблемы. Повторите попытку позже.", + "payment.wait_for_pro": "Благодарим за покупку Lantern Pro! Через мгновение ваша подписка на Lantern автоматически переключится на Pro.", + "payment.moreOptions": "Больше опций", + "payment.fewerOptions": "Меньше опций", + "payment_methods.select_name": "Выбрать способ оплаты", + "payment_methods.alipay": "Кредитная карточка/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Купить Lantern Pro", + "payment_methods.shetab.details.body": "Нажав «Продолжить платеж», вы перейдете на внешний сайт, где совершите оплату и получите код активации.", + "payment_methods.shetab.details.tutorial_header": "Инструкции на фарси", + "payment_methods.shetab.details.purchase_voucher_button": "Продолжить платеж", + "payment_methods.shetab.details.input_code_button": "Введите код активации", + "plan.step1": "Шаг 1", + "plan.apply": "Применить", + "plan.step2": "Шаг 2", + "plan.most_popular": "Самое популярное!", + "plan.step3": "Шаг 3", + "plan.choose_plan": "Выбрать план", + "plan.enter_email": "Введите электронную почту", + "plan.choose_method": "Выберете способ оплаты ", + "plan.bestValue": "Выгодное предложение!", + "plan.per_month": "в месяц", + "plan.yinbi_2x": "+ в 2 раза больше Yinbi!", + "plan.oneYear": "1 год", + "plan.add_referral": "Добавить реферальный код", + "plan.years": "{{years}}-летний план", + "plan.desc": "Оплата {{price}} взимается единоразово", + "plan.bonus_months": "+ {{bonusMonths}} мес.", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "в год", + "plan.select": "Выбрать", + "plan.two_year": "На 2 года", + "plan.one_year": "На 1 год", + "plan.savings": "Сэкономьте {{formattedDiscount}} %", + "plans.title": "Планы Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Для Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": " У вас есть код активации Lantern Pro? Нажмите здесь.", + "plans.with_voucher_code": "У вас есть код активации? Нажмите здесь.", + "pro.apply": "Заработанные кредиты будут применены к вашему аккаунту в следующем платежном цикле.", + "pro.title": "Пригласите друзей и получите дополнительное время бесплатного использования версии Pro", + "pro.subtitle": "За каждого друга, который купит двухлетний план, вы получите 3 дополнительных месяца бесплатного использования версии Pro, а за однолетний план - 1 месяц.", + "pro.share": "Поделитесь своим кодом с друзьями, чтобы зарабатывать больше кредитов!", + "promotion.title": "Приобретение Lantern Pro", + "promotion.title.activation": "Активация Lantern Pro", + "promotion.enter_and_confirm_email": "Введите и подтвердите свой адрес электронной почты", + "promotion.code.hint": "Введите реферальный код вашего друга (необязательно)", + "promotion.code.label": "Реферальный код", + "promotion.payment": "Продолжить платеж", + "promotion.payment.btc": "Оплатить через ₿", + "promotion.loading": "Загрузка...", + "promotion.howto_1y": "После проверки заказа введите реферальный код, который дал ваш друг, чтобы получить один месяц бесплатного использования Lantern Pro.", + "promotion.howto_2y": "После проверки заказа введите реферальный код, который дал ваш друг, чтобы получить три месяца бесплатного использования Lantern Pro.", + "promotion.pay": "Оплата {{amount}}", + "promotion.select": "Выбрать", + "promotion.promotion_applied_1y": "+1 бонусный месяц", + "promotion.promotion_applied_2y": "+3 бонусных месяца", + "promotion.too_many_referrals": "Этот реферальный код уже добавлен. Оформите заказ прямо сейчас, чтобы получить дополнительные месяцы.", + "promotion.activation.enter_and_confirm_email": "Введите и подтвердите свой адрес электронной почты, чтобы зарегистрировать свою учетную запись Lantern Pro.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Код активации", + "promotion.activation.instructions": "Чтобы зарегистрировать аккаунт, введите свой адрес электронной почты и 25-значный код активации, полученный от реселлера.", + "promotion.activation.howto": "Введите 25-значный код активации Lantern Pro выше. Если у вас нет кода, приобретите версию Pro на предыдущем экране или найдите реселлера Lantern Pro в Интернете.", + "promotion.activation.continue": "Зарегистрироваться в Pro", + "promotion.voucher.hint": "Код активации", + "promotion.voucher.howto": "Введите код активации Fast World Pay из 12 символов в поле выше", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Ошибка введения кода активации.", + "promotion.voucher.error.invalid_code": "Неверный код активации", + "promotion.voucher.error.invalid_plan": "Код активации связан с недействительным планом", + "promotion.voucher.error.already_redeemed": "Код активации уже использован", + "referral.code": "Реферальный код", + "referral.text": "Используйте мой код %s и получите 3 месяца бесплатного использования при регистрации!", + "referral.description_free": "Поделитесь кодом с друзьями — если они купят версию Pro, вы получите месяц подписки на Lantern Pro бесплатно!", + "referral.description_pro": "Поделитесь кодом с друзьями — если они купят версию Pro, вы получите дополнительный месяц подписки на Lantern Pro бесплатно!", + "register": "Зарегистрироваться", + "renew.subtitle_early": "Продлить на 3 месяца бесплатно!", + "renew.subtitle_last_day": "Продлить на 3 месяца бесплатно!", + "renew.subtitle_expired": "Продлите на 45 дней бесплатно!", + "renew.details_early": "Ваше членство в Lantern Pro скоро закончится. Продлите подписку сейчас и получите до трех месяцев бесплатно!", + "renew.details_last_day": "Ваше членство в Lantern Pro заканчивается сегодня! Продлите подписку сейчас и получите до трех месяцев бесплатно!", + "renew.details_expired": "Срок вашего членства в Lantern Pro истек. Продлите подписку сейчас и получите до сорока пяти дней бесплатно!", + "renew.asterisk_early": "* Это ограниченное по времени предложение действительно только для досрочного продления.", + "renew.asterisk_last_day": "* Это ваш последний шанс воспользоваться данным специальным предложением!", + "renew.asterisk_expired": "* Это предложение ограничено по времени!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 МЕС. БЕСПЛАТНО", + "renew.plan_renewal_bonus_months": "$%d%s + %d МЕС. БЕСПЛАТНО", + "renew.plan_renewal_bonus_days": "$%d%s + %d ДН. БЕСПЛАТНО", + "renew.next": "далее", + "renew.decline": "Отклонить предложение", + "renew.decline_question": "Отклонить предложение?", + "renew.decline_yes": "Продлить позже", + "renew.decline_dismiss": "Продлить сейчас", + "renew.notification_title_30_days": "Продлите Pro сейчас и сэкономьте кучу денег!", + "renew.notification_title_30_days_platinum": "Обновите Platinum прямо сейчас и получите огромную скидку!", + "renew.notification_text_30_days": "Срок действия вашего {{planName}} аккаунта истекает через {{remainingDays}} дней. Обновите сейчас и получите до 3 месяцев бесплатно.", + "renew.notification_title_2_days": "Скидка по {{planName}} заканчивается завтра!", + "renew.notification_text_2_days": "Срок действия вашего аккаунта {{planName}} истекает завтра. Не упустите возможность получить огромную скидку.", + "renew.notification_title_last_day": "Последний шанс получить скидку!", + "renew.notification_text_last_day": "Срок действия вашего аккаунта {{planName}} истек. Обновите сегодня и получите до 3 месяцев бесплатно.", + "replica.upload": "Отправить", + "replica.favorite": "Избранное", + "replica.added_to_favorites": "Добавлено в избранное", + "replica.filedrop_error": "Ошибка при отправке этого файла", + "replica.filedrop_error.file-too-large": "Максимальный допустимый размер файла: {{fileSize}}", + "replica.filedrop_error.file-too-small": "Слишком малый размер файла", + "replica.filedrop_error.too-many-files": "Слишком много файлов", + "replica.filedrop_error.file-invalid-type": "Файлы этого типа пока не поддерживаются", + "replica.filedrop_remove_file": "Удалить из очереди", + "replica.post": "Отправить файл", + "replica.relevance": "Актуальность", + "replica.upload_date": "Дата отправки", + "replica.gallery_view": "Представление галереи", + "replica.list_view": "Представление списка", + "replica.copy_lantern_link": "Копировать ссылку Lantern", + "replica.documents": "Документы", + "replica.audio": "Аудио", + "replica.application": "Приложения", + "replica.image": "Изображения", + "replica.video": "Видео", + "replica.web": "Интернет", + "replica.news": "Новости", + "replica.upload_alert.dont_show": "Больше не показывать", + "replica.upload_alert.cancel": "Отменить отправку", + "replica.upload_alert.resume": "Возобновить отправку", + "replica.upload_alert.info": "Важная информация!", + "replica.upload_alert.desc1": "Файлы, отправленные в Lantern, хранятся распределенно и децентрализованно. Если другой пользователь получит к ним доступ, никто, включая Lantern, не сможет удалить их из сети (даже при удалении из вашего списка «Мои файлы»).", + "replica.upload_alert.desc2": "При отправке конфиденциальных материалов убедитесь, что в файлах и их названиях не содержатся персональные данные.", + "replica.add_details": "Добавить данные", + "replica.cannot_edit": "Имена файлов нельзя редактировать после загрузки.", + "replica.next": "Далее", + "replica.previous": "Предыдущие", + "replica.selectAll": "Выбрать все", + "replica.search_replica": "Поиск", + "replica.search_results_info": "На этой вкладке отображаются только результаты Lantern.", + "replica.search_results_info_message": "В результатах Lantern отображается контент, отправляемый пользователями в сеть Lantern.", + "replica.no_files_found": "Результатов нет", + "replica.or_content": "Другие пользователи смогут находить ваши файлы!", + "replica.try_again": "Используйте другое ключевое слово или", + "replica.upload_success": "Отправка завершена!", + "replica.cannot_preview": "Предварительный просмотр этого типа файлов невозможен", + "replica.no_description": "Без описания", + "replica.size": "Размер", + "replica.uploaded": "Отправлено", + "replica.invalid_link": "Недействительная ссылка", + "replica.close": "Закрыть", + "replica.files": "Файлы", + "replica.upload_history": "История отправок", + "replica.my_favorites": "Избранное", + "replica.no_uploads": "Отправленных файлов нет", + "replica.no_favorites": "Пока в избранном ничего нет", + "replica.mime_type": "Тип файла: {{mime}}", + "replica.image_loading_error": "Ошибка при загрузке изображения", + "replica.play": "Вкл.", + "replica.pause": "Пауза", + "replica.scrub": "Очистить", + "replica.skip_forward": "Перейти вперед", + "replica.skip_backwards": "Перейти назад", + "replica.trending_videos": "Популярные видео", + "replica.file_uploaded": "Загружено: {{days}} дн. назад", + "replica.file_size": "Размер", + "replica.duration": "Длительность", + "replica.filename": "Имя файла", + "replica.filename_required": "Присвойте файлу имя", + "replica.description_optional": "Добавить описание", + "replica.expand": "Раскрыть информацию", + "replica.filetype": "Тип файла", + "replica.sortby": "Сортировать по", + "replica.link": "Ссылка на копию", + "replica.collapse": "Свернуть", + "replica.publish": "Опубликовать", + "replica.cancel": "Отмена", + "replica.progress_current_upload": "Отправка", + "replica.progress_files": "файлы", + "replica.progress_of": "из", + "replica.progress_upload_complete": "Готово", + "replica.progress_upload_failure": "Сбой отправки. Повторите попытку.", + "replica.upload_in_progress": "Выполняется отправка", + "replica.upload_pending": "Ожидание отправки", + "replica.upload_error": "Ошибка отправки", + "replica.upload_cancel": "Отменить отправку", + "replica.upload_confirm": "Действительно отменить отправку?", + "replica.progress_view": "Просмотр", + "replica.delete": "Удалить", + "replica.remove": "Удалить", + "replica.delete_file": "Удалить файл", + "replica.remove_favorite": "Удалить из избранного", + "replica.failed_to_delete": "Не удалось удалить", + "replica.failed_to_remove": "Не удалось удалить", + "replica.link_lookup_failure": "Не удалось найти ссылку", + "replica.delete_file_confirmation_1": "Действительно удалить?", + "replica.delete_file_confirmation_2": "из списка отправленных файлов", + "replica.remove_favorite_confirmation_1": "Действительно удалить", + "replica.remove_favorite_confirmation_2": "из избранного?", + "replica.share_file": "Поделиться файлом", + "replica.download_and_view": "Скачать/просмотреть", + "replica.download": "Скачать", + "replica.copy_link": "Копировать ссылку на копию", + "replica.find_file": "Поиск файла", + "replica.file_drop_prompt": "Перетащите файл, чтобы отправить его.", + "replica.empty_uploads_text1": "Нажмите", + "replica.empty_uploads_text2": "здесь", + "replica.empty_uploads_text3": "чтобы разместить свою первую публикацию.", + "replica.error_header": "Произошла ошибка", + "replica.error": "При обработке вашего запроса возникла ошибка. Повторите попытку.", + "replica.serp_empty": "В Google не нашлось результатов по этому запросу.", + "replica.disclaimer": "Lantern делает поисковые запросы анонимными и защищает их от третьих лиц.", + "settings.general": "Основное", + "settings.feedback": "Отзывы", + "settings.autoLaunch": "Запускать Lantern при старте системы", + "settings.autoReport": "Безопасно передавать данные по использованию для развития Lantern", + "settings.lantern_ads": "Показывать рекламу в Lantern", + "settings.lantern_ads_tooltip": "Отображение рекламы на некоторых сайтах помогает Lantern предоставлять свои услуги. При этом мы не собираем данные о пользователе и не передаем их на наши серверы. Если вы отключите этот параметр, то не будете получать рекламу из сети Lantern. Однако это не гарантирует полного отсутствия рекламы.", + "settings.proxyAll": "Проксировать весь трафик", + "settings.proxyAllHelpTitle": "ЧТО ЗНАЧИТ «ВЕСЬ ТРАФИК ЧЕРЕЗ ПРОКСИ»?", + "settings.proxyAllHelp1": "Если включено, весь трафик будет проходить через Lantern (наиболее безопасный вариант).", + "settings.proxyAllHelp2": "Если отключено, через Lantern будет проходить только заблокированный трафик (самый быстрый вариант, наиболее распространенный).", + "settings.show_advanced": "Показать дополнительные настройки", + "settings.hide_advanced": "Скрыть дополнительные настройки", + "settings.systemProxy": "Управление системными прокси", + "settings.title": "Настройки", + "settings.http_proxy": "Прокси HTTP(S):", + "settings.socks_proxy": "Прокси SOCKS:", + "settings.caution": "Внимание!", + "settings.caution_text": "Если снять флажок «Управление системными прокси», ваш браузер и приложения не смогут автоматически использовать Lantern. Если вы знаете, как вручную настроить эти параметры, то обратитесь к сведениям выше.", + "settings.select_language": "Выберите язык", + "settings.diagnostics": "Приложить диагностические данные", + "settings.diagnostics_tooltip": "Если вы приложите диагностические данные о вашем подключении, нам будет проще выявить и решить вашу проблему.", + "status.lantern": "Lantern — это", + "status.click_reconnect": "Нажмите здесь, чтобы восстановить соединение", + "status.server_location": "Местоположение сервера", + "status.tooltip1": "Lantern использует интеллектуальный выбор серверов, чтобы подключать вас к оптимальным центрам обработки данных.", + "status.tooltip2": "Перейдите на Lantern Pro, чтобы увеличить скорость работы за счет оптимального выбора серверов в наших выделенных центрах обработки данных.", + "status.protected_connection": "Ваше соединение защищено", + "status.please_wait": "Это может занять пару минут…", + "status.connecting": "Подключение...", + "status.no_internet": "Выкл.", + "status.no_internet_connection": "Нет подключения к Интернету", + "status.connected": "Вкл.", + "status.disconnected": "Выкл.", + "status.throttled": "Скорость урезана (ограничение трафика)", + "status.no_system_proxy": "{{status}}, не управляет системным прокси", + "status.fail_to_set_system_proxy": "Не удалось установить Lantern в качестве системного прокси", + "status.fail_to_open_browser": "Не удалось открыть окно браузера с пользовательским интерфейсом Lantern", + "support.forum": "Форум пользователей Lantern", + "support.faq": "ЧаВо", + "terms_of_service.acknowledgment": "Нажимая кнопку «{{buttonText}}», вы принимаете наши Условия использования", + "terms_of_service.replica": "Осуществляя поиск, загрузку или использование наших продуктов любым способом, вы принимаете наши Условия использования, Политику конфиденциальности и Политику соответствия Закону об авторском праве в цифровую эпоху", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Википедия", + "verify.header": "Введите или вставьте код привязки устройства", + "verify.code": "Код привязки стройства", + "verify.howto_1": "Если у вас есть аккаунт Lantern Pro на другом устройстве, введите здесь свой адрес электронной почты, чтобы получить код для авторизации устройства", + "verify.howto_1a": "Вы не являетесь авторизованным пользователем Pro. Введите свой адрес электронной почты, чтобы авторизовать свой аккаунт Pro. Это позволит привязать несколько устройств.", + "verify.howto_2": "Чтобы привязать устройство к вашему аккаунту Pro:", + "verify.howto_3": "1. Выберите пункт «Разрешить устройству использовать Pro» в меню другого устройства.", + "verify.howto_4": "2. Введите код привязки, полученный на шаге 1, и отправьте его.", + "verify.reminder": "* Убедитесь, что на обоих устройствах установлена последняя версия Lantern.", + "verify.enter_pin": "Введите или вставьте код привязки устройства", + "verify.submit": "Отправить", + "verify.title": "Проверка аккаунта", + "welcomeToPro.continue": "Продолжить с версией Pro", + "welcomeToPro.invite": "Пригласите друзей. Вы получите 3 месяца бесплатного использования за каждого, кто купит двухлетний план, и 1 месяц за каждого, кто купит годичный план..", + "welcomeToPro.thanks": "Вы получили неограниченный доступ благодаря самым быстрым центрам обработки данных. Вы можете подключить до трех устройств к вашему аккаунту.", + "welcomeToPro.title": "Добро пожаловать в Lantern Pro", + "welomeToPro.title_exclamation": "Добро пожаловать в Lantern Pro!", + "purchase.failed": "Покупка не состоялась. Повторите попытку позже.", + "purchase.success": "Успешная покупка", + "purchase.success_title": "Добро пожаловать в Lantern {{planType}}!\n ", + "purchase.success_content_pro": "Вы получили неограниченный доступ благодаря самым быстрым центрам обработки данных. Вы можете подключить до трех устройств к вашему аккаунту.", + "purchase.success_content_platinum": "Вы получили неограниченный доступ благодаря самым быстрым центрам обработки данных и выделенным линиям. Вы можете подключить до трех устройств к вашему аккаунту.", + "welcomeToPro.description": "Вы получили неограниченный доступ к заблокированным сайтам и сервисам", + "messages.copied_to_clipboard": "Код скопирован. Поделитесь им с вашими друзьями!", + "messages.datacap": "Вы исчерпали лимит бесплатного скоростного трафика. Перейдите на версию Pro, чтобы пользоваться скоростным трафиком без ограничений.", + "messages.fatal_error": "Не удалось связаться с серверами Lantern. Проверьте подключение к Интернету и повторите попытку.", + "messages.backend_gone": "Кажется, Lantern не работает. Перезагрузите программу и повторите попытку.", + "messages.get_help": "Справка", + "freeProCredits.title": "Пригласи друзей", + "freeProCredits.shareWithFriends": "Поделитесь своим кодом с друзьями, чтобы получить несколько месяцев бесплатного использования.", + "freeProCredits.shareWithFriendsDesc": "За каждого друга, который купит двухлетний план, вы получите 3 месяца бесплатного использования, а годичный план дает 1 месяц.", + "cards.serverLocation.unknown": "Неизвестно", + "cards.serverLocation.description": "Оптимальное местоположение сервера", + "cards.serverLocation.description-free": "Местоположение сервера", + "cards.serverLocation.description-upgrade": "Перейдите на расширенную версию для доступа к более быстрым серверам ", + "cards.serverLocation.title": "Текущее местоположение:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern использует интеллектуальный выбор серверов, чтобы автоматически находить самое быстрое соединение из наших центров обработки данных в Токио, Сингапуре, Гонконге, Сан-Франциско, Нью-Йорке, Амстердаме, Бангалоре и других городах.", + "cards.serverLocation.text-free": "Lantern использует интеллектуальный выбор серверов, чтобы подключать вас к оптимальным центрам обработки данных.", + "cards.serverLocation.upgrade-link": "Перейдите на Lantern Pro, чтобы увеличить скорость работы за счет оптимального выбора серверов в наших выделенных центрах обработки данных.", + "cards.httpsUpgrades.description": "Обновление HTTPS", + "cards.httpsUpgrades.title": "Обновление HTTPS: %d", + "cards.httpsUpgrades.text": "Lantern автоматически обновляет незащищенные HTTP-соединения с зашифрованными соединениями HTTPS, когда это возможно, чтобы ваша информация была конфиденциальной во время серфинга в Интернете.", + "cards.adsBlocked.description": "Блокировка рекламы", + "cards.adsBlocked.title": "Заблокировано рекламных объявлений: %d", + "cards.adsBlocked.text": "Lantern блокирует навязчивую рекламу, чтобы ускорить время загрузки веб-страницы, сохранить пропускную способность и дать вам более плавный просмотр.", + "cards.dataUsage.description": "Использование данных", + "cards.dataUsage.upgrade": "Перейдите сейчас", + "cards.dataUsage.mb-used": "Вы использовали %d/%dМБ от своего скоростного трафика в месяц.", + "cards.dataUsage.upgrade-link": "Обновите сейчас для неограниченного высокоскоростного сервиса!", + "cards.subscription.description": "Подписка Pro", + "cards.subscription.renew": "Возобновить", + "cards.subscription.months": "У вас осталось %d мес. подписки на Lantern Pro.", + "cards.subscription.days": "У вас осталось %d дн. подписки на Lantern Pro.", + "cards.subscription.unit.months": "мес.", + "cards.subscription.unit.days": "ДН.", + "cards.subscription.renew-link": "Продлите свою подписку.", + "auth.email": "Электронная почта", + "auth.username": "Имя пользователя", + "auth.username.or.email": "Имя пользователя или адрес электронной почты", + "auth.signin": "Вход", + "current.password": "Текущий пароль", + "new.password": "Новый пароль", + "auth.change.password": "Изменить пароль", + "confirm.new.password": "Подтвердите новый пароль", + "auth.password": "Пароль", + "auth.have.recovery.phrase": "У вас есть фраза для восстановления?", + "auth.forgot.password": "Забыли или не создавали пароль?", + "auth.create.account": "Создать аккаунт", + "auth.missing.username": "Отсутствует имя пользователя", + "auth.missing.current.password": "Отсутствует текущий пароль", + "auth.missing.new.password": "Отсутствует новый пароль", + "auth.missing.confirm.password": "Отсутствует подтверждение пароля", + "invalid_credentials": "Недействительные учетные данные", + "yinbi.wallet": "Кошелек Yinbi", + "create.wallet": "Создать кошелек", + "new.to.yinbi": "Раньше не пользовались Yinbi?", + "setup.wallet": "Да, давайте создадим новый кошелек!", + "web.wallet": "Нет, у меня есть кошелек на сайте Yin.bi", + "yinbi.next": "Далее", + "yinbi.amount": "Сумма", + "yinbi.missing.address": "Адрес назначения не указан", + "yinbi.missing.amount": "Сумма не указана", + "yinbi.missing.email": "Электронная почта не указана", + "yinbi.missing.username": "Имя пользователя не указано", + "yinbi.missing.password": "Пароль не указан", + "yinbi.invalid.address": "{{destination}} не является действительным адресом Stellar", + "yinbi.send": "Отправить", + "yinbi.to": "Кому:", + "yinbi.try_again": "Повторить попытку?", + "yinbi.success.transaction": "Транзакция завершена!", + "yinbi.failure.transaction": "Сбой транзакции", + "yinbi.confirm.transaction": "Подтверждение транзакции", + "yinbi.sent.details": "Вы послали {{amount}} YNB в {{destination}}", + "yinbi.sent.failure.details": "Причины сбоя транзакции:", + "yinbi.recipient": "Получатель", + "yinbi.available.send": "Вы можете отправить до {{balance}} YNB", + "yinbi.wallet.header": "Кошелек", + "yinbi.send.header": "Отправить Yinbi", + "yinbi.recovery.phrase": "Фраза для восстановления кошелька Yinbi", + "yinbi.recover.account": "Введите или вставьте фразу для восстановления кошелька Yinbi, чтобы восстановить кошелек Yinbi и аккаунт Lantern", + "yinbi.recovery.desc": "Используйте этот способ, чтобы вместе с учетной записью Lantern войти также в кошелек Yinbi", + "yinbi.redeem.codes": "Использовать пакет кодов Yinbi", + "yinbi.obtain.codes": "Пакеты кодов для получения Yinbi доступны по адресу reseller.lantern.io", + "yinbi.receive.header": "Получить Yinbi", + "yinbi.this.is.your.wallet": "Это адрес вашего кошелька Yinbi, на который другие пользователи могут отправлять YNB.", + "yinbi.your.address": "Ваш адрес", + "yinbi.no.activity.header": "Действия отсутствуют", + "yinbi.upgrade.pro.button": "Перейдите на версию Pro и получите в подарок криптовалюту Yinbi", + "yinbi.renew.pro.button": "Продлите подписку Pro и получите в подарок криптовалюту Yinbi", + "yinbi.wallet.activity_header": "Действия", + "yinbi.wallet.send": "Отправить", + "yinbi.wallet.receive": "Получить", + "yinbi.wallet.balance": "Баланс", + "yinbi.wallet.getlantern.pro": "Получите Lantern Pro и криптовалюту Yinbi в подарок", + "yinbi.redemption.codes": "Коды для получения Yinbi", + "redeem_codes.title": "Использовать коды Yinbi", + "redeem_codes.redeem_button_text": "Использовать", + "redeem_codes.cancel_button_text": "Отменить ", + "redeem_codes.success": "Успешно", + "redeem_codes.errors.missing_codes": "Действительные коды отсутствуют", + "redeem_codes.errors.invalid_codes": "Произошла ошибка. Проверьте выделенные коды. У зачеркнутых кодов истек срок действия и их нельзя использовать.", + "yinbi.new.account.text": "Здесь отображаются ваши транзакции, связанные с отправкой и получением Yinbi.", + "yinbi.createAccount": "Создать аккаунт", + "yinbi.confirm.account.text": "Чтобы убедиться, что вы написали фразу правильно, введите следующие слова из нее", + "create_account.invalid_words.error": "Введенные слова не совпадали с фразой для восстановления", + "yinbi.recovery_text": "Это ваша фраза для восстановления кошелька Yinbi. Это ЕДИНСТВЕННЫЙ способ восстановить кошелек Yinbi\nв случае утери пароля. Добавьте фразу в менеджер паролей\nили запишите ее на бумаге.", + "yinbi.recovery_confirm_text": "Это ваша фраза для восстановления кошелька Yinbi. Это ЕДИНСТВЕННЫЙ способ восстановить кошелек Yinbi в случае утери пароля. Добавьте фразу в менеджер паролей или запишите ее на бумаге.", + "yinbi.import.wallet": "Импорт кошелька", + "yinbi.setup.wallet": "Настроить кошелек", + "yinbi.importWallet": "Импорт кошелька Yin.bi", + "yinbi.import.wallet.continue": "Перейти к кошельку", + "yinbi.import.wallet.success": "Импорт кошелька завершен!", + "yinbi.wallet.text": "Чтобы пользоваться кошельком Yinbi, вы можете создать аккаунт, войти в систему или\nимпортировать свой кошелек с сайта Yin.bi, если зарегистрировались там\nранее.", + "yinbi.wallet.pro.text": "Чтобы пользоваться кошельком Yinbi, вы можете создать аккаунт и импортировать свой кошелек с сайта Yin.bi, если зарегистрировались там ранее.", + "yinbi.recovery_subheader": "Фраза для восстановления кошелька Yinbi", + "yinbi.import_wallet.subheader": "Импорт кошелька Yinbi", + "yinbi.import_wallet.text": "Войдите в систему, используя учетные данные Yin.bi, чтобы перенести кошелек в Lantern", + "yinbi.import_wallet.success": "Импорт кошелька завершен. Укажите свой адрес электронной почты, чтобы завершить регистрацию учетной записи.", + "yinbi.import_wallet.success_subheader": "Импорт завершен!", + "yinbi.import_wallet.button": "Импорт кошелька Yin.bi", + "yinbi.import_wallet.success_button": "Завершить регистрацию", + "yinbi.recovery_passphrase.label_text": "Фраза для восстановления", + "yinbi.recovery_passphrase.copy_button_text": "Копировать", + "terms_of_service.notice": "Уведомление", + "terms_of_service.i_agree": "Принимаю", + "platinum": "Platinum", + "platinum.one_year": "Цены на 1 год", + "platinum.two_years": "Цены на 2 года", + "platinum.save": "Экономия до {{savings}}%!\n ", + "platinum.unlimited": "Безлимитный трафик", + "platinum.logs": "Нет логов", + "platinum.devices": "Подключение до трех устройств", + "platinum.everything_in_pro": "Все, что включено в Pro", + "platinum.faster_data": "Более быстрые центры обработки данных", + "platinum.dedicated": "Выделенная линия", + "platinum.reliability": "Повышенная надежность", + "platinum.platinum_one_year": "Lantern Platinum 1 год", + "platinum.platinum_two_years": "Lantern Platinum 2 года", + "platinum.pro_one_year": "Lantern Pro 1 год", + "platinum.pro_two_years": "Lantern Pro 2 года", + "platinum.total": "Всего ", + "platinum.free": "Бесплатно", + "platinum.credit.days": "+ {{ days }} дней", + "platinum.credit.months": "{{ months }} месяц(ев)", + "platinum.upgrade": "Обновить до Platinum", + "platinum.upgrade_details": "Выделенная линия + более быстрые центры обработки данных!", + "platinum.unused_time_disclaimer": "В измененной подписке пользователей Pro, перешедших на Platinum, указано добавленное время, см. выше.", + "p2p.opt_in_description": "Делитесь своим подключением, чтобы другие могли пользоваться Интернетом без цензуры.", + "p2p.active_sharing_description": "Вы поделились доступом в Интернет", + "p2p.dialog.title": "Поделитесь доступом в Интернет", + "p2p.dialog.text.1": "Поделитесь своим подключением, чтобы другие люди получили доступ к Интернету без ограничений. При этом вы станете участником сети волонтеров, объединенных одной целью — сделать Интернет более открытым.", + "p2p.dialog.text.2": "Если вы поделитесь подключением, то ваши идентификационные данные не будут раскрыты, а безопасность не нарушится. Вы сможете закрыть доступ в любой момент.", + "p2p.dialog.yes_button": "ДА, ПОДЕЛИТЬСЯ", + "p2p.dialog.no_button": "ОТМЕНА", + "p2p.banner.introducing": "НОВАЯ ФУНКЦИЯ", + "top_sites.top_sites": "Популярные сайты" +} \ No newline at end of file diff --git a/locale/translation/sk.json b/locale/translation/sk.json new file mode 100644 index 000000000..d65662f1b --- /dev/null +++ b/locale/translation/sk.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Zobraziť Lantern", + "TRAY_QUIT": "Zavrieť Lantern" +} \ No newline at end of file diff --git a/locale/translation/sl_SI.json b/locale/translation/sl_SI.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/sl_SI.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/sq.json b/locale/translation/sq.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/sq.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/sv.json b/locale/translation/sv.json new file mode 100644 index 000000000..59fe4824a --- /dev/null +++ b/locale/translation/sv.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Visa Lantern", + "TRAY_QUIT": "Avsluta Lantern" +} \ No newline at end of file diff --git a/locale/translation/ta.json b/locale/translation/ta.json new file mode 100644 index 000000000..ca11474fd --- /dev/null +++ b/locale/translation/ta.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW_LANTERN": "Lantern இனை காட்டு", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Quit Lantern", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "உதவி", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Questions?", + "about.title": "பற்றி", + "account.cancel": "Cancel Pro Account", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Upgrade to Pro", + "account.pro.email": "Email Address:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "நிராகரி", + "adyen.dismissButton": "சரி", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Card Number", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "பிழை", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Link this device", + "authorize.step1.or": "அல்லது", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Device Authorized", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade to Lantern Pro", + "button.copy_your_code": "Copy your code", + "button.try_again": "Try again", + "button.continue": "தொடர்க", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "நிராகரி", + "confirm": "Confirm", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Unknown error", + "err.internal_error": "Internal error", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "User exists", + "err.no_such_user": "No such user", + "err.user_already_verified": "User already verified", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Faster Speed", + "feature.faster": "Faster data centers", + "feature.unlimited": "Unlimited data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Please try again", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Languages", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "பற்றி", + "nav.account": "Account Management", + "nav.authorize": "Add Device", + "nav.authorized": "Device Authorized", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "மொழி", + "nav.lantern": "Lantern", + "nav.mobile": "Get Mobile Version", + "nav.report_issue": "Report an Issue", + "nav.settings": "அமைப்புக்கள்", + "nav.verify": "Account Verification", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "மீளமுயற்சி", + "notifications.whatisnew": "What's New?", + "payment.close": "மூடு", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Select", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Select", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continue to Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Docs", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "மூடு", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "நிராகரி", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "தரவிறக்கு", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "Proxy all traffic", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "அமைப்புக்கள்", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "Connecting...", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Submit", + "verify.title": "Account Verification", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Thanks for your purchase of Lantern Pro!", + "welcomeToPro.title": "Welcome To Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Invite Friends", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/te.json b/locale/translation/te.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/te.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/th.json b/locale/translation/th.json new file mode 100644 index 000000000..06d6b2111 --- /dev/null +++ b/locale/translation/th.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "สถานะ: %v", + "TRAY_CONNECT": "เชื่อมต่อ", + "TRAY_DISCONNECT": "ตัดการเชื่อมต่อ", + "TRAY_SHOW": "แสดง %s", + "TRAY_UPGRADE_TO_PRO": "อัปเกรดเป็น Pro", + "TRAY_QUIT": "ออกจาก %s", + "BACKEND_DATA_TITLE": "ไม่มีข้อมูลความเร็วสูงสำหรับ %s เหลืออยู่", + "BACKEND_DATA_MESSAGE": "โปรดอัปเกรดเป็น Pro เพื่อใช้ %s ที่ความเร็วสูงสุดต่อไป!", + "BACKEND_DATA_PERCENT_TITLE": "ถึง %s ของข้อมูล %s แล้ว", + "BACKEND_DATA_PERCENT_MESSAGE": "คุณได้ใช้ข้อมูลความเร็วสูงของ %s สำหรับเดือนนี้ไปแล้ว %s อัปเกรดตอนนี้!", + "BACKEND_CLICK_LABEL": "เปิด", + "BACKEND_CLICK_LABEL_OPEN": "เปิด", + "BACKEND_CLICK_LABEL_HELP": "Help", + "BACKEND_CLICK_LABEL_GOT_IT": "เข้าใจแล้ว", + "BACKEND_AUTOUPDATED_TITLE": "อัปเดต %s เป็นเวอร์ชัน %s", + "BACKEND_AUTOUPDATED_MESSAGE": "ดาวน์โหลด %s %s แล้ว โปรดรีสตาร์ท %s เพื่อใช้งาน", + "BACKEND_MITM_INSTALL_CERT": "%s ต้องการติดตั้งใบรับรองที่กำหนดเองเพื่อเพิ่มประสิทธิภาพ", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "โปรดอนุญาตให้ทำการเปลี่ยนแปลงกับระบบของคุณ", + "BACKEND_ALERT_TITLE": "การแจ้งเตือนที่สำคัญต้องได้รับการพิจารณาจากคุณ", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s ต้องได้รับการอนุญาตจากคุณเพื่อติดตั้งเครื่องมือวินิจฉัย ที่จะช่วยให้เราพัฒนาประสบการณ์ %s ของคุณ", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "ไม่สามารถบันทึกการกำหนดค่าได้", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "ไม่สามารถบันทึกการกำหนดค่าแอปพลิเคชันได้ %s ไม่สามารถการันตีได้ว่าการเข้าชมนั้นจะมีการรับส่งข้อมูลอย่างถูกต้อง", + "about.content": "Lantern เป็นแอปพลิเคชันเพื่อการเข้าถึงอินเทอร์เน็ตเปิดได้อย่างรวดเร็ว เชื่อถือได้ และปลอดภัย", + "app.error": "มีบางอย่างผิดพลาด!", + "about.faq": "อ่านคำถามที่พบบ่อยของ Lantern", + "about.open": "อินเทอร์เน็ตแบบเปิดสำหรับทุกคน", + "about.questions": "มีคำถามหรือไม่", + "about.title": "เกี่ยวกับ", + "account.add.password": "เพิ่มรหัสผ่านสำหรับบัญชี", + "account.agree.terms": "ฉันเข้าใจว่าการลืมรหัสผ่านหมายถึงการเสีย\nการเข้าถึงบัญชี Lantern ไม่สามารถช่วยเหลือให้คุณกู้\nรหัสผ่านของคุณได้", + "account.agree.terms.error": "ต้องยอมรับเงื่อนไขก่อน", + "account.cancel": "ยกเลิกบัญชี Pro", + "account.created": "สร้างบัญชีแล้ว!", + "account.create.pro.account.header": "สร้างบัญชี Pro", + "account.create.pro.account.text": "Lantern กำลังปรับเปลี่ยนวิธีการจัดการบัญชีผู้ใช้ จากนี้ไปผู้ใช้ Pro จะต้องสร้างชื่อผู้ใช้และรหัสผ่าน ข้อมูลนี้จะถูกใช้เพื่อลงชื่อเข้าใช้กับอุปกรณ์อื่น และมอบการเข้าถึงฟีเจอร์ใหม่ๆ", + "account.have.a.account": "มีบัญชีหรือไม่?", + "account.link.username.pro": "เชื่อมต่อชื่อผู้ใช้กับบัญชี Pro", + "account.recovery": "การกู้คืนบัญชี", + "account.recovery.link.device": "เชื่อมโยงอุปกรณ์", + "account.recovery.device.code": "รหัสเชื่อมโยงอุปกรณ์", + "account.recovery.device.enter.code": "ป้อนหรือวางพินการเชื่อมโยงอุปกรณ์", + "account.recovery.device.instructions.header": "เพื่อเชื่อมโยงอุปกรณ์นี้กับบัญชี Pro ของคุณ:", + "account.recovery.device.instructions.step.one": "1. เลือกตัวเลือก 'เชื่อมโยงอุปกรณ์' จากรายการในหน้าจอการจัดการบัญชีบนอุปกรณ์ Desktop Pro หรือจากเมนูบนอุปกรณ์ Mobile Pro ของคุณ", + "account.recovery.device.instructions.step.two": "2. ป้อนรหัสเชื่อมโยงอุปกรณ์ แล้วส่ง", + "account.recovery.device.instructions.part.three": "*ตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองใช้ Lantern เวอร์ชันล่าสุด", + "account.recovery.method": "โปรดเลือกวิธีกู้คืนบัญชีของคุณ", + "account.recovery.send.email": "ส่งอีเมล", + "account.recovery.submit": "ส่ง", + "account.recovery.success": "เชื่อมโยงสำเร็จ!", + "account.pro_management": "การจัดการบัญชี Pro", + "account.free_management": "การจัดการบัญชี", + "account.free.cap": "เหลือข้อมูลรายเดือนฟรีของคุณอยู่อีก {{mb}} MB", + "account.free.cap.upgrade": "อัปเกรดเป็น Pro เพื่อใช้ข้อมูลความเร็วสูงแบบไม่จำกัด", + "account.freelink.validFor": "ใช้ได้สำหรับ %s", + "account.freelink.desc": "เพื่ออนุญาตให้อุปกรณ์นี้ใช้บัญชี Pro ของคุณ:", + "account.freelink.step1": "1. เลือกตัวเลือก 'เชื่อมโยงอุปกรณ์' จากเมนูบนอุปกรณ์ Pro ของคุณ", + "account.freelink.step2": "2. ป้อนรหัสเชื่อมโยงอุปกรณ์ แล้วส่ง", + "account.freelink.reminder": "*ตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองใช้ Lantern เวอร์ชันล่าสุด", + "account.freelink.errorTitle": "เกิดข้อผิดพลาดในการเชื่อมโยง", + "account.freelink.errorText": "คุณแน่ใจหรือไม่ว่าได้ป้อนรหัสบนอุปกรณ์ Pro ของคุณ", + "account.freelink.headerDesc": "เชื่อมโยงอุปกรณ์นี้กับบัญชี Pro ของคุณ", + "account.freelink.title": "รหัสเชื่อมโยงอุปกรณ์", + "account.pro.charge": "บัญชีของคุณจะถูกเรียกเก็บเงินอีกหนึ่งปีสำหรับ Lantern Pro เมื่อสิ้นสุดรอบการเรียกเก็บเงินของคุณ", + "account.upgrade_pro": "อัปเกรดเป็น Pro", + "account.upgrade": "อัปเกรด", + "account.upgrade_platinum": "อัปเกรดเป็น Platinum", + "account.create": "สร้างบัญชี", + "account.email": "อีเมล", + "account.confirm.password": "ยืนยันรหัสผ่าน", + "account.password": "รหัสผ่าน", + "account.pro.email": "อีเมล:", + "account.pro.expiration": "การหมดอายุของบัญชี Pro", + "account.platinum.expiration": "การหมดอายุบัญชี Platinum", + "account.pro.expired": "บัญชี Pro ของคุณหมดอายุแล้ว ต่ออายุข้อมูลรายเดือนไม่ จำกัด", + "account.pro.expiry": "บัญชี Pro ของคุณจะหมดอายุใน %s วัน ในวันที่ %s", + "account.pro.bonusMonths": "รวมถึงโบนัส {{bonusMonths}} เดือนของคุณแล้ว!", + "account.pro.thisdevice": "(อุปกรณ์นี้)", + "account.pro.logout": "ออกจากระบบ", + "account.pro.removedevice": "เอาออก", + "account.pro.devices": "อุปกรณ์ Lantern Pro (สูงสุด 3 เครื่อง)", + "account.pro.device.confirm.title": "เลิกอนุญาตอุปกรณ์", + "account.pro.device.confirm": "คุณแน่ใจหรือไม่ว่าต้องการเอา '{{device}}' ออกจากบัญชี Lantern Pro ของคุณ", + "account.pro.device.one.title": "หนึ่งอุปกรณ์เท่านั้น", + "account.pro.device.one": "ขออภัย คุณไม่สามารถลบอุปกรณ์ที่ได้รับอนุญาตล่าสุดได้", + "account.pro.linkingcode": "รหัสเชื่อมโยงอุปกรณ์:", + "account.pro.renew": "ต่ออายุบัญชี Pro", + "account.platinum.renew": "ต่ออายุบัญชี Platinum", + "account.pro.renew_CN": "ต่ออายุ", + "account.prolink.errorTitle": "เกิดข้อผิดพลาดในการเชื่อมโยง", + "account.prolink.errorText": "คุณแน่ใจหรือไม่ว่าได้คัดลอกรหัสมาอย่างถูกต้องจากอุปกรณ์อื่นของคุณ", + "account.prolink.successTitle": "อุปกรณ์ที่เชื่อมโยง", + "account.prolink.successText": "คุณเชื่อมโยงอุปกรณ์เรียบร้อยแล้ว! โปรดรอสักครู่เพื่อให้อุปกรณ์อื่น ๆ ของคุณกลายเป็น Pro โดยอัตโนมัติ", + "account.signin": "Sign In", + "account.signout": "ออกจากระบบ", + "account.submit": "ส่ง", + "account.username": "ชื่อผู้ใช้", + "account.switch.to.register": "สลับไปยังการสร้างบัญชี", + "account.switch.to.signin": "สลับเพื่อเข้าสู่ระบบ", + "account.invalid.username": "ชื่อผู้ใช้ไม่ถูกต้อง", + "account.invalid.email": "อีเมลไม่ถูกต้อง", + "account.password.mismatch": "ยืนยันรหัสผ่านไม่ตรงกันกับรหัสผ่าน", + "account.password.short": "รหัสผ่านสั้นเกินไป", + "account.password.lowercase": "รหัสผ่านต้องมีอักษรตัวพิมพ์เล็กอย่างน้อยหนึ่งตัว", + "account.password.uppercase": "รหัสผ่านต้องมีอักษรตัวพิมพ์ใหญ่อย่างน้อยหนึ่งตัว", + "account.password.number": "รหัสผ่านต้องมีตัวเลขอย่างน้อยหนึ่งตัว", + "account.password.compromised": "รหัสผ่านจะปรากฏบนรายการรหัสผ่านที่ถูกลดหย่อนความปลอดภัย", + "modal.register.free.header": "ลงทะเบียนหรือลงชื่อเข้าใช้เพื่อเข้าถึงกระเป๋าสตางค์ Yinbi", + "modal.register.pro.header": "เพิ่มรหัสผ่านบัญชีเพื่อเข้าถึงกระเป๋าสตางค์ Yinbi", + "modal.register.pro.signin.header": "ลงชื่อเข้าใช้เพื่อเข้าถึงกระเป๋าสตางค์ Yinbi", + "modal.register.free.text": "คุณต้องมีบัญชี Lantern ในการใช้กระเป๋าสตางค์ Yinbi โปรดลงทะเบียนหรือ\nลงชื่อเข้าใช้เพื่อดำเนินการต่อ", + "modal.register.pro.text": "หากต้องการใช้กระเป๋าสตางค์ Yinbi คุณต้องเพิ่มรหัสผ่านเข้าไปในบัญชี Lantern ของคุณ", + "modal.register.pro.signin.text": "หากต้องการใช้กระเป๋าสตางค์ Yinbi คุณต้องลงชื่อเข้าใช้บัญชี Lantern ของคุณ", + "adyen.paymentMethods.title": "วิธีการชำระเงิน", + "adyen.paymentMethods.storedMethods": "วิธีการชำระเงินของคุณ", + "adyen.paymentMethods.otherMethods": "เลือกวิธีอื่น", + "adyen.paymentMethods.moreMethodsButton": "วิธีการชำระเงินเพิ่มเติม", + "adyen.payButton": "ชำระเงิน", + "adyen.payButton.formatted": "ชำระ %@", + "adyen.cancelButton": "ยกเลิก", + "adyen.dismissButton": "ตกลง", + "adyen.storeDetails": "บันทึกไว้สำหรับการชำระเงินครั้งต่อไป", + "adyen.payment.redirecting": "คุณจะได้รับการเปลี่ยนเส้นทาง", + "adyen.payment.processing": "กำลังดำเนินการชำระเงิน", + "adyen.creditCard.title": "รายละเอียดบัตร", + "adyen.creditCard.holderName": "ชื่อผู้ถือบัตร", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "หมายเลขบัตร", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "หมายเลขบัตรไม่ถูกต้อง", + "adyen.creditCard.expiryDateField.title": "วันหมดอายุ", + "adyen.creditCard.expiryDateField.placeholder": "ดด/ปป", + "adyen.creditCard.expiryDateField.invalid": "วันหมดอายุไม่ถูกต้อง", + "adyen.creditCard.expiryDateField.month": "เดือน", + "adyen.creditCard.expiryDateField.month.placeholder": "ดด", + "adyen.creditCard.expiryDateField.year.placeholder": "ปป", + "adyen.creditCard.expiryDateField.year": "ปี", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "จำนวนงวดการผ่อนชำระ", + "adyen.creditCard.storeDetailsButton": "จำบัตรนี้ไว้สำหรับการชำระเงินครั้งต่อไป", + "adyen.creditCard.oneClickVerification.title": "ยืนยันบัตรของคุณ", + "adyen.creditCard.oneClickVerification.message": "โปรดป้อนรหัส CVC สำหรับ %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC ไม่ถูกต้อง", + "adyen.creditCard.oneClickVerification.invalidInput.message": "โปรดป้อน CVC ที่ถูกต้องเพื่อดำเนินการต่อ", + "adyen.sepaDirectDebit.ibanField.title": "หมายเลขบัญชี (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "หมายเลขบัญชีไม่ถูกต้อง", + "adyen.sepaDirectDebit.nameField.title": "ชื่อผู้ถือ", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "ฉันยอมรับว่าจะมีการหักเงินจากบัญชีธนาคารของฉันตามจำนวนเงินด้านล่างนี้", + "adyen.sepa.ownerName": "ชื่อผู้ถือ", + "adyen.sepa.ibanNumber": "หมายเลขบัญชี (IBAN)", + "adyen.giropay.searchField.placeholder": "ชื่อธนาคาร / BIC / รหัสธนาคาร", + "adyen.giropay.minimumLength": "อักขระอย่างน้อย 3 ตัว", + "adyen.giropay.noResults": "ไม่พบผลการค้นหา", + "adyen.error.title": "ข้อผิดพลาด", + "adyen.error.subtitle.redirect": "การเปลี่ยนเส้นทางล้มเหลว", + "adyen.error.subtitle.payment": "การชำระเงินล้มเหลว", + "adyen.error.subtitle.refused": "การชำระเงินถูกปฏิเสธ", + "adyen.error.message.unknown": "เกิดข้อผิดพลาดที่ไม่รู้จัก", + "adyen.error.message.cannotConnectToInternet": "ไม่สามารถเชื่อมต่ออินเทอร์เน็ตได้: โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ", + "adyen.error.message.cannotConnectToHost": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์การชำระเงินของเรา", + "adyen.error.retryButton": "ลองอีกครั้ง", + "adyen.idealIssuer.selectField.title": "ธนาคาร", + "adyen.idealIssuer.selectField.placeholder": "เลือกธนาคารของคุณ", + "adyen.creditCard.success": "ชำระเงินสำเร็จ", + "adyen.oneClick.confirmationAlert.title": "ยืนยันการชำระเงิน %@", + "adyen.redirect.cannotOpenApp.title": "ไม่สามารถเปิดแอป", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "ไม่สามารถเปิดแอปนี้ได้เนื่องจากไม่ได้ติดตั้งบนอุปกรณ์นี้", + "adyen.holderName": "ชื่อผู้ถือบัตร", + "adyen.countryCode": "รหัสประเทศ", + "adyen.telephone.number": "หมายเลขโทรศัพท์", + "android.download": "Lantern Android", + "android.download.title": "ดาวน์โหลด Lantern Android", + "authorize.title": "อนุญาตอุปกรณ์สำหรับ Pro", + "authorize.step1.have_pro_device": "ฉันมีอุปกรณ์ Lantern Pro อื่น", + "authorize.step1.link": "การเชื่อมโยงอุปกรณ์", + "authorize.step1.email_linking": "การเชื่อมโยงอีเมล", + "authorize.device_linking_explanation": "ใช้วิธีนี้หากคุณลงชื่อเข้าใช้ด้วยอุปกรณ์อื่นและมีอุปกรณ์อยู่กับตัว", + "authorize.device_email_explanation": "ใช้วิธีนี้หากคุณต้องการให้ส่งพินเชื่อมโยงอุปกรณ์ไปยังอีเมลของคุณ", + "authorize.link_device": "เชื่อมโยงอุปกรณ์", + "authorize.step1.choose": "โปรดเลือกวิธีเชื่อมโยงบัญชีของคุณ", + "authorize.step1.or": "หรือ", + "authorize.step1.recover": "ฉันต้องการกู้คืนบัญชี Lantern Pro ของฉัน", + "authorize.step1.start": "เริ่มการกู้คืน", + "authorize.step1.no_mail": "จำที่อยู่อีเมลของคุณไม่ได้หรือ", + "authorize.step1.description": "ป้อนอีเมลของคุณ และหากมีบัญชีอยู่เราจะส่งอีเมลพร้อมรหัสเชื่อมโยงอุปกรณ์ให้คุณ", + "authorize.step2b.enter_code": "ป้อนรหัสกู้คืนบัญชีของคุณ", + "authorize.step2b.code": "รหัสกู้คืนบัญชี", + "authorize.step2b.instruction": "อีเมลที่มีรหัสกู้คืนได้ถูกส่งไปยัง {{email}} แล้ว หากมีบัญชีนี้อยู่ อาจจะใช้เวลาหลายชั่วโมงกว่าคุณจะได้รับอีเมลนี้ โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากไม่ได้รับอีเมล", + "authorize.step2b.no_mail": "ไม่ได้รับอีเมล", + "authorize.step3.recovery": "การกู้คืนบัญชี", + "authorize.step3.no_email": "โอ๊ะ! เราพบปัญหาในการค้นหาที่อยู่อีเมลดังกล่าว โปรดให้ข้อมูลเพิ่มเติมด้านล่างเพื่อช่วยเราค้นหาบัญชีของคุณ", + "authorize.step3.no_code_received": "มีปัญหาในการรับอีเมลกู้คืนหรือ ป้อนข้อมูลด้านล่างและเราจะติดต่อคุณภายใน 48 ชั่วโมง", + "authorize.step3.your_email": "อีเมลของคุณ", + "authorize.step3.payment_method": "วิธีการชำระเงิน", + "authorize.step3.payment_method_hint": "เลือกวิธีการชำระเงินที่คุณใช้ในการรับ Pro", + "authorize.step3.credit_card": "บัตรเครดิต", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "รับ Pro โดยการแนะนำเพื่อน", + "authorize.step3.payment_account": "บัญชีการชำระเงิน", + "authorize.step3.payment_account_hint": "ป้อนข้อมูลบัญชี Alipay ของคุณ", + "authorize.step3.referral_code": "รหัสแนะนำของคุณ", + "authorize.step3.purchase_date": "วันที่ซื้อ", + "authorize.step3.note": "โปรดทราบข้อมูลอื่น ๆ ที่อาจช่วยเราค้นหาบัญชีของคุณ", + "authorize.step4.title": "ความคืบหน้าในการกู้คืนบัญชี", + "authorize.step4.text1": "ขอบคุณ! เราได้รับคำร้องขอกู้คืนบัญชีของคุณแล้ว", + "authorize.step4.text2": "โปรดรอ 48 ชั่วโมงเพื่อเรียกดูข้อมูลบัญชี Pro ของคุณ", + "authorize.step4.text3": "เราจะส่งข้อมูลไปยังที่อยู่อีเมลที่ป้อนบนหน้าจอก่อนหน้านี้", + "authorized.continue": "ดำเนินการต่อไปยัง Pro", + "authorized.continue.lantern": "ดำเนินการต่อไปยัง Lantern", + "authorized.text": "อุปกรณ์นี้ได้รับอนุญาตให้ใช้บัญชี Lantern Pro ของคุณแล้ว!", + "authorized.title": "อนุญาตอุปกรณ์แล้ว", + "button.account": "บัญชี", + "button.renew": "ต่ออายุ", + "button.upgrade": "อัปเกรด", + "button.upgrade_now": "อัปเกรดเดี๋ยวนี้", + "button.upgrade_to_lantern_pro": "อัปเกรดเป็น Lantern Pro", + "button.copy_your_code": "คัดลอกรหัสของคุณ", + "button.try_again": "ลองอีกครั้ง", + "button.continue": "ดำเนินการต่อ", + "button.continue_to": "ดำเนินการต่อไปยัง {{planType}}", + "bullet.click_button": "คลิกบนปุ่มด้านล่าง", + "bullet.paste_code": "วางรหัสและลิงก์ดาวน์โหลดในข้อความ", + "bullet.send_to_friends": "ส่งไปให้เพื่อนของคุณ", + "cancel": "ยกเลิก", + "confirm": "ยืนยัน", + "norecoveryyinbi": "*ไม่กู้คืนกระเป๋าสตางค์ Yinbi", + "email.recovery.check.email": "ตรวจสอบอีเมลของคุณเพื่อค้นหาข้อความที่มีรหัสการกู้คืน", + "email.recovery.code.label": "ป้อนหรือวางรหัสการกู้คืน", + "email.recovery.no.code": "ไม่ได้รับรหัสใช่ไหม?", + "email.recovery.text": "ป้อนอีเมลของคุณแล้วเราจะส่งรหัสสำหรับการตั้งรหัสผ่านใหม่ให้คุณ\nหากคุณมีกระเป๋าสตางค์ Yinbi วิธีการนี้จะไม่สามารถกู้คืนกระเป๋าสตางค์ Yinbi ของคุณได้ หากต้องการกู้คืนกระเป๋าสตางค์ Yinbi ให้ป้อนวลีในการกู้คืนของ Yinbi", + "email.recovery.desc": "ใช้วิธีนี้หากคุณต้องการให้ส่งรหัสกู้คืนไปยังอีเมลของคุณ", + "device.recovery.desc": "ใช้วิธีนี้หากคุณลงชื่อเข้าใช้ด้วยอุปกรณ์อื่นและมีอุปกรณ์อยู่กับตัว", + "google_search": "ค้นหา Google", + "giveaway.upgrade": "อัปเกรดเพื่อรับของแถมประจำวันนี้ได้ฟรี", + "giveaway.title_released_today": "วันนี้ปล่อย %s YNB!", + "giveaway.what_is_it": "การแจก Yinbi คืออะไร?", + "giveaway.description1": "มูลนิธิ Yinbi มอบเงินดิจิทัลจำนวน 888 พันล้าน YNB ให้กับผู้ซื้อ Lantern Pro โดยเฉพาะผ่านทาง Lantern", + "giveaway.description2": "จะมีการแจก YNB ทุกวันเมื่อสิ้นสุดวันตามจำนวน Yinbi ที่ปล่อยออกมาในวันนั้น ตามจำนวนผู้ใช้ที่ทำการอัปเกรด/ต่ออายุ และตามจำนวนปีหรือบัญชีที่คุณซื้อ โดยจะเพิ่ม YNB ลงในกระเป๋าสตางค์ของคุณใน Lantern โดยตรง", + "giveaway.learn_more": "เรียนรู้เพิ่มเติม", + "link_device": "มีบัญชี Pro แล้วใช่ไหม เชื่อมโยงอุปกรณ์เลย", + "email.recovery": "การกู้คืนอีเมล", + "email_taken": "ลงทะเบียนอีเมลไว้แล้ว", + "username_taken": "ลงทะเบียนชื่อผู้ใช้นี้แล้ว", + "err.unknown_error": "ข้อผิดพลาดที่ไม่รู้จัก", + "err.internal_error": "ข้อผิดพลาดภายใน", + "err.bad_input": "ข้อมูลไม่ถูกต้อง", + "err.not_authorized": "ไม่ได้รับอนุญาต", + "err.user_exists": "ผู้ใช้มีอยู่", + "err.no_such_user": "ไม่มีผู้ใช้นั้น", + "err.user_already_verified": "ผู้ใช้ได้รับการตรวจยืนยันไปแล้ว", + "err.invalid_user_verification": "การตรวจยืนยันผู้ใช้ไม่ถูกต้อง", + "err.user_unverified": "ผู้ใช้ยังไม่ได้รับการตรวจยืนยัน", + "err.operation_temporarily_unavailable": "การทำงานใช้งานไม่ได้ชั่วคราว", + "err.wrong_or_inexistent_plan": "แผนนี้ไม่ถูกต้องหรือไม่มีอยู่จริง", + "err.user_has_active_subscription": "ผู้ใช้มีการสมัครที่ใช้งานได้อยู่", + "err.payment_error": "ข้อผิดพลาดการชำระเงิน", + "err.no_codes_left": "ไม่มีรหัสแนะนำเหลือ", + "err.wrong_code": "รหัสแนะนำไม่ถูกต้อง", + "err.redeeming_own_code_not_allowed": "ไม่สามารถขอรหัสสำหรับตัวเองได้", + "err.wrong_charge_id": "ID ค่าบริการที่ไม่ถูกต้อง", + "err.wrong_link_code": "รหัสลิงก์ผิด", + "err.invalid_credentials": "ข้อมูลประจำตัวผู้ใช้ที่ให้ไม่ถูกต้อง", + "footer.reseller": "มาสร้างรายได้กันเถอะ! เป็นตัวแทนจำหน่าย Lantern Pro คลิกที่นี่", + "footer.reseller.email_subject": "บอกฉันเกี่ยวกับโปรแกรมตัวแทนจำหน่าย Lantern", + "footer.reseller.email_body": "เมื่อคุณเป็นผู้ค้าปลีกของ Lantern ที่จะได้รับผลตอบแทนจากการขายการสมัคร Lantern Pro ถึง 25% แจ้งให้เราทราบถึงเหตุผลที่คุณต้องการเป็นผู้ค้าปลีกด้านล่างนี้", + "feature.faster_speed": "ความเร็วที่มากกว่า", + "feature.faster": "ศูนย์ข้อมูลที่เร็วขึ้น", + "feature.unlimited": "ข้อมูลไม่จำกัด", + "feature.nologs": "ไม่มีบันทึก", + "feature.devices": "เชื่อมต่ออุปกรณ์ได้สูงสุด 3 เครื่อง", + "feature.noads": "ไม่มีโฆษณา", + "feature.yinbi.tooltip": "มูลนิธิ Yinbi มอบเงิน 888 ล้านสกุลเงินดิจิทัล YNB ผ่านทาง Lantern ให้กับผู้ซื้อ Lantern Pro จะมีการแจกจ่ายเงิน YNB ในช่วงสุดท้ายของทุกวัน อิงจากจำนวนของ Yinbi ที่จำหน่ายในวันนั้นๆ จำนวนของคนที่อัปเกรดหรือต่ออายุ และจำนวนปีหรือบัญชีที่คุณซื้อ เงิน YNB จะโอนเข้าสู่กระเป๋าสตางค์ Yinbi ใน Lantern ของคุณโดยตรง!", + "feature.antiblock": "ต้านทานต่อการปิดกั้น", + "feature.data_center": "ศูนย์ข้อมูลที่ดีกว่า", + "feature.free_yinbi": "รับเงินดิจิทัล Yinbi ฟรี!", + "free.title": "Lantern Pro", + "free.desc": "เร็วกว่า แข็งแกร่งกว่า ไม่จำกัด ปลอดภัย", + "free.link_account": "มีบัญชี Pro แล้วใช่ไหม เชื่อมโยงบัญชีของคุณเลย", + "home.get_lantern_pro": "รับ Lantern Pro", + "home.get_lantern_platinum": "อัปเกรดแผนของคุณ", + "home.welcome_popup_subheader": "ยินดีต้อนรับสู่ Lantern ใหม่!", + "home.welcome_popup_content_1": "เราทำงานกันอย่างหนักในการอัปเดต Lantern และเพิ่มเติมฟีเจอร์ใหม่ๆ", + "home.welcome_popup_content_2": "ใน UI ใหม่ของเรา คุณจะพบแถบค้นหาที่คุณสามารถค้นหาไฟล์ที่ใช้ร่วมกันบนเครือข่าย Lantern ได้ คุณยังสามารถสนับสนุนด้านเนื้อหาโดยการโพสต์ไฟล์ด้วยตนเอง ลองใช้งานฟีเจอร์เบต้านี้ แล้วบอกเราว่าคุณคิดอย่างไร เราจะนำข้อคิดเห็นของคุณไปพัฒนาปรับปรุงต่อไป", + "home.welcome_popup_button": "ทดลองใช้งาน", + "input.email": "อีเมล", + "input.your_email": "ที่อยู่อีเมลของคุณ", + "input.confirm_email": "ยืนยันที่อยู่อีเมล", + "input.enter_email": "ป้อนอีเมลของคุณ", + "input.use_valid_email": "เขียนที่อยู่อีเมลที่ถูกต้อง", + "input.email_not_match": "ช่องอีเมลไม่ตรงกัน", + "input.existing_email": "มีอีเมลนี้แล้ว", + "issue.your_email": "อีเมลของคุณ", + "issue.attach_image_failure": "ไม่สามารถแนบรูปภาพ", + "issue.try_again": "โปรดลองอีกครั้ง", + "issue.select_issue": "โปรดเลือกปัญหา", + "issue.selected_issue": "เลือกปัญหา", + "issue.select_issue_hint": "เลือกปัญหาจากเมนูแด้านล่าง", + "issue.note": "อธิบายปัญหาของคุณให้เราทราบ", + "issue.description": "คำอธิบายปัญหา", + "issue.error": "เกิดข้อผิดพลาดในการรายงานปัญหา", + "issue.submit": "ส่งรายงาน", + "issue.report_screenshot": "ลากรูปภาพหรือคลิกเพื่ออัปโหลดภาพบันทึกหน้าจอ", + "issue.reported": "ขอบคุณสำหรับการรายงานปัญหา แล้วเราจะติดต่อกลับทางอีเมลโดยเร็วที่สุด", + "issue.report_sent": "ส่งรายงานแล้ว", + "issue.type.no_access": "ไม่สามารถเข้าถึงไซต์ที่ถูกปิดกั้น", + "issue.type.payment_fail": "ไม่สามารถชำระเงินได้เสร็จสิ้น", + "issue.type.cannot_login": "ไม่สามารถเข้าสู่ระบบ", + "issue.type.always_spinning": "สัญลักษณ์โหลดหมุนไม่หยุด", + "issue.type.slow": "ช้า", + "issue.type.cannot_link_device": "ไม่สามารถเชื่อมโยงอุปกรณ์", + "issue.type.crashes": "Lantern ขัดข้อง", + "issue.type.other": "อื่นๆ", + "languages.title": "ภาษา", + "lantern.email": "อีเมล Lantern", + "mobile.link": "ใช้ลิงก์เพื่อดาวน์โหลด Lantern บนอุปกรณ์แอนดรอยด์ของคุณ:", + "mobile.title": "ดาวน์โหลด Android เวอร์ชัน", + "nav.about": "เกี่ยวกับ", + "nav.account": "การจัดการบัญชี", + "nav.authorize": "เพิ่มอุปกรณ์", + "nav.authorized": "อนุญาตอุปกรณ์แล้ว", + "nav.unauthorized_link": "อนุญาตอุปกรณ์สำหรับ Pro", + "nav.language": "ภาษา", + "nav.lantern": "Lantern", + "nav.mobile": "รับเวอร์ชันสำหรับมือถือ", + "nav.report_issue": "รายงานปัญหา", + "nav.settings": "การตั้งค่า", + "nav.support": "สนับสนุน", + "nav.verify": "การตรวจยืนยันบัญชี", + "nav.yinbi": "แลกรับ Yinbi", + "nav.home": "หน้าหลัก", + "nav.discover": "ค้นพบ", + "nav.wallet": "กระเป๋าสตางค์", + "nav.yinbi_wallet": "กระเป๋าสตางค์ Yinbi", + "notification.retry": "ลองใหม่", + "notifications": "แจ้งเตือน", + "notifications.whatisnew": "มีอะไรใหม่?", + "password.change": "เปลี่ยนรหัสผ่าน", + "password.changed": "เปลี่ยนรหัสผ่านแล้ว", + "continue.to.pro": "ดำเนินการต่อไปยัง Pro", + "username": "ชื่อผู้ใช้", + "password.new": "รหัสผ่านใหม่", + "password.requirements": "
รหัสผ่านต้องมีองค์ประกอบต่อไปนี้:
  • ประกอบด้วยอักขระ 8 ตัวขึ้นไป
  • มีตัวอักษรพิมพ์เล็ก 1 ตัว
  • มีตัวอักษรพิมพ์ใหญ่ 1 ตัว
  • มีตัวเลขอย่างน้อย 1 ตัว
  • ต้องไม่อยู่ในรายการรหัสผ่านที่ไม่รัดกุม
", + "password.reset": "ตั้งรหัสผ่านใหม่", + "paxful.buy": "ซื้อ", + "paxful.payment": "วิธีการชำระเงิน", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "กระเป๋าสตางค์ออนไลน์", + "paxful.bank": "โอนเงินผ่านธนาคาร", + "paxful.gamer_card": "บัตรเกม", + "paxful.gift_card": "บัตรของขวัญ", + "paxful.cash": "ชำระเงินสด", + "paxful.digital_currency": "สกุลเงินดิจิตอล", + "paxful.button": "แสดงข้อเสนอที่ดีที่สุด", + "payment.close": "ปิด", + "payment.redirectErrorTitle": "การเชื่อมต่อเซิร์ฟเวอร์จ่ายเงินล้มเหลว", + "payment.redirectErrorText": "เรากำลังทำการแก้ไขปัญหานี้อยู่ โปรดตรวจสอบอีกครั้งในภายหลัง", + "payment.wait_for_pro": "ขอขอบคุณที่ซื้อ Lantern Pro! โปรดรอสักครู่เพื่อให้ Lantern ของคุณกลายเป็น Pro โดยอัตโนมัติ", + "payment.moreOptions": "ดูตัวเลือกเพิ่มเติม", + "payment.fewerOptions": "ดูตัวเลือกน้อยลง", + "payment_methods.select_name": "เลือกวิธีการชำระเงิน", + "payment_methods.alipay": "บัตรเครดิต/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "หากต้องการซื้อ Lantern Pro", + "payment_methods.shetab.details.body": "เมื่อคุณคลิกดำเนินการซื้อต่อ คุณจะได้รับการเปลี่ยนเส้นทางไปยังไซต์ภายนอกเพื่อชำระเงินและรับรหัสเปิดใช้งาน", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "ดำเนินการซื้อต่อ", + "payment_methods.shetab.details.input_code_button": "ป้อนรหัสเปิดใช้งาน", + "plan.step1": "ขั้นตอนที่ 1", + "plan.apply": "ใช้", + "plan.step2": "ขั้นตอนที่ 2", + "plan.most_popular": "เป็นที่นิยมมากที่สุด!", + "plan.step3": "ขั้นตอนที่ 3", + "plan.choose_plan": "เลือกแผน", + "plan.enter_email": "ป้อนอีเมล", + "plan.choose_method": "เลือกวิธีการชำระเงิน", + "plan.bestValue": "ข้อเสนอสุดพิเศษ!", + "plan.per_month": "ต่อเดือน", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 ปี", + "plan.add_referral": "เพิ่มรหัสแนะนำ", + "plan.years": "แผน {{years}} ปี", + "plan.desc": "เรียกเก็บเงิน {{price}} ครั้งเดียว", + "plan.bonus_months": "+ {{bonusMonths}} เดือน", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "เลือก", + "plan.two_year": "สองปี", + "plan.one_year": "หนึ่งปี", + "plan.savings": "บันทึก {{formattedDiscount}} %", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "สำหรับ Windows Android Mac Ubuntu", + "plans.from_reseller": "มีรหัสเปิดใช้งาน Lantern Pro หรือไม่? คลิกที่นี่", + "plans.with_voucher_code": "มีรหัสเปิดใช้งานหรือไม่? คลิกที่นี่", + "pro.apply": "เครดิตของคุณจะถูกนำไปใช้กับบัญชีของคุณในรอบบิลถัดไป", + "pro.title": "เชิญชวนเพื่อน รับ Pro เพิ่มฟรี", + "pro.subtitle": "เมื่อเพื่อนของคุณซื้อแผนสองปีคุณและเพื่อนจะได้รับ Pro เพิ่มอีก 3 เดือนฟรี รับฟรี 1 เดือนเมื่อซื้อแผนหนึ่งปี", + "pro.share": "แบ่งปันรหัสของคุณกับเพื่อนเพื่อรับเครดิตเพิ่ม!", + "promotion.title": "ชำระเงิน Lantern Pro", + "promotion.title.activation": "Lantern Pro เปิดใช้งาน", + "promotion.enter_and_confirm_email": "โปรดป้อนและยืนยันที่อยู่อีเมลของคุณ", + "promotion.code.hint": "ป้อนรหัสแนะนำของเพื่อนของคุณ (ไม่บังคับ)", + "promotion.code.label": "รหัสแนะนำ", + "promotion.payment": "ชำระเงินต่อ", + "promotion.payment.btc": "จ่ายด้วย ₿", + "promotion.loading": "กำลังโหลด...", + "promotion.howto_1y": "หากเพื่อนแชร์รหัสการแนะนำผลิตภัณฑ์กับคุณให้ป้อนรหัสเพื่อรับ Lantern Pro ฟรีหนึ่งเดือนหลังจากชำระเงิน", + "promotion.howto_2y": "หากเพื่อนแชร์รหัสการแนะนำผลิตภัณฑ์กับคุณให้ป้อนรหัสเพื่อรับ Lantern Pro ฟรีหนึ่งเดือนหลังจากชำระเงิน", + "promotion.pay": "ชำระ {{amount}}", + "promotion.select": "เลือก", + "promotion.promotion_applied_1y": "โบนัส +1 เดือน", + "promotion.promotion_applied_2y": "โบนัส +3 เดือน", + "promotion.too_many_referrals": "มีการเพิ่มรหัสแนะนำนี้แล้ว ชำระเงินตอนนี้เพื่อรับเดือนพิเศษของคุณ", + "promotion.activation.enter_and_confirm_email": "กรุณากรอกและยืนยันที่อยู่อีเมลของคุณเพื่อลงทะเบียนบัญชี Lantern Pro ของคุณ", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "รหัสเปิดใช้งาน", + "promotion.activation.instructions": "ป้อนอีเมลของคุณและรหัสเปิดใช้งาน 25 หลักที่ได้รับจากตัวแทนจำหน่ายเพื่อลงทะเบียนบัญชี", + "promotion.activation.howto": "โปรดป้อนรหัสเปิดใช้งาน Lantern Pro ที่มีอักขระ 25 ตัวด้านบน หากคุณไม่มีรหัส โปรดซื้อ Pro ในหน้าจอก่อนหน้านี้หรือค้นหาตัวแทนจำหน่าย Lantern Pro ทางออนไลน์", + "promotion.activation.continue": "ลงทะเบียนใช้งาน Pro", + "promotion.voucher.hint": "รหัสเปิดใช้งาน", + "promotion.voucher.howto": "โปรดป้อนรหัสเปิดใช้งาน Fast World Pay ที่มีอักขระ 12 ตัวด้านบน", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "เกิดข้อผิดพลาดในการแลกรหัสเปิดใช้งานของคุณ", + "promotion.voucher.error.invalid_code": "รหัสเปิดใช้งานไม่ถูกต้อง", + "promotion.voucher.error.invalid_plan": "รหัสเปิดใช้งานเชื่อมโยงกับแผนที่ไม่ถูกต้อง", + "promotion.voucher.error.already_redeemed": "รหัสเปิดใช้งานถูกแลกไปแล้ว", + "referral.code": "รหัสแนะนำ", + "referral.text": "ใช้รหัสของฉัน %s เพื่อรับฟรี 3 เดือนเมื่อคุณลงทะเบียน!", + "referral.description_free": "แชร์รหัสของคุณกับเพื่อน และใช้บริการ Lantern Pro ฟรี 1 เดือนเมื่อเพื่อนซื้อ Pro!", + "referral.description_pro": "แชร์รหัสของคุณกับเพื่อน และใช้บริการ Lantern Pro เพิ่มเติมฟรี 1 เดือนเมื่อเพื่อนซื้อ Pro!", + "register": "ลงทะเบียน", + "renew.subtitle_early": "ต่ออายุใหม่แล้วรับฟรี 3 เดือน!", + "renew.subtitle_last_day": "ต่ออายุใหม่แล้วรับฟรี 3 เดือน!", + "renew.subtitle_expired": "ต่ออายุใหม่แล้วรับ 45 วันฟรี!", + "renew.details_early": "สมาชิก Lantern Pro ของคุณกำลังสิ้นสุดเร็วๆ นี้ ต่ออายุตอนนี้และเพลิดเพลินกับการใช้งานฟรีสูงสุด 3 เดือน! ", + "renew.details_last_day": "ต่ออายุใหม่และเพลิดเพลินกับการใช้งานฟรีสูงสุด 3 เดือน! วันนี้เป็นวันสุดท้ายที่จะใช้ประโยชน์จากข้อเสนอพิเศษนี้ ผู้ใช้ Lantern Pro จะได้รับความเร็วที่รวดเร็วขึ้น ข้อมูลที่ไม่จำกัด ต้านทานต่อการปิดกั้นที่ดีขึ้น ใช้ได้ถึง 3 อุปกรณ์และไม่มีโฆษณา", + "renew.details_expired": "ต่ออายุใหม่และรับฟรีเพิ่มอีก 45 วัน ในระยะเวลาจำกัดเท่านั้น \nผู้ใช้ Lantern Pro จะได้รับความเร็วที่รวดเร็วขึ้น ข้อมูลที่ไม่จำกัด ต้านทานต่อการปิดกั้นที่ดีขึ้น ใช้ได้ถึง 3 อุปกรณ์และไม่มีโฆษณา", + "renew.asterisk_early": "* ข้อเสนอในระยะเวลาจำกัดนี้ใช้ได้ในกรณีที่ต่ออายุก่อนกำหนดเท่านั้น", + "renew.asterisk_last_day": "* นี่คือโอกาสสุดท้ายที่จะรับข้อเสนอสุดพิเศษนี้!", + "renew.asterisk_expired": "* ข้อเสนอนี้มีระยะเวลาจำกัด!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 เดือนฟรี ", + "renew.plan_renewal_bonus_months": "$%d%s + %d เดือนฟรี ", + "renew.plan_renewal_bonus_days": "$%d%s + %d วันฟรี ", + "renew.next": "ถัดไป", + "renew.decline": "ปฏิเสธข้อเสนอ", + "renew.decline_question": "คุณแน่ใจหรือไม่ว่าต้องการปฏิเสธข้อเสนอพิเศษนี้", + "renew.decline_yes": "ต่ออายุภายหลัง", + "renew.decline_dismiss": "ต่ออายุตอนนี้", + "renew.notification_title_30_days": "ต่ออายุ Pro ตอนนี้และประหยัดสุดๆ!", + "renew.notification_title_30_days_platinum": "ต่ออายุ Platinum ตอนนี้และประหยัดสุดๆ!", + "renew.notification_text_30_days": "บัญชี {{planName}} ของคุณจะหมดอายุใน {{remainingDays}} วัน ต่ออายุใหม่และรับฟรี 3 เดือน", + "renew.notification_title_2_days": "ส่วนลด {{planName}} จะสิ้นสุดในวันพรุ่งนี้!", + "renew.notification_text_2_days": "บัญชี {{planName}} ของคุณจะหมดอายุในวันพรุ่งนี้ อย่าพลาดโอกาสนี้กับส่วนลดมากมาย", + "renew.notification_title_last_day": "โอกาสสุดท้ายสำหรับส่วนลด!", + "renew.notification_text_last_day": "บัญชี {{planName}} ของคุณหมดอายุแล้ว ต่ออายุวันนี้และรับฟรี 3 เดือน", + "replica.upload": "อัปโหลด", + "replica.favorite": "รายการโปรด", + "replica.added_to_favorites": "เพิ่มเข้ารายการโปรด", + "replica.filedrop_error": "เกิดข้อผิดพลาดในการอัปโหลดไฟล์นี้", + "replica.filedrop_error.file-too-large": "ขนาดไฟล์สูงสุดที่อนุญาต คือ {{fileSize}}", + "replica.filedrop_error.file-too-small": "ไฟล์มีขนาดเล็กเกินไป", + "replica.filedrop_error.too-many-files": "มีไฟล์มากเกินไป", + "replica.filedrop_error.file-invalid-type": "ไม่รองรับไฟล์ประเภทนี้ในขณะนี้", + "replica.filedrop_remove_file": "เอาออกจากคิว", + "replica.post": "โพสต์", + "replica.relevance": "ความเกี่ยวข้อง", + "replica.upload_date": "วันที่อัปโหลด", + "replica.gallery_view": "มุมมองแกลเลอรี", + "replica.list_view": "มุมมองรายการ", + "replica.copy_lantern_link": "คัดลอกลิงก์ Lantern", + "replica.documents": "เอกสาร", + "replica.audio": "เสียง", + "replica.application": "แอป", + "replica.image": "รูปภาพ", + "replica.video": "วิดีโอ", + "replica.web": "เว็บ", + "replica.news": "ข่าว", + "replica.upload_alert.dont_show": "ไม่ต้องแสดงรายการนี้อีก", + "replica.upload_alert.cancel": "ยกเลิกการอัปโหลด", + "replica.upload_alert.resume": "อัปโหลดต่อ", + "replica.upload_alert.info": "ข้อมูลสำคัญ!", + "replica.upload_alert.desc1": "ไฟล์ที่อัปโหลดไปยัง Lantern จะได้รับการเผยแพร่และกระจายส่วนแยกจากศูนย์ เมื่อผู้ใช้รายอื่นเข้าถึงไฟล์ที่อัปโหลดแล้ว จะไม่มีผู้ใด ซึ่งรวมทั้ง Lantern สามารถลบไฟล์ออกจากเครือข่ายได้ แม้ว่าจะมีการลบไฟล์ออกจากรายการ 'ไฟล์ของฉัน' แล้วก็ตาม", + "replica.upload_alert.desc2": "โปรดอย่าใช้ข้อมูลที่ระบุตัวบุคคลได้ในไฟล์หรือชื่อไฟล์เมื่ออัปโหลดเนื้อหาที่มีความละเอียดอ่อน", + "replica.add_details": "เพิ่มรายละเอียด", + "replica.cannot_edit": "เมื่อเผยแพร่แล้วจะแก้ไขชื่อไฟล์ไม่ได้", + "replica.next": "ถัดไป", + "replica.previous": "ก่อนหน้า", + "replica.selectAll": "เลือกทั้งหมด", + "replica.search_replica": "Search", + "replica.search_results_info": "แถบนี้แสดงผลลัพธ์ Lantern เท่านั้น", + "replica.search_results_info_message": "ผลลัพธ์ของ Lantern ประกอบด้วยการอัปโหลดเนื้อหาขึ้นบนเครือข่าย Lantern โดยผู้ใช้", + "replica.no_files_found": "ไม่มีผลลัพธ์", + "replica.or_content": "เนื้อหาของคุณเองสำหรับให้ผู้อื่นค้นหา!", + "replica.try_again": "ลองใช้คำหลักอื่น หรือ", + "replica.upload_success": "อัปโหลดสำเร็จ!", + "replica.cannot_preview": "ไม่มีการแสดงตัวอย่างสำหรับประเภทไฟล์นี้", + "replica.no_description": "ไม่ได้ระบุคำอธิบาย", + "replica.size": "ขนาด", + "replica.uploaded": "อัปโหลดแล้ว", + "replica.invalid_link": "ลิงก์ไม่ถูกต้อง", + "replica.close": "ปิด", + "replica.files": "ไฟล์", + "replica.upload_history": "ประวัติการอัปโหลด", + "replica.my_favorites": "รายการโปรด", + "replica.no_uploads": "ยังไม่มีการอัปโหลด", + "replica.no_favorites": "ยังไม่มีรายการโปรด", + "replica.mime_type": "ประเภทไฟล์: {{mime}}", + "replica.image_loading_error": "เกิดข้อผิดพลาดในการโหลดรูปภาพ", + "replica.play": "เล่น", + "replica.pause": "หยุด", + "replica.scrub": "ถู", + "replica.skip_forward": "ข้าม", + "replica.skip_backwards": "ย้อน", + "replica.trending_videos": "วิดีโอยอดนิยม", + "replica.file_uploaded": "อัปโหลด: {{days}} วันที่แล้ว", + "replica.file_size": "ขนาด: %s", + "replica.duration": "ระยะเวลา", + "replica.filename": "ชื่อไฟล์", + "replica.filename_required": "ชื่อไฟล์ (จำเป็น)", + "replica.description_optional": "เพิ่มคำอธิบาย", + "replica.expand": "ขยายรายละเอียด", + "replica.filetype": "ประเภทไฟล์", + "replica.sortby": "เรียงตาม", + "replica.link": "ลิงก์สำเนา", + "replica.collapse": "ย่อ", + "replica.publish": "เผยแพร่", + "replica.cancel": "ยกเลิก", + "replica.progress_current_upload": "การอัปโหลดของ", + "replica.progress_files": "ไฟล์", + "replica.progress_of": "ของ", + "replica.progress_upload_complete": "เสร็จสิ้น", + "replica.progress_upload_failure": "อัปโหลดล้มเหลว โปรดลองอีกครั้ง", + "replica.upload_in_progress": "กำลังอัปโหลด", + "replica.upload_pending": "รอการอัปโหลด", + "replica.upload_error": "ข้อผิดพลาดในการอัปโหลด", + "replica.upload_cancel": "ยกเลิกการอัปโหลด", + "replica.upload_confirm": "คุณแน่ใจหรือไม่ว่าต้องการยกเลิกการอัปโหลด?", + "replica.progress_view": "ดู", + "replica.delete": "ลบ", + "replica.remove": "เอาออก", + "replica.delete_file": "ลบไฟล์", + "replica.remove_favorite": "เอาออกจากรายการโปรด", + "replica.failed_to_delete": "ลบไม่สำเร็จ", + "replica.failed_to_remove": "เอาออกไม่สำเร็จ", + "replica.link_lookup_failure": "ไม่พบลิงก์", + "replica.delete_file_confirmation_1": "คุณแน่ใจหรือไม่ว่าต้องการลบ", + "replica.delete_file_confirmation_2": "จากการอัปโหลดของคุณ", + "replica.remove_favorite_confirmation_1": "คุณแน่ใจหรือไม่ว่าต้องการเอาออก", + "replica.remove_favorite_confirmation_2": "จากรายการโปรดของคุณ", + "replica.share_file": "แชร์ไฟล์", + "replica.download_and_view": "ดาวน์โหลด/ดู", + "replica.download": "ดาวน์โหลด", + "replica.copy_link": "คัดลอกลิงก์สำเนา", + "replica.find_file": "ค้นหาไฟล์", + "replica.file_drop_prompt": "ลากไฟล์มาที่นี่ หรือเรียกดูเพื่อโพสต์", + "replica.empty_uploads_text1": "คลิก", + "replica.empty_uploads_text2": "ที่นี่", + "replica.empty_uploads_text3": "สำหรับสร้างโพสต์แรกของคุณ", + "replica.error_header": "อุ้ย", + "replica.error": "เกิดข้อผิดพลาดในการประมวลผลคำขอของคุณ โปรดลองอีกครั้ง", + "replica.serp_empty": "Google ไม่แสดงผลลัพธ์สำหรับคำค้นนี้", + "replica.disclaimer": "Lantern ไม่เปิดเผยการค้นหาของคุณและป้องกันการค้นหาจากบุคคลที่สาม", + "settings.general": "ทั่วไป", + "settings.feedback": "ข้อเสนอแนะ", + "settings.autoLaunch": "เรียกใช้ Lantern เมื่อเริ่มต้นระบบ", + "settings.autoReport": "รายงานสถิติการใช้งานอย่างปลอดภัยเพื่อนำไปใช้กับ Lantern", + "settings.lantern_ads": "แสดงโฆษณา Lantern", + "settings.lantern_ads_tooltip": "เพื่อช่วยสนับสนุนการให้บริการของเรา Lantern ได้แสดงโฆษณาให้คุณเห็นบนบางเว็บไซต์ ไม่มีการเก็บข้อมูลผู้ใช้หรือส่งต่อไปยังเซิร์ฟเวอร์ของเรา ในกรณีที่คุณปิดตัวเลือกนี้ คุณอาจจะยังมองเห็นโฆษณาอยู่ แต่ไม่ได้มาจากเครือข่าย Lantern", + "settings.proxyAll": "พร็อกซีการรับส่งข้อมูลทั้งหมด", + "settings.proxyAllHelpTitle": "\"พร็อกซีการรับส่งข้อมูลทั้งหมด\" ทำอะไรบ้าง", + "settings.proxyAllHelp1": "หากเปิดใช้งาน การรับส่งข้อมูลทั้งหมดจะถูกส่งผ่าน Lantern (ตัวเลือกที่ปลอดภัยที่สุด)", + "settings.proxyAllHelp2": "หากปิดใช้งานระบบจะส่งการรับส่งข้อมูลที่ถูกบล็อกไปยัง Lantern (ตัวเลือกที่เร็วที่สุดโดยทั่วไป)", + "settings.show_advanced": "แสดงการตั้งค่าขั้นสูง", + "settings.hide_advanced": "ซ่อนการตั้งค่าขั้นสูง", + "settings.systemProxy": "จัดการพร็อกซีของระบบ", + "settings.title": "การตั้งค่า", + "settings.http_proxy": "พร็อกซี HTTP(S):", + "settings.socks_proxy": "พร็อกซี SOCKS:", + "settings.caution": "ข้อควรระวัง:", + "settings.caution_text": "เมื่อคุณยกเลิกการเลือก \"จัดการพร็อกซีระบบ\" เบราเซอร์และแอปพลิเคชันของคุณจะไม่สามารถใช้ Lantern ได้โดยอัตโนมัติ หากคุณทราบวิธีตั้งค่าเหล่านี้ด้วยตนเองโปรดดูข้อมูลข้างต้น", + "settings.select_language": "เลือกภาษา", + "settings.diagnostics": "แนบข้อมูลการวินิจฉัย", + "settings.diagnostics_tooltip": "การแนบข้อมูลวินิจฉัยจะส่งข้อมูลทีม Lantern ที่อิงจากการเชื่อมต่อของคุณ ซึ่งจะเพิ่มความสามารถของเราในการระบุและแก้ไขปัญหาของคุณ", + "status.lantern": "Lantern คือ", + "status.click_reconnect": "คลิกที่นี่เพื่อเชื่อมต่อใหม่", + "status.server_location": "ตำแหน่งที่ตั้งของเซิร์ฟเวอร์", + "status.tooltip1": "Lantern ใช้การเลือกเซิร์ฟเวอร์อัจฉริยะเพื่อเชื่อมต่อคุณกับศูนย์ข้อมูลที่ดีที่สุดของเรา", + "status.tooltip2": "อัปเกรดเป็น Lantern Pro เพื่อเพิ่มความเร็วในการเลือกเซิร์ฟเวอร์ที่มีประสิทธิภาพสูงสุดจากศูนย์ข้อมูล Lantern Pro สุดพิเศษของเรา", + "status.protected_connection": "การเชื่อมต่อของคุณได้รับการป้องกันแล้ว", + "status.please_wait": "อาจใช้เวลาหนึ่งหรือสองนาที...", + "status.connecting": "กำลังเชื่อมต่อ...", + "status.no_internet": "ปิด", + "status.no_internet_connection": "ไม่มีการเชื่อมต่ออินเทอร์เน็ต", + "status.connected": "เปิด", + "status.disconnected": "ปิด", + "status.throttled": "ความเร็วที่ควบคุมได้ (ข้อมูล Cap)", + "status.no_system_proxy": "{{status}} ไม่ใช่พร็อกซีของระบบการจัดการ", + "status.fail_to_set_system_proxy": "ไม่สามารถตั้งค่า Lantern เป็นพร็อกซีของระบบได้", + "status.fail_to_open_browser": "ไม่สามารถเปิดหน้าต่างเบราว์เซอร์เพื่อแสดงอินเทอร์เฟซผู้ใช้ Lantern", + "support.forum": "กระดานสนทนาผู้ใช้ Lantern", + "support.faq": "คำถามที่พบบ่อย", + "terms_of_service.acknowledgment": "การคลิก {{buttonText}} แสดงว่าคุณยอมรับข้อกำหนดในการให้บริการของเรา", + "terms_of_service.replica": "การค้นหา อัปโหลด หรือใช้ผลิตภัณฑ์ของเราในลักษณะใดก็ตามแสดงว่าคุณยอมรับข้อกำหนดในการให้บริการ นโยบายความเป็นส่วนตัว และนโยบาย DMCAของเรา", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "YouTube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "ป้อนหรือวางพินการเชื่อมโยงอุปกรณ์", + "verify.code": "รหัสเชื่อมโยงอุปกรณ์", + "verify.howto_1": "หากคุณมีบัญชี Lantern Pro บนอุปกรณ์อื่น โปรดป้อนที่อยู่อีเมลของคุณที่นี่เพื่อรับรหัสในการอนุญาตอุปกรณ์", + "verify.howto_1a": "ขณะนี้คุณเป็นผู้ใช้ Pro ที่ไม่ได้รับอนุญาต โปรดป้อนที่อยู่อีเมลของคุณเพื่ออนุญาตบัญชี Pro ของคุณ ซึ่งจะช่วยให้คุณสามารถเชื่อมโยงอุปกรณ์ต่างๆได้", + "verify.howto_2": "เพื่อเชื่อมโยงอุปกรณ์กับบัญชี Pro ของคุณ:", + "verify.howto_3": "1. เลือก 'อนุญาตอุปกรณ์สำหรับ Pro' จากเมนูบนอุปกรณ์อื่นของคุณ", + "verify.howto_4": "2. ป้อนพินการเชื่อมโยงที่ได้รับจากขั้นตอนที่ 1 แล้วส่ง", + "verify.reminder": "*ตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองใช้ Lantern เวอร์ชันล่าสุด", + "verify.enter_pin": "ป้อนหรือวางพินการเชื่อมโยงอุปกรณ์", + "verify.submit": "ส่ง", + "verify.title": "การตรวจยืนยันบัญชี", + "welcomeToPro.continue": "ดำเนินการต่อไปยัง Pro", + "welcomeToPro.invite": "เชิญเพื่อนๆ และคุณกับเพื่อนจะได้รับเพิ่มฟรี 3 เดือนเมื่อซื้อแผนสองปี รับฟรี 1 เดือนเมื่อซื้อแผนหนึ่งปี เริ่มเชิญชวนวันนี้!", + "welcomeToPro.thanks": "คุณสามารถเข้าถึงได้ไม่จำกัดโดยใช้ศูนย์ข้อมูลที่เร็วที่สุดของเรา ซึ่งสามารถเชื่อมต่อกับบัญชีของคุณได้ถึงสามอุปกรณ์", + "welcomeToPro.title": "ยินดีต้อนรับสู่ Lantern Pro", + "welomeToPro.title_exclamation": "ยินดีต้อนรับสู่ Lantern Pro!", + "purchase.failed": "การซื้อล้มเหลว โปรดลองอีกครั้งในภายหลัง", + "purchase.success": "การซื้อสำเร็จ", + "purchase.success_title": "ยินดีต้อนรับสู่ Lantern {{planType}}!", + "purchase.success_content_pro": "คุณสามารถเข้าถึงได้ไม่จำกัดโดยใช้ศูนย์ข้อมูลที่เร็วที่สุดของเรา ซึ่งสามารถเชื่อมต่อกับบัญชีของคุณได้ถึงสามอุปกรณ์", + "purchase.success_content_platinum": "คุณสามารถเข้าถึงได้ไม่จำกัดโดยใช้ช่องทางเฉพาะและศูนย์ข้อมูลที่เร็วที่สุดของเรา ซึ่งสามารถเชื่อมต่อกับบัญชีของคุณได้ถึงสามอุปกรณ์", + "welcomeToPro.description": "ขณะนี้คุณสามารถเข้าถึงไซต์และบริการที่ถูกปิดกั้นได้โดยไม่จำกัด", + "messages.copied_to_clipboard": "คัดลอกรหัสแล้ว แบ่งปันกับเพื่อนของคุณ!", + "messages.datacap": "คุณใช้ข้อมูลความเร็วสูงฟรีของคุณแล้ว อัปเกรดเป็น Pro สำหรับข้อมูลความเร็วสูงไม่ จำกัด", + "messages.fatal_error": "ขออภัย เรามีปัญหาในการติดต่อกับเซิร์ฟเวอร์ Lantern โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณและลองอีกครั้ง", + "messages.backend_gone": "ขออภัย Lantern ดูเหมือนจะไม่ทำงานแล้ว โปรดเริ่มการทำงาน Lantern ใหม่และลองอีกครั้ง", + "messages.get_help": "รับความช่วยเหลือ", + "freeProCredits.title": "เชิญชวนเพื่อน", + "freeProCredits.shareWithFriends": "แบ่งปันรหัสของคุณกับเพื่อนเพื่อรับเดือนฟรี!", + "freeProCredits.shareWithFriendsDesc": "เมื่อเพื่อนของคุณซื้อแผนสองปีคุณและเพื่อนจะได้รับเพิ่มฟรี 3 เดือน รับฟรี 1 เดือนเมื่อซื้อแผนหนึ่งปี", + "cards.serverLocation.unknown": "ไม่ทราบ", + "cards.serverLocation.description": "ตำแหน่งที่ตั้งของเซิร์ฟเวอร์ที่ดีที่สุด", + "cards.serverLocation.description-free": "ตำแหน่งที่ตั้งของเซิร์ฟเวอร์", + "cards.serverLocation.description-upgrade": "อัปเกรดเพื่อเซิร์ฟเวอร์ที่เร็วยิ่งขึ้น", + "cards.serverLocation.title": "ที่ตั้งปัจจุบัน:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern ใช้การเลือกเซิร์ฟเวอร์อัจฉริยะเพื่อค้นหาการเชื่อมต่อที่รวดเร็วที่สุดจากศูนย์ข้อมูลของเราในโตเกียวสิงคโปร์ ฮ่องกง ซานฟรานซิสโก นิวยอร์ก อัมสเตอร์ดัม บังกาลอร์และอื่น ๆ", + "cards.serverLocation.text-free": "Lantern ใช้การเลือกเซิร์ฟเวอร์อัจฉริยะเพื่อเชื่อมต่อคุณกับศูนย์ข้อมูลที่ดีที่สุดของเรา", + "cards.serverLocation.upgrade-link": "อัปเกรดเป็น Lantern Pro เพื่อเพิ่มความเร็วในการเลือกเซิร์ฟเวอร์ที่มีประสิทธิภาพสูงสุดจากศูนย์ข้อมูล Lantern Pro ของเรา", + "cards.httpsUpgrades.description": "อัปเกรด HTTPS", + "cards.httpsUpgrades.title": "อัปเกรด HTTPS: %d", + "cards.httpsUpgrades.text": "Lantern อัปเกรดการเชื่อมต่อ HTTP ที่ไม่ปลอดภัยไปยังการเชื่อมต่อ HTTPS ที่เข้ารหัสเมื่อเป็นไปได้เพื่อให้ข้อมูลของคุณเป็นส่วนตัวขณะที่ท่องเว็บ", + "cards.adsBlocked.description": "ปิดกั้นโฆษณาแล้ว", + "cards.adsBlocked.title": "โฆษณาที่ถูกปิดกั้น: %d", + "cards.adsBlocked.text": "Lantern บล็อกโฆษณาที่ล่วงล้ำเพื่อเพิ่มความเร็วในการโหลดหน้าเว็บ ประหยัดแบนด์วิดท์ และเพื่อให้คุณได้รับประสบการณ์การท่องเว็บที่ราบรื่น", + "cards.dataUsage.description": "การใช้ข้อมูล", + "cards.dataUsage.upgrade": "อัปเกรดเดี๋ยวนี้", + "cards.dataUsage.mb-used": "คุณใช้ข้อมูลความเร็วสูงรายเดือน 1% d /% dMB1 แล้ว", + "cards.dataUsage.upgrade-link": "อัปเกรดเดี๋ยวนี้เพื่อบริการความเร็วสูงแบบไม่จำกัด !", + "cards.subscription.description": "สมัครสมาชิก Pro", + "cards.subscription.renew": "ต่ออายุ", + "cards.subscription.months": "คุณมีการสมัครใช้งาน Lantern Pro เหลืออยู่อีก%d เดือน", + "cards.subscription.days": "คุณมีการสมัครใช้งาน Lantern Pro เหลืออยู่อีก %d วัน", + "cards.subscription.unit.months": "เดือน", + "cards.subscription.unit.days": "วัน", + "cards.subscription.renew-link": "ต่ออายุสมาชิกเพื่อขยายเวลา", + "auth.email": "อีเมล", + "auth.username": "ชื่อผู้ใช้", + "auth.username.or.email": "ชื่อผู้ใช้หรืออีเมล", + "auth.signin": "Sign In", + "current.password": "รหัสผ่านปัจจุบัน", + "new.password": "รหัสผ่านใหม่", + "auth.change.password": "เปลี่ยนรหัสผ่าน", + "confirm.new.password": "ยืนยันรหัสผ่านใหม่", + "auth.password": "รหัสผ่าน", + "auth.have.recovery.phrase": "มีวลีในการกู้คืนหรือไม่?", + "auth.forgot.password": "ลืมหรือไม่มีรหัสผ่านใช่ไหม?", + "auth.create.account": "สร้างบัญชี", + "auth.missing.username": "ไม่มีชื่อผู้ใช้", + "auth.missing.current.password": "ไม่มีรหัสผ่านปัจจุบัน", + "auth.missing.new.password": "ไม่มีรหัสผ่านใหม่", + "auth.missing.confirm.password": "ไม่มีรหัสผ่านยืนยัน", + "invalid_credentials": "ข้อมูลประจำตัวไม่ถูกต้อง", + "yinbi.wallet": "กระเป๋าสตางค์ Yinbi", + "create.wallet": "สร้างกระเป๋าสตางค์", + "new.to.yinbi": "ยังไม่เคยใช้ Yinbi ใช่ไหม?", + "setup.wallet": "ใช่ สร้างกระเป๋าสตางค์ใหม่กันเลย!", + "web.wallet": "ไม่ ฉันมีกระเป๋าสตางค์บนเว็บไซต์ Yin.bi", + "yinbi.next": "ถัดไป", + "yinbi.amount": "จำนวน", + "yinbi.missing.address": "ไม่ได้ระบุที่อยู่ปลายทาง", + "yinbi.missing.amount": "ไม่ได้ระบุจำนวน", + "yinbi.missing.email": "ไม่ได้ระบุที่อยู่อีเมล", + "yinbi.missing.username": "ไม่ได้ระบุชื่อผู้ใช้", + "yinbi.missing.password": "ไม่ได้ระบุรหัสผ่าน", + "yinbi.invalid.address": "{{destination}} ไม่ใช่ที่อยู่ Stellar ที่ถูกต้อง", + "yinbi.send": "ส่ง", + "yinbi.to": "ถึง:", + "yinbi.try_again": "ลองใหม่อีกครั้ง?", + "yinbi.success.transaction": "ทำธุรกรรมสำเร็จ!", + "yinbi.failure.transaction": "การทำธุรกรรมล้มเหลว", + "yinbi.confirm.transaction": "ยืนยันการทำธุรกรรม", + "yinbi.sent.details": "คุณส่ง {{amount}} YNB ไปยัง {{destination}} แล้ว", + "yinbi.sent.failure.details": "การทำธุรกรรมของคุณล้มเหลวเนื่องจากสาเหตุต่อไปนี้:", + "yinbi.recipient": "ผู้รับ", + "yinbi.available.send": "คุณมี {{balance}} YNB ที่ส่งได้", + "yinbi.wallet.header": "กระเป๋าสตางค์", + "yinbi.send.header": "ส่ง Yinbi", + "yinbi.recovery.phrase": "วลีในการกู้คืนของ Yinbi", + "yinbi.recover.account": "ป้อนหรือวางวลีในการกู้คืนของ Yinbi เพื่อกู้คืนกระเป๋าสตางค์ Yinbi และบัญชี Lantern ของคุณ", + "yinbi.recovery.desc": "ใช้วิธีนี้หากคุณต้องการลงชื่อเข้าใช้กระเป๋าสตางค์ Yinbi ที่อยู่นอกเหนือบัญชี Lantern ของคุณ", + "yinbi.redeem.codes": "แลกรหัส Yinbi จำนวนมาก", + "yinbi.obtain.codes": "สามารถรับรหัสแลกรับ Yinbi จำนวนมากได้จาก reseller.lantern.io", + "yinbi.receive.header": "รับ Yinbi", + "yinbi.this.is.your.wallet": "นี่คือที่อยู่กระเป๋าสตางค์ Yinbi ของคุณที่ผู้อื่นสามารถใช้สำหรับส่ง YNB ให้คุณได้", + "yinbi.your.address": "ที่อยู่ของคุณ", + "yinbi.no.activity.header": "ไม่มีกิจกรรม", + "yinbi.upgrade.pro.button": "อัปเกรดเป็น Pro และรับ Yinbi ฟรี", + "yinbi.renew.pro.button": "ต่ออายุ Pro และรับ Yinbi ฟรี", + "yinbi.wallet.activity_header": "กิจกรรม", + "yinbi.wallet.send": "ส่ง", + "yinbi.wallet.receive": "รับ", + "yinbi.wallet.balance": "ยอดคงเหลือ", + "yinbi.wallet.getlantern.pro": "รับ Lantern Pro + Yinbi ฟรี", + "yinbi.redemption.codes": "รหัสแลกรับ Yinbi", + "redeem_codes.title": "แลกรหัส Yinbi", + "redeem_codes.redeem_button_text": "แลก", + "redeem_codes.cancel_button_text": "ยกเลิก", + "redeem_codes.success": "สำเร็จ", + "redeem_codes.errors.missing_codes": "ไม่ได้ป้อนรหัสที่ถูกต้อง", + "redeem_codes.errors.invalid_codes": "เกิดข้อผิดพลาด โปรดตรวจสอบรหัสที่ไฮไลต์ ส่วนรหัสที่ถูกขีดฆ่าจะหมดอายุและไม่สามารถนำมาแลกได้อีก", + "yinbi.new.account.text": "เมื่อคุณส่งหรือรับ Yinbi การทำธุรกรรมของคุณจะปรากฏที่นี่", + "yinbi.createAccount": "สร้างบัญชี", + "yinbi.confirm.account.text": "เพื่อให้แน่ใจว่าคุณใส่วลีถูกต้อง โปรดป้อนคำจากวลีในการกู้คืนของคุณต่อไปนี้", + "create_account.invalid_words.error": "คำที่ป้อนไม่ตรงกับรหัสผ่านที่เป็นวลีสำหรับใช้ในการกู้คืน", + "yinbi.recovery_text": "นี่คือวลีในการกู้คืนกระเป๋าสตางค์ Yinbi ของคุณ ซึ่งเป็นวิธีเดียวที่จะกู้คืนกระเป๋าสตางค์ Yinbi ของคุณได้\nในกรณีที่ลืมรหัสผ่าน ใช้โปรแกรมจัดการรหัสผ่านหรือจดรหัสผ่านเอาไว้เมื่อ\nจัดเก็บวลีนี้", + "yinbi.recovery_confirm_text": "นี่คือวลีในการกู้คืนกระเป๋าสตางค์ Yinbi ของคุณ ซึ่งเป็นวิธีเดียวที่จะกู้คืนกระเป๋าสตางค์ Yinbi ของคุณได้ในกรณีที่ลืมรหัสผ่าน ใช้โปรแกรมจัดการรหัสผ่านหรือจดรหัสผ่านเอาไว้เมื่อจัดเก็บวลีนี้", + "yinbi.import.wallet": "นำเข้ากระเป๋าสตางค์", + "yinbi.setup.wallet": "ตั้งค่ากระเป๋าสตางค์", + "yinbi.importWallet": "นำเข้ากระเป๋าสตางค์ Yin.bi", + "yinbi.import.wallet.continue": "ดำเนินการไปยังกระเป๋าสตางค์ของคุณต่อ", + "yinbi.import.wallet.success": "นำเข้ากระเป๋าสตางค์สำเร็จ!", + "yinbi.wallet.text": "คุณสามารถเข้าถึงกระเป๋าสตางค์ Yinbi ของคุณได้โดยการสร้างบัญชี ลงชื่อเข้าใช้ หรือ\nนำเข้ากระเป๋าสตางค์ของคุณจาก Yin.bi หากคุณเคยลงทะเบียนใช้งานใน\nเว็บไซต์ Yin.bi แล้ว", + "yinbi.wallet.pro.text": "หากต้องการเข้าถึงกระเป๋าสตางค์ Yinbi คุณสามารถสร้างบัญชีแล้วนำเข้ากระเป๋าสตางค์ของคุณจาก Yin.bi ได้หากคุณเคยลงทะเบียนใช้งานไว้แล้ว", + "yinbi.recovery_subheader": "วลีในการกู้คืนกระเป๋าสตางค์ Yinbi", + "yinbi.import_wallet.subheader": "นำเข้ากระเป๋าสตางค์ Yinbi", + "yinbi.import_wallet.text": "ลงชื่อเข้าใช้ด้วยข้อมูลประจำตัว Yin.bi ของคุณเพื่อโอนกระเป๋าสตางค์ไปยัง Lantern", + "yinbi.import_wallet.success": "นำเข้ากระเป๋าสตางค์ของคุณสำเร็จแล้ว โปรดเพิ่มอีเมลของคุณเพื่อลงทะเบียนบัญชีให้สมบูรณ์", + "yinbi.import_wallet.success_subheader": "นำเข้าสำเร็จ!", + "yinbi.import_wallet.button": "นำเข้ากระเป๋าสตางค์ Yin.bi", + "yinbi.import_wallet.success_button": "ลงทะเบียนให้สมบูรณ์", + "yinbi.recovery_passphrase.label_text": "วลีในการกู้คืน", + "yinbi.recovery_passphrase.copy_button_text": "คัดลอก", + "terms_of_service.notice": "หมายเหตุ", + "terms_of_service.i_agree": "ฉันยอมรับ", + "platinum": "Platinum", + "platinum.one_year": "ราคาต่อ 1 ปี", + "platinum.two_years": "ราคาต่อ 2 ปี", + "platinum.save": "ประหยัดได้ถึง {{savings}}% !", + "platinum.unlimited": "ข้อมูลไม่จำกัด", + "platinum.logs": "ไม่มีบันทึก", + "platinum.devices": "เชื่อมต่ออุปกรณ์ได้สูงสุด 3 เครื่อง", + "platinum.everything_in_pro": "ทุกอย่างรวมอยู่ใน Pro แล้ว", + "platinum.faster_data": "ศูนย์ข้อมูลที่เร็วขึ้น", + "platinum.dedicated": "ช่องทางเฉพาะ", + "platinum.reliability": "เพิ่มความน่าเชื่อถือ", + "platinum.platinum_one_year": "Lantern Platinum 1 ปี", + "platinum.platinum_two_years": "Lantern Platinum 2 ปี", + "platinum.pro_one_year": "Lantern Pro 1 ปี", + "platinum.pro_two_years": "Lantern Pro 2 ปี", + "platinum.total": "รวม", + "platinum.free": "ฟรี", + "platinum.credit.days": "+ {{ days }} วัน", + "platinum.credit.months": "{{ months }} เดือน", + "platinum.upgrade": "อัปเกรดเป็น Platinum", + "platinum.upgrade_details": "ช่องทางเฉพาะ + ศูนย์ข้อมูลที่เร็วที่สุด!", + "platinum.unused_time_disclaimer": "ผู้ใช้ Pro ที่อัปเกรดเป็น Platinum จะเห็นการเปลี่ยนแปลงการสมัครสมาชิก Pro ระบุตามเวลาที่เพิ่มขึ้นมาด้านบน", + "p2p.opt_in_description": "ใช้อินเทอร์เน็ตเพื่อช่วยเหลือผู้คนให้เข้าถึงอินเทอร์เน็ตได้โดยที่ไม่ถูกเซ็นเซอร์", + "p2p.active_sharing_description": "การแชร์อินเทอร์เน็ตของคุณเปิดอยู่", + "p2p.dialog.title": "แชร์การเข้าถึงอินเทอร์เน็ต", + "p2p.dialog.text.1": "ช่วยเหลือผู้ที่เข้าถึงอินเทอร์เน็ตได้จำกัดโดยการแชร์สัญญาณของคุณ คุณจะเป็นส่วนหนึ่งของเครือข่ายอาสาที่ทำให้อินเทอร์เน็ตเปิดกว้างขึ้น ผ่านการอนุญาตให้เข้าถึงอินเทอร์เน็ตของคุณ", + "p2p.dialog.text.2": "การแชร์จะไม่กระทบต่อตัวตนหรือความปลอดภัยของคุณ คุณสามารถหยุดการแชร์อินเทอร์เน็ตเมื่อไหร่ก็ได้ที่ต้องการ", + "p2p.dialog.yes_button": "ได้ เริ่มการแชร์", + "p2p.dialog.no_button": "ยกเลิก", + "p2p.banner.introducing": "การแนะนำ", + "top_sites.top_sites": "ไซต์ยอดนิยม" +} \ No newline at end of file diff --git a/locale/translation/tk.json b/locale/translation/tk.json new file mode 100644 index 000000000..59cc830d4 --- /dev/null +++ b/locale/translation/tk.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Quit Lantern" +} \ No newline at end of file diff --git a/locale/translation/tr.json b/locale/translation/tr.json new file mode 100644 index 000000000..99da1f199 --- /dev/null +++ b/locale/translation/tr.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Durum: %v", + "TRAY_CONNECT": "Bağlan", + "TRAY_DISCONNECT": "Bağlantıyı kes", + "TRAY_SHOW": "Şunu göster: %s", + "TRAY_UPGRADE_TO_PRO": "Pro'ya Yükselt", + "TRAY_QUIT": "Şuradan çık: %s", + "BACKEND_DATA_TITLE": "Artık yüksek hızlı %s verisi yok", + "BACKEND_DATA_MESSAGE": "%s uygulamasını tam hızda kullanmaya devam etmek için lütfen Pro'ya yükseltin!", + "BACKEND_DATA_PERCENT_TITLE": "%s verinizin %s kadarına ulaşıldı", + "BACKEND_DATA_PERCENT_MESSAGE": "%s yüksek hızlı verinizin %s kadarını kullandınız. Şimdi yükseltin!", + "BACKEND_CLICK_LABEL": "Aç", + "BACKEND_CLICK_LABEL_OPEN": "Aç", + "BACKEND_CLICK_LABEL_HELP": "Yardım", + "BACKEND_CLICK_LABEL_GOT_IT": "Tamam", + "BACKEND_AUTOUPDATED_TITLE": "%s uygulamasını %s sürümüne güncelle", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s indirildi. Kullanmak için lütfen %s uygulamasını yeniden başlatın.", + "BACKEND_MITM_INSTALL_CERT": "%s performansı artırmak için özel bir sertifika yüklemek istiyor", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Lütfen sisteminizde değişiklik yapması için %v'a izin verin", + "BACKEND_ALERT_TITLE": "Kritik uyarıya dikkat etmeniz gereklidir", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s tanılama araçları yüklemek için izninize ihtiyaç duyar. Bu, %s deneyiminizi geliştirmemize yardımcı olacaktır.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Yapılandırma kaydedilemiyor", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Uygulama yapılandırması kaydedilemiyor. %s trafiğin doğru şekilde proxy'leneceğini garanti edemez.", + "about.content": "Lantern açık internete hızlı, güvenilir ve güvenli erişim sağlayan ücretsiz bir uygulamadır.", + "app.error": "Bir sorun oluştu!", + "about.faq": "Lantern SSS'lerini okuyun", + "about.open": "Herkes için Açık İnternet", + "about.questions": "Sorular?", + "about.title": "Hakkında", + "account.add.password": "Hesap Parolası Ekle", + "account.agree.terms": "Parolamı kaybetmenin hesap erişimini kaydetmek\nanlamına geldiğini anlıyorum. Lantern parolanızı \nkurtarmanıza yardımcı olamaz.", + "account.agree.terms.error": "Önce şartlar kabul edilmelidir", + "account.cancel": "Pro Hesabını İptal Et", + "account.created": "Hesap Oluşturuldu!", + "account.create.pro.account.header": "Pro Hesabı Oluştur", + "account.create.pro.account.text": "Lantern kullanıcı hesaplarının ele alınma biçimini değiştiriyor. Bundan sonra Pro kullanıcılarının bir kullanıcı adı ve parola oluşturması gerekecektir. Bu kimlik bilgileri diğer cihazlarda giriş yapmak ve yeni özelliklere erişim sağlamak için kullanılacaktır.", + "account.have.a.account": "Bir Hesabınız var mı?", + "account.link.username.pro": "Kullanıcı adını Pro Hesabına bağla", + "account.recovery": "Hesap Kurtarma", + "account.recovery.link.device": "Cihaz Bağla", + "account.recovery.device.code": "Cihaz Bağlama Kodu", + "account.recovery.device.enter.code": "Cihaz Bağlama Pini Gir veya Yapıştır", + "account.recovery.device.instructions.header": "Bu cihazı Pro hesabınızla bağlamak için:", + "account.recovery.device.instructions.step.one": "1. Masaüstü Pro cihazınızdaki Hesap Yönetimi ekran öğesinden veya Mobil Pro Cihazınızdaki menüden \"Cihaz Bağla\" seçeneğini seçin.", + "account.recovery.device.instructions.step.two": "2. Cihaz bağlama kodunu girin ve gönderin.", + "account.recovery.device.instructions.part.three": "*Her iki cihazın da Lantern'ın en son sürümünü çalıştırdığından emin olun", + "account.recovery.method": "Lütfen hesabınızı kurtarmak için bir yöntem seçin", + "account.recovery.send.email": "E-posta Gönder", + "account.recovery.submit": "Gönder", + "account.recovery.success": "Bağlantı Başarılı!", + "account.pro_management": "Pro Hesap Yönetimi", + "account.free_management": "Hesap Yönetimi", + "account.free.cap": "{{mb}} MB ücretsiz veri kaldı. Sıfırlama: {{reset}}", + "account.free.cap.upgrade": "Sınırsız yüksek hızlı veri için Pro'ya yükseltin", + "account.freelink.validFor": "geçerlilik: %s", + "account.freelink.desc": "Bu cihazın Pro hesabınızı kullanmasına izin vermek için:", + "account.freelink.step1": "1. Pro Cihazınızdaki Menü'den \"Cihaz Bağla\" seçeneğini seçin", + "account.freelink.step2": "2. Cihaz bağlama kodunu girin ve gönderin.", + "account.freelink.reminder": "* Her iki cihazın da Lantern'ın en son sürümünü çalıştırdığından emin olun", + "account.freelink.errorTitle": "Bağlama Hatası", + "account.freelink.errorText": "Pro cihazınızdaki kodu doğru girdiğinizden emin misiniz?", + "account.freelink.headerDesc": "Bu cihazı Pro hesabınızla bağlayın", + "account.freelink.title": "Cihaz Bağlama Kodu", + "account.pro.charge": "Ödeme döneminin sonunda Lantern Pro için hesabınızdan bir yıl daha otomatik ödeme alınacak.", + "account.upgrade_pro": "Pro'ya Yükselt", + "account.upgrade": "Yükselt", + "account.upgrade_platinum": "Platinum'a Yükselt", + "account.create": "Hesap Oluştur", + "account.email": "E-posta", + "account.confirm.password": "Parolayı Onayla", + "account.password": "Şifre", + "account.pro.email": "E-posta:", + "account.pro.expiration": "Pro Hesap Süre Dolumu", + "account.platinum.expiration": "Platinum Hesabı Süre Dolumu", + "account.pro.expired": "Pro hesabımızın süresi doldu. Sınırsız aylık veri için şimdi yenileyin.", + "account.pro.expiry": "Pro hesabınızın süresi %s günde %siçinde sona eriyor.", + "account.pro.bonusMonths": "Buna {{bonusMonths}} bonus ay da dahildir!", + "account.pro.thisdevice": "(Bu cihaz)", + "account.pro.logout": "Oturumu kapat", + "account.pro.removedevice": "KALDIR", + "account.pro.devices": "Lantern Pro Cihazları (en fazla 3)", + "account.pro.device.confirm.title": "Cihazın Yetkisini Kaldır", + "account.pro.device.confirm": "'{{device}}' cihazını Lantern Pro hesabınızdan çıkarmak istediğinize emin misiniz?", + "account.pro.device.one.title": "Tek Bir Cihaz", + "account.pro.device.one": "Özür dileriz, ancak en son onayladığınız cihazı kaldıramazsınız.", + "account.pro.linkingcode": "Cihaz Bağlama Kodu:", + "account.pro.renew": "Pro Hesabını Yenile", + "account.platinum.renew": "Platinum Hesabı Yenile", + "account.pro.renew_CN": "Yenile", + "account.prolink.errorTitle": "Bağlama HatasıBağlama Hatası", + "account.prolink.errorText": "Pro cihazınızdaki kodu doğru kopyaladığınızdan emin misiniz?", + "account.prolink.successTitle": "Cihaz Bağlandı", + "account.prolink.successText": "Cihazınızı başarıyla bağladınız! Lütfen diğer cihazınızın pro olması için bir süre bekleyin.", + "account.signin": "Giriş", + "account.signout": "Oturumu Kapat", + "account.submit": "Gönder", + "account.username": "Kullanıcı adı", + "account.switch.to.register": "Hesap Oluşturmaya Geç", + "account.switch.to.signin": "Giriş Yapmaya Geç", + "account.invalid.username": "Kullanıcı adı geçersiz", + "account.invalid.email": "E-posta geçersiz", + "account.password.mismatch": "Onay Parolası, parolayla eşleşmiyor", + "account.password.short": "Parola çok kısa", + "account.password.lowercase": "Parola en az bir küçük harf içermelidir", + "account.password.uppercase": "Parola en az bir büyük harf içermelidir", + "account.password.number": "Parola en az bir rakam içermelidir", + "account.password.compromised": "Parola bir riskli parolalar listesinde yer alıyor", + "modal.register.free.header": "Yinbi Cüzdan'a erişmek için Kaydolun veya Oturum açın", + "modal.register.pro.header": "Yinbi Cüzdan'a erişmek için hesap parolası ekleyin", + "modal.register.pro.signin.header": "Yinbi Cüzdanına erişmek için giriş yapın", + "modal.register.free.text": "Yinbi Cüzdan'ı kullanmak için bir Lantern Hesabınız olmalıdır, lütfen Kaydolun veya\ndevam etmek için Oturum açın.", + "modal.register.pro.text": "Yinbi cüzdanını kullanmak için Lantern hesabınıza bir parola eklemeniz gerekir.", + "modal.register.pro.signin.text": "Yinbi cüzdanını kullanmak için Lantern hesabınıza giriş yapmanız gerekir.", + "adyen.paymentMethods.title": "Ödeme Yöntemleri", + "adyen.paymentMethods.storedMethods": "Ödeme Yöntemleriniz", + "adyen.paymentMethods.otherMethods": "Ödeme yöntemi seçin", + "adyen.paymentMethods.moreMethodsButton": "Daha fazla ödeme yöntemi", + "adyen.payButton": "Öde", + "adyen.payButton.formatted": "%@ öde", + "adyen.cancelButton": "İptal", + "adyen.dismissButton": "TAMAM", + "adyen.storeDetails": "Bir sonraki ödemem için kaydet", + "adyen.payment.redirecting": "Yönlendirileceksiniz", + "adyen.payment.processing": "Ödemeniz işleniyor", + "adyen.creditCard.title": "Kart Detayları", + "adyen.creditCard.holderName": "Kart sahibinin adı", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Kart Numarası", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Geçersiz kart numarası", + "adyen.creditCard.expiryDateField.title": "Son kullanma tarihi", + "adyen.creditCard.expiryDateField.placeholder": "AA/YY", + "adyen.creditCard.expiryDateField.invalid": "Geçersiz son kullanma tarihi", + "adyen.creditCard.expiryDateField.month": "Ay", + "adyen.creditCard.expiryDateField.month.placeholder": "AA", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Yıl", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Taksit Sayısı", + "adyen.creditCard.storeDetailsButton": "Bir sonraki ödemem için bu kartı hatırla", + "adyen.creditCard.oneClickVerification.title": "Kartınızı doğrulayın", + "adyen.creditCard.oneClickVerification.message": "Lütfen %@ için CVC kodunu girin", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Geçersiz CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Devam etmek için lütfen geçerli bir CVC girin.", + "adyen.sepaDirectDebit.ibanField.title": "Hesap Numarası (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Geçersiz hesap numarası", + "adyen.sepaDirectDebit.nameField.title": "Sahibinin adı", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Aşağıdaki tutarın banka hesabımdan çekileceğini kabul ediyorum.", + "adyen.sepa.ownerName": "Sahibinin adı", + "adyen.sepa.ibanNumber": "Hesap Numarası (IBAN)", + "adyen.giropay.searchField.placeholder": "Banka adı / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "En az 3 karakter", + "adyen.giropay.noResults": "Hiçbir arama sonucu bulunamadı", + "adyen.error.title": "Hata", + "adyen.error.subtitle.redirect": "Yönlendirme başarısız oldu", + "adyen.error.subtitle.payment": "Ödeme başarısız oldu", + "adyen.error.subtitle.refused": "Ödeme reddedildi", + "adyen.error.message.unknown": "Bilinmeyen bir hata oluştu", + "adyen.error.message.cannotConnectToInternet": "İnternete bağlanılamadı: lütfen internet bağlantınızı kontrol edin.", + "adyen.error.message.cannotConnectToHost": "Ödeme sunucumuza bağlanılamadı.", + "adyen.error.retryButton": "Tekrar dene", + "adyen.idealIssuer.selectField.title": "Banka", + "adyen.idealIssuer.selectField.placeholder": "Bankanızı seçin", + "adyen.creditCard.success": "Ödeme başarılı", + "adyen.oneClick.confirmationAlert.title": "%@ ödemesini Onaylayın", + "adyen.redirect.cannotOpenApp.title": "Uygulama açılamıyor", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Bu cihazda kurulu olmadığı için bu uygulama açılamadı.", + "adyen.holderName": "Kart sahibinin adı", + "adyen.countryCode": "Ülke Kodu", + "adyen.telephone.number": "Telefon numarası", + "android.download": "Lantern Android", + "android.download.title": "Lantern Android'i İndir", + "authorize.title": "Cihazı Pro Hesabına Dahil Et", + "authorize.step1.have_pro_device": "Başka bir Lantern Pro cihazım var", + "authorize.step1.link": "Cihaz Bağlama", + "authorize.step1.email_linking": "E-posta Bağlama", + "authorize.device_linking_explanation": "Başka bir cihazda oturum açtıysanız ve yanınızdaysa bu yöntemi kullanın", + "authorize.device_email_explanation": "E-postanıza Cihaz bağlama pini gönderilmesini istiyorsanız bu yöntemi kullanın", + "authorize.link_device": "Cihaz Bağla", + "authorize.step1.choose": "Lütfen hesabınızı Bağlamak için bir yöntem seçin", + "authorize.step1.or": "veya", + "authorize.step1.recover": "Lantern Pro hesabımı kurtarmam gerekiyor", + "authorize.step1.start": "kurtarmayı başlat", + "authorize.step1.no_mail": "E-posta adresinizi unuttunuz mu?", + "authorize.step1.description": "E-postanızı girin, hesap varsa cihaz bağlantı kodu içeren bir e-posta göndereceğiz", + "authorize.step2b.enter_code": "Hesap Kurtarma Kodunuzu girin", + "authorize.step2b.code": "Hesap Kurtarma Kodu", + "authorize.step2b.instruction": "Bu hesap varsa, kurtarma kodu içeren bir e-posta şuraya gönderildi: {{email}}. Bu e-postanın gelmesi birkaç saat sürebilir. Bulamazsanız lütfen spam klasörünüzü kontrol edin.", + "authorize.step2b.no_mail": "E-posta gelmedi", + "authorize.step3.recovery": "Hesap Kurtarma", + "authorize.step3.no_email": "Eyvah! Bu e-posta adresini bulmakta sorun yaşıyoruz. Lütfen hesabınızı bulabilmemiz için aşağıdaki alana bilgilerinizi girin.", + "authorize.step3.no_code_received": "Hala kurtarma e-postası gelmedi mi? Aşağıya bilgilerinizi girin ve biz siz ile 48 saat içinde sizinle iletişime geçeceğiz.", + "authorize.step3.your_email": "E-postanız", + "authorize.step3.payment_method": "Ödeme Yöntemi", + "authorize.step3.payment_method_hint": "Pro'yu satın alma yönteminizi seçin", + "authorize.step3.credit_card": "Kredi Kartı", + "authorize.step3.alipay": "Alipay", + "authorize.step3.android_pay": "Android Ödeme", + "authorize.step3.by_referral": "Bir arkadaş kaynak gösterilerek Pro alındı", + "authorize.step3.payment_account": "Ödeme hesabı", + "authorize.step3.payment_account_hint": "Alipay hesap bilgilerinizi girin", + "authorize.step3.referral_code": "Referans Kodunuz", + "authorize.step3.purchase_date": "Satın Alma Tarihi", + "authorize.step3.note": "Diğer bilgiler hesabınızı bulmamızda yardımcı olabilir.", + "authorize.step4.title": "Hesap kurtarma işlemi sürüyor", + "authorize.step4.text1": "Teşekkürler! Hesap kurtarma isteğinizi aldık.", + "authorize.step4.text2": "Lütfen Pro hesabınızın bilgilerini geri almanız için 48 saat izin verin.", + "authorize.step4.text3": "Önceki sayfadaki girilmiş e-postaya bilgilerinizi göndereceğiz.", + "authorized.continue": "Pro'ya Devam Et", + "authorized.continue.lantern": "Lantern'e Devam Et", + "authorized.text": "Bu cihaz artık Lantern Pro hesabınızı kullanmak üzere yetkilendirildi!", + "authorized.title": "Cihaz Yetkilendirildi", + "button.account": "Hesap", + "button.renew": "Yenile", + "button.upgrade": "Yükselt", + "button.upgrade_now": "Şimdi Yükselt", + "button.upgrade_to_lantern_pro": "Lantern Pro'ya Yükseltin", + "button.copy_your_code": "Kodu kopyala", + "button.try_again": "Tekrar dene", + "button.continue": "Devam et", + "button.continue_to": "{{planType}} ile devam et", + "bullet.click_button": "Aşağıdaki düğmeye tıklayın", + "bullet.paste_code": "Mesajdaki kod ve indirme bağlantısını yapıştırın", + "bullet.send_to_friends": "Arkadaşlarınıza gönderin", + "cancel": "İptal", + "confirm": "Onayla", + "norecoveryyinbi": "*Yinbi Cüzdan'ı kurtarmaz", + "email.recovery.check.email": "Kurtarma Kodu içeren bir mesaj için e-postanızı kontrol edin", + "email.recovery.code.label": "Kurtarma Kodunu Gir veya Yapıştır", + "email.recovery.no.code": "Kod gelmedi mi?", + "email.recovery.text": "E-postanızı girdiğinizde size parolanızı sıfırlamanız için bir kod göndereceğiz.\nYinbi Cüzdanınız varsa, bu işlem Yinbi cüzdanınızı KURTARMAYACAKTIR. Yinbi Cüzdanınızı kurtarmak için Yinbi Kurtarma İfadenizi girin.", + "email.recovery.desc": "E-postanıza bir kurtarma kodu gönderilmesini istiyorsanız bu yöntemi kullanın", + "device.recovery.desc": "Başka bir cihazda oturum açtıysanız ve yanınızdaysa bu yöntemi kullanın", + "google_search": "Google Arama", + "giveaway.upgrade": "Bugünün ücretsiz dağıtımını almak için yükseltin", + "giveaway.title_released_today": "{{formattedTokens}} YNB bugün piyasaya sürülüyor", + "giveaway.what_is_it": "Yinbi Ödülü nedir?", + "giveaway.description1": "Yinbi Vakfı, yalnızca Lantern üzerinden 888 milyar YNB kripto parayı Lantern Pro alıcılarına dağıtıyor.", + "giveaway.description2": "YNB her günün sonunda, o gün piyasaya sürülen Yinbi miktarına, yükseltme/yenileme yapan kişi sayısına ve satın aldığınız yıl veya hesap sayısına bağlı olarak dağıtılacaktır. YNB doğrudan Lantern'deki Yinbi Cüzdanınıza aktarılacaktır.", + "giveaway.learn_more": "Daha Fazla Bilgi Edinin", + "link_device": "Zaten bir Pro hesabınız var mı? Cihazı bağlayın", + "email.recovery": "E-posta Kurtarma", + "email_taken": "E-posta zaten kayıtlı", + "username_taken": "Kullanıcı adı zaten kayıtlı", + "err.unknown_error": "Bilinmeyen hata", + "err.internal_error": "Dahili hata", + "err.bad_input": "Geçersiz girdi", + "err.not_authorized": "Not authorized", + "err.user_exists": "Kullanıcı mevcut", + "err.no_such_user": "Böyle bir kullanıcı yok", + "err.user_already_verified": "Kullanıcı zaten onaylandı", + "err.invalid_user_verification": "Geçersiz kullanıcı doğrulaması", + "err.user_unverified": "Kullanıcı Doğrulanmamış", + "err.operation_temporarily_unavailable": "İşlem geçici olarak kullanılamıyor", + "err.wrong_or_inexistent_plan": "Hatalı veya mevcut olmayan plan", + "err.user_has_active_subscription": "Kullanıcının etkin aboneliği var", + "err.payment_error": "Ödeme hatası", + "err.no_codes_left": "Hiç referans kodu kalmadı", + "err.wrong_code": "Hatalı referans kodu", + "err.redeeming_own_code_not_allowed": "Kendi kodlarınızı kullanmaya izin verilmiyor", + "err.wrong_charge_id": "Hatalı ödeme kimliği", + "err.wrong_link_code": "Yanlış bağlantı kodu", + "err.invalid_credentials": "Sağlanan kullanıcı kimlik bilgileri geçersizdi", + "footer.reseller": "Para kazanın! Bir Lantern Pro satıcısı olun. Buraya Tıklayın", + "footer.reseller.email_subject": "Lantern Ticareti Programı hakkında bilgi verin!", + "footer.reseller.email_body": "Bir Lantern Satıcısı olunca, bir Lantern Pro aboneliğinin her satışı üzerine 25% o lik bir ödeme yapma şansına sahip olursunuz. Aşağıda neden bir bayi olmak istiyorsanız neden biraz bilgi verin.", + "feature.faster_speed": "Daha Yüksek Hız", + "feature.faster": "Daha Hızlı Veri Merkezleri", + "feature.unlimited": "Sınırsız Veri", + "feature.nologs": "Günlük Yok", + "feature.devices": "3 cihaza kadar bağlayın", + "feature.noads": "Reklamsız", + "feature.yinbi.tooltip": "Yinbi vakfı, yalnızca Lantern üzerinden 888 milyar YNB kripto parayı Lantern Pro alıcılarına dağıtıyor. YNB her günün sonunda, o gün piyasaya sürülen Yinbi miktarına, yükseltme/yenileme yapan kişi sayısına ve satın aldığınız yıl veya hesap sayısına bağlı olarak dağıtılacaktır. YNB, doğrudan Lantern'deki Yinbi Cüzdanınıza aktarılacaktır!", + "feature.antiblock": "Engellemeye Dayanıklı", + "feature.data_center": "Daha İyi Veri Merkezleri", + "feature.free_yinbi": "Ücretsiz Yinbi Kripto Para!", + "free.title": "Lantern Pro", + "free.desc": "Daha hızlı. Daha güçlü. Sınırsız. Güvenli.", + "free.link_account": "Zaten bir Pro hesabınız var mı? Cihazınızı bağlayın", + "home.get_lantern_pro": "Lantern Pro'ya Geçin", + "home.get_lantern_platinum": "Planınızı yükseltin", + "home.welcome_popup_subheader": "Yeni Lantern'e hoş geldiniz!", + "home.welcome_popup_content_1": "Lantern'i güncelleyip yeni özellikler ekleyerek çok sıkı çalıştık.", + "home.welcome_popup_content_2": "Yeni kullanıcı arayüzümüzde Lantern ağında paylaşılan dosyaları aramanıza izin veren bir arama çubuğu bulacaksınız. Aynı zamanda kendiniz de bir dosya yayınlayarak katkıda bulunabilirsiniz. Bu bir Beta özelliğidir, dolayısıyla bunu deneyip bize ne düşündüğünüzü bildirirseniz geribildiriminize dayalı olarak iyileştirmeler yapmaya devam edebiliriz.", + "home.welcome_popup_button": "Bunu deneyin", + "input.email": "E-posta", + "input.your_email": "E-posta adresiniz", + "input.confirm_email": "E-posta Adresini Doğrula", + "input.enter_email": "E-posta adresinizi girin:", + "input.use_valid_email": "Geçerli bir e-posta adresi girin", + "input.email_not_match": "E-posta alanları eşleşmiyor", + "input.existing_email": "Mevcut e-posta", + "issue.your_email": "E-postanız", + "issue.attach_image_failure": "Görüntü eklenemiyor", + "issue.try_again": "Lütfen tekrar deneyin", + "issue.select_issue": "Bir hata seçiniz", + "issue.selected_issue": "Sorun Seçin", + "issue.select_issue_hint": "Açılır menüden bir konu seçin", + "issue.note": "Sorununuzu Açıklayın", + "issue.description": "Sorun Açıklaması", + "issue.error": "Hata raporlama sorunu", + "issue.submit": "Rapor Gönder", + "issue.report_screenshot": "Görüntüyü sürükleyin veya ekran görüntüsü yüklemek için tıklayın", + "issue.reported": "Sorununuzu bildirdiğiniz için teşekkür ederiz, mümkün olan en kısa sürede e-posta yoluyla size geri dönüş yapacağız", + "issue.report_sent": "Rapor Gönderildi", + "issue.type.no_access": "Engellenen sitelere erişilemiyor", + "issue.type.payment_fail": "Ödeme tamamlanamadı", + "issue.type.cannot_login": "Giriş yapılamıyor", + "issue.type.always_spinning": "Yükleme topaçı durmadan dönüyor", + "issue.type.slow": "Yavaş", + "issue.type.cannot_link_device": "Cihazlar ilişkilendirilemiyor", + "issue.type.crashes": "Lantern çöküyor", + "issue.type.other": "Diğer", + "languages.title": "Diller", + "lantern.email": "Lantern E-posta", + "mobile.link": "Lantern'i Android cihazınıza indirmek için bu bağlantıyı kullanın:", + "mobile.title": "Android Sürümünü Alın", + "nav.about": "Hakkında", + "nav.account": "Hesap Yönetimi", + "nav.authorize": "Hesap Ekle", + "nav.authorized": "Cihaz Yetkilendirildi", + "nav.unauthorized_link": "Cihazı Pro Hesabına Dahil Et", + "nav.language": "Dil", + "nav.lantern": "Lantern", + "nav.mobile": "Mobil Sürümünü Edin", + "nav.report_issue": "Hata Bildir", + "nav.settings": "Ayarlar", + "nav.support": "Destek", + "nav.verify": "Hesap Doğrulama", + "nav.yinbi": "Yinbi Kullanımı", + "nav.home": "Anasayfa", + "nav.discover": "Keşfet", + "nav.wallet": "Cüzdan", + "nav.yinbi_wallet": "Yinbi Cüzdan", + "notification.retry": "Tekrar Dene", + "notifications": "Bildirimler", + "notifications.whatisnew": "Yenilikler Nelerdir?", + "password.change": "Parolayı Değiştir", + "password.changed": "Parola Değiştirildi", + "continue.to.pro": "Pro'ya Devam Et", + "username": "Kullanıcı adı", + "password.new": "Yeni Parola", + "password.requirements": "
Parola aşağıdakileri içermelidir:
  • 8 veya daha fazla karakter
  • 1 küçük harf
  • 1 büyük harf
  • En az 1 rakam
  • Riskli parolalar listesinde olmamalıdır
", + "password.reset": "Parolayı Sıfırla", + "paxful.buy": "Satın Al", + "paxful.payment": "Ödeme metodu", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Çevrimiçi Cüzdanlar", + "paxful.bank": "Banka Havaleleri", + "paxful.gamer_card": "Oyun Kartları", + "paxful.gift_card": "Hediye Kartları", + "paxful.cash": "Nakit Ödeme", + "paxful.digital_currency": "Dijital Para Birimleri", + "paxful.button": "En İyi Fırsatları Göster", + "payment.close": "Kapat", + "payment.redirectErrorTitle": "Ödeme sunucusuna bağlanılırken hata oluştu", + "payment.redirectErrorText": "Şu anda bu sorunu çözmeye çalışıyoruz. Lütfen daha sonra tekrar kontrol edin.", + "payment.wait_for_pro": "Lantern Pro'yu satın aldığınız için teşekkürler! Lantern'in otomatik olarak Pro sürümüne geçmesi için lütfen biraz bekleyin.", + "payment.moreOptions": "Daha Fazla Seçenek", + "payment.fewerOptions": "Daha Az Seçenek", + "payment_methods.select_name": "Ödeme yöntemi seçin", + "payment_methods.alipay": "Kredi Kartı/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Lantern Pro'yu satın almak için", + "payment_methods.shetab.details.body": "Satın almaya devam et öğesine tıkladığınızda, ödemeyi tamamlamak ve aktivasyon kodunuzu almak için harici bir siteye yönlendirilirsiniz.", + "payment_methods.shetab.details.tutorial_header": "(Farsi Eğitimi)", + "payment_methods.shetab.details.purchase_voucher_button": "Satın Almaya Devam Et", + "payment_methods.shetab.details.input_code_button": "Giriş Aktivasyon Kodu", + "plan.step1": "Adım 1", + "plan.apply": "Uygula", + "plan.step2": "Adım 2", + "plan.most_popular": "En Popüler!", + "plan.step3": "Adım 3", + "plan.choose_plan": "Plan Seç", + "plan.enter_email": "E-posta Gir", + "plan.choose_method": "Ödeme Yöntemi Seç", + "plan.bestValue": "En İyi Fiyat!", + "plan.per_month": "aylık", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 yıl", + "plan.add_referral": "Referans Kodu Ekle", + "plan.years": "{{years}} yıllık plan", + "plan.desc": "tek seferlik {{price}} faturalama", + "plan.bonus_months": "+ {{bonusMonths}} ay", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Seç", + "plan.two_year": "İki Yıllık", + "plan.one_year": "Bir Yıllık", + "plan.savings": "%{{formattedDiscount}} tasarruf edin", + "plans.title": "Lantern Pro Planları", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Windows, Android, Mac, Ubuntu içi", + "plans.from_reseller": "Lantern Pro aktivasyon kodunuz mu var? Buraya tıklayın.", + "plans.with_voucher_code": "Aktivasyon kodunuz mu var? Buraya tıklayın.", + "pro.apply": "Kredileriniz gelecek ay ödeme döngüsünde hesabınıza uygulanacaktır.", + "pro.title": "Arkadaşlarını davet et ve daha fazla Pro kazan", + "pro.subtitle": "Arkadaşın 2 yıllık plan satın aldığında ikiniz de fazladan 3 aylık Pro kazanırsınız, 1 yıllık plan satın aldığında ikiniz de fazladan 1 aylık Pro kazanırsınız.", + "pro.share": "Kodunu arkadaşlarınla paylaş ve daha fazla kredi kazan!", + "promotion.title": "Lantern Pro Ödeme", + "promotion.title.activation": "Lantern Pro Aktivasyon", + "promotion.enter_and_confirm_email": "Lütfen e-posta adresinizi girin ve onaylayın", + "promotion.code.hint": "Arkadaşınızın Yönlendirme kodunu girin (isteğe bağlı)", + "promotion.code.label": "Referans Kodu", + "promotion.payment": "Ödemeye devam et", + "promotion.payment.btc": "₿ ile öde", + "promotion.loading": "Yükleniyor...", + "promotion.howto_1y": "Eğer bir arkadaşınız referans kodunu sizinle paylaştıysa, onu buraya girin ve ödeme işleminden sonra 1 aylık ücretsiz Lantern Pro hesabınıza eklensin.", + "promotion.howto_2y": "Eğer bir arkadaşınız referans kodunu sizinle paylaştıysa, onu buraya girin ve ödeme işleminden sonra 3 aylık ücretsiz Lantern Pro hesabınıza eklensin.", + "promotion.pay": "{{amount}} öde", + "promotion.select": "Seç", + "promotion.promotion_applied_1y": "+1 bonus ay", + "promotion.promotion_applied_2y": "+3 bonus ay", + "promotion.too_many_referrals": "Bu referans kodu zaten eklenmiş. Ek aylarınızı almak için ödemeyi tamamlayın.", + "promotion.activation.enter_and_confirm_email": "Lütfen Lantern Pro hesabınızı kaydetmek için e-posta adresinizi girin ve onaylayın.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Aktivasyon Kodu", + "promotion.activation.instructions": "Hesabınızı kaydetmek için e-postanızı ve satıcıdan alınan 25 haneli aktivasyon kodunu girin.", + "promotion.activation.howto": "Lütfen yukarıdaki 25 karakterlik Lantern Pro aktivasyon kodunu girin. Bir kodunuz yoksa, lütfen Pro'yu bir önceki ekranda satın alın veya çevrimiçi bir Lantern Pro satıcısına başvurun.", + "promotion.activation.continue": "Pro için kaydolun", + "promotion.voucher.hint": "Aktivasyon Kodu", + "promotion.voucher.howto": "Lütfen 12 karakterli Fast World Pay aktivasyon kodunuzu yukarı girin", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Aktivasyon kodunuz alınırken hata oluştu.", + "promotion.voucher.error.invalid_code": "Geçersiz aktivasyon kodu", + "promotion.voucher.error.invalid_plan": "Geçersiz bir planla ilişkili aktivasyon kodu", + "promotion.voucher.error.already_redeemed": "Aktivasyon kodu zaten kullanılmış", + "referral.code": "Referans kodu", + "referral.text": "%s kodumu kullan ve üye olduğunda 3 ay ücretsiz kazan!", + "referral.description_free": "Kodunuzu arkadaşlarınızla paylaşın ve Pro satın aldıklarında 1 aylık Lantern Pro hizmetini ücretsiz edinin!", + "referral.description_pro": "Kodunuzu arkadaşlarınızla paylaşın ve Pro satın aldıklarında 1 aylık Ek Lantern Pro hizmetini ücretsiz edinin!", + "register": "Register", + "renew.subtitle_early": "3 ücretsiz ay için yenileyin!", + "renew.subtitle_last_day": "3 ücretsiz ay için yenileyin!", + "renew.subtitle_expired": "45 gün boyunca yenileyin!", + "renew.details_early": "Lantern Pro üyeliğinyakında sona eriyor. Şimdi yenileyin ve üç aya kadar ücretsiz tadını çıkarın!", + "renew.details_last_day": "Lantern Pro üyeliğiniz bugün sona eriyor! Şimdi yenileyin ve üç aya kadar ücretsiz tadını çıkarın!", + "renew.details_expired": "Lantern Pro üyeliğinizin süresi doldu. Şimdi yenileyin ve kırk beş güne kadar ücretsiz tadını çıkarın!", + "renew.asterisk_early": "* Bu sınırlı süreli teklif sadece erken yenilemeler için geçerlidir.", + "renew.asterisk_last_day": "* Bu bu özel teklifi almak için son şansınız!", + "renew.asterisk_expired": "* Bu sınırlı bir süre teklif!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s+ ÜCRETSİZ 1 AY", + "renew.plan_renewal_bonus_months": "$%d%s+%dÜCRETSİZ AYLAR", + "renew.plan_renewal_bonus_days": "$%d%s+%dÜCRETSİZ GÜNLER", + "renew.next": "sonraki", + "renew.decline": "Teklifi reddet", + "renew.decline_question": "Bu teklifi reddetmek istediğinizden emin misiniz?", + "renew.decline_yes": "Daha sonra yenile", + "renew.decline_dismiss": "Şimdi yenile", + "renew.notification_title_30_days": "Büyük tasarruflar için Pro'yu şimdi yenileyin!", + "renew.notification_title_30_days_platinum": "Büyük tasarruflar için Platinum'u şimdi yenileyin!", + "renew.notification_text_30_days": "{{planName}} hesabınızın süresi {{remainingDays}} gün içinde doluyor. Şimdi yenileyin ve 3 aya kadar ücretsiz kullanın.", + "renew.notification_title_2_days": "{{planName}} indirimi yarın sona eriyor!", + "renew.notification_text_2_days": "{{planName}} hesabınızın süresi yarın doluyor. Büyük bir indirim için bu fırsatı kaçırmayın.", + "renew.notification_title_last_day": "Bir indirim kazanmak için son şans!", + "renew.notification_text_last_day": "{{planName}} hesabınızın süresi doldu. Bugün yenileyin ve 3 aya kadar ücretsiz kullanın.", + "replica.upload": "Yükle", + "replica.favorite": "Favorilerine ekle", + "replica.added_to_favorites": "Favorilere Eklendi", + "replica.filedrop_error": "Bu dosya yüklenirken hata", + "replica.filedrop_error.file-too-large": "İzin verilen maksimum dosya boyutu: {{fileSize}}", + "replica.filedrop_error.file-too-small": "Dosya çok küçük", + "replica.filedrop_error.too-many-files": "Çok fazla dosya", + "replica.filedrop_error.file-invalid-type": "Bu dosya türü şu anda desteklenmiyor", + "replica.filedrop_remove_file": "Kuyruktan kaldır", + "replica.post": "Dosya Yükle", + "replica.relevance": "İlgi", + "replica.upload_date": "Yükleme Tarihi", + "replica.gallery_view": "Galeri Görünümü", + "replica.list_view": "Liste Görünümü", + "replica.copy_lantern_link": "Lantern Bağlantısını Kopyala", + "replica.documents": "Belgeler", + "replica.audio": "Ses", + "replica.application": "Uygulamalar", + "replica.image": "Görüntüler", + "replica.video": "Videolar", + "replica.web": "Web", + "replica.news": "Haberler", + "replica.upload_alert.dont_show": "Bunu bir daha gösterme", + "replica.upload_alert.cancel": "Yüklemeyi İptal Et", + "replica.upload_alert.resume": "Yüklemeye Devam Et", + "replica.upload_alert.info": "Önemli Bilgi!", + "replica.upload_alert.desc1": "Lantern'a yüklenen dosyalar dağıtımlıdır ve merkezi değildir. Başka bir kullanıcı tarafından erişildikten sonra, \"Dosyalarım\" listenizden silinseler bile, Lantern dahil olmak üzere hiç kimse tarafından ağdan silinemezler.", + "replica.upload_alert.desc2": "Lütfen hassas içerik yüklerken dosyada veya dosya adında kişisel tanımlayıcı bilgiler kullanmaktan kaçının.", + "replica.add_details": "Ayrıntıları ekle", + "replica.cannot_edit": "Yayımlandıktan sonra dosya adları değiştirilemez", + "replica.next": "İleri", + "replica.previous": "Önceki", + "replica.selectAll": "Tümünü Seç", + "replica.search_replica": "Ara", + "replica.search_results_info": "Bu sekme yalnızca Lantern sonuçlarını gösterir.", + "replica.search_results_info_message": "Lantern sonuçları kullanıcılar tarafından Lantern ağına yüklenen içeriklerden oluşur.", + "replica.no_files_found": "Sonuç Yok", + "replica.or_content": "diğer insanların bulması için kendi içeriğiniz!", + "replica.try_again": "Farklı bir anahtar kelime deneyin veya", + "replica.upload_success": "Yükleme Başarılı!", + "replica.cannot_preview": "Bu dosya türü için önizleme yok", + "replica.no_description": "Sağlanan tanım yok", + "replica.size": "Boyut", + "replica.uploaded": "Yüklendi", + "replica.invalid_link": "Geçersiz Bağlantı", + "replica.close": "Kapat", + "replica.files": "Dosyalar", + "replica.upload_history": "Yükleme geçmişi", + "replica.my_favorites": "Favoriler", + "replica.no_uploads": "Henüz Yükleme Yok", + "replica.no_favorites": "Henüz Favori Yok", + "replica.mime_type": "Dosya türü: {{mime}}", + "replica.image_loading_error": "Görüntü yükleme hatası", + "replica.play": "Oynat", + "replica.pause": "Duraklat", + "replica.scrub": "Temizle", + "replica.skip_forward": "İleri atla", + "replica.skip_backwards": "Geri atla", + "replica.trending_videos": "Popüler Videolar", + "replica.file_uploaded": "Yüklendi: {{days}} gün önce", + "replica.file_size": "Boyut", + "replica.duration": "Süre", + "replica.filename": "Dosya Adı", + "replica.filename_required": "Dosyanızı Adlandırın", + "replica.description_optional": "Tanım Ekle", + "replica.expand": "Ayrıntıları genişlet", + "replica.filetype": "Dosya Türü", + "replica.sortby": "Sıralama Ölçütü", + "replica.link": "Çoğaltma bağlantısı", + "replica.collapse": "Daralt", + "replica.publish": "Yayınla", + "replica.cancel": "İptal", + "replica.progress_current_upload": "Şunun yüklemesi:", + "replica.progress_files": "dosyalar", + "replica.progress_of": "/", + "replica.progress_upload_complete": "Tamamla", + "replica.progress_upload_failure": "Yükleme başarısız oldu, lütfen tekrar deneyin.", + "replica.upload_in_progress": "Yükleme devam ediyor", + "replica.upload_pending": "Yükleme beklemede", + "replica.upload_error": "Yükleme hatası", + "replica.upload_cancel": "Yüklemeyi iptal et", + "replica.upload_confirm": "Yüklemeyi iptal etmek istediğinize emin misiniz?", + "replica.progress_view": "Görüntüle", + "replica.delete": "Sil", + "replica.remove": "Kaldır", + "replica.delete_file": "Dosya Sil", + "replica.remove_favorite": "Favorilerden kaldır", + "replica.failed_to_delete": "Silinemedi", + "replica.failed_to_remove": "Kaldırılamadı", + "replica.link_lookup_failure": "Bağlantı bulunamadı", + "replica.delete_file_confirmation_1": "Silmek istediğinizden emin misiniz", + "replica.delete_file_confirmation_2": "yüklemelerinizden", + "replica.remove_favorite_confirmation_1": "Şuradan kaldırmak istediğinize emin misiniz:", + "replica.remove_favorite_confirmation_2": "favorilerinizden.", + "replica.share_file": "Dosya Paylaş", + "replica.download_and_view": "İndir/Görüntüle", + "replica.download": "İndir", + "replica.copy_link": "Çoğaltma Bağlantısını Kopyala", + "replica.find_file": "Dosya bul", + "replica.file_drop_prompt": "Yüklemeyi başlatmak için dosyayı bırakın!", + "replica.empty_uploads_text1": "İlk gönderinizi oluşturmak için", + "replica.empty_uploads_text2": "buraya", + "replica.empty_uploads_text3": "tıklayın.", + "replica.error_header": "Eyvah!", + "replica.error": "Talebiniz işleme alınırken bir hata oluştu. Lütfen tekrar deneyin.", + "replica.serp_empty": "Google bu sorgu için hiçbir sonuç döndürmedi.", + "replica.disclaimer": "Lantern aramalarınızı anonimleştirir ve üçüncü taraflardan korur", + "settings.general": "Genel", + "settings.feedback": "Geri Bildirim", + "settings.autoLaunch": "Lantern'i işletim sistemi açılırken başlat", + "settings.autoReport": "Lantern'in gelişimine katkıda bulunmak için, kullanım istatistiklerini güvenli rapor et", + "settings.lantern_ads": "Lantern Reklamlarını Göster", + "settings.lantern_ads_tooltip": "Lantern hizmetimizi desteklemek için size bazı web sitelerinde reklamlar gösterir. Hiçbir kullanıcı bilgisi toplanmaz ve sunucularımıza aktarılmaz. Bu seçeneği kapatırsanız yine de reklamlar görebilirsiniz ancak bunlar Lantern ağından olmayacaktır.", + "settings.proxyAll": "Tüm trafiği proxyle", + "settings.proxyAllHelpTitle": "\"TÜM TRAFİĞİ PROXYLE\" NE İŞE YARAR?", + "settings.proxyAllHelp1": "Etkinleştirilirse, bütün trafik Lantern'den gönderilir (en güvenli seçenek).", + "settings.proxyAllHelp2": "Devre dışı bırakılırsa, sadece engellenen trafik Lantern ile gönderilir (en hızlı seçenek, en yaygın).", + "settings.show_advanced": "Gelişmiş Ayarları Göster", + "settings.hide_advanced": "Gelişmiş Ayarları Gizle", + "settings.systemProxy": "Sistem vekil sunucusunu yönet", + "settings.title": "Ayarlar", + "settings.http_proxy": "HTTP(S) vekil:", + "settings.socks_proxy": "SOCKS vekil:", + "settings.caution": "Dikkat:", + "settings.caution_text": "\"Sistem vekilini ayarla\" seçeneğini işaretlemezseniz, tarayıcınız ve diğer uygulamalar Lantern'i otomatik olarak kullanamazlar. Eğer bu ayarları el ile nasıl yapacağınızı biliyorsanız, yukarıdaki bilgileri kullanın.", + "settings.select_language": "Dil Seç", + "settings.diagnostics": "Tanılama Bilgileri Ekle", + "settings.diagnostics_tooltip": "Tanılama bilgileri eklendiğinde Lantern ekibine bağlantınızdan elde edilen veriler gönderilir. Bu, sorununuzu tespit etme ve çözme kabiliyetimizi artırır.", + "status.lantern": "Lantern", + "status.click_reconnect": "Yeniden bağlanmak için buraya tıklayın", + "status.server_location": "Sunucu Konumu", + "status.tooltip1": "Lantern, sizi en iyi veri merkezlerimize bağlamak için akıllı sunucu seçimini kullanır.", + "status.tooltip2": "Özel Lantern Pro veri merkezlerimizden optimize edilmiş sunucu seçimiyle daha yüksek hız için Lantern Pro'ya yükseltin", + "status.protected_connection": "Bağlantınız Korumalıdır", + "status.please_wait": "Bu işlem bir iki dakika sürebilir...", + "status.connecting": "Bağlanılıyor...", + "status.no_internet": "Kapalı", + "status.no_internet_connection": "Internet bağlantısı yok", + "status.connected": "Açık", + "status.disconnected": "Kapalı", + "status.throttled": "Hız Azalıyor (Veri Kapağı)", + "status.no_system_proxy": "{{status}}, sistem proxy'si yönetilmiyor", + "status.fail_to_set_system_proxy": "Lantern, sistem proxy'si olarak ayarlanamadı", + "status.fail_to_open_browser": "Lantern kullanıcı arabirimini göstermek için tarayıcı penceresi açılamadı", + "support.forum": "Lantern Kullanıcı Forumu", + "support.faq": "SSS", + "terms_of_service.acknowledgment": "{{buttonText}} öğesini tıklayarak, Hizmet Şartlarımızı kabul edersiniz", + "terms_of_service.replica": "Ürünlerimizi herhangi bir şekilde arayarak, yükleyerek veya kullanarak Hizmet Şartlarımızı, Gizlilik Politikamızı ve DMCA Politikamızı kabul edersiniz", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Cihaz Bağlama Pinini Girin veya Yapıştırın", + "verify.code": "Cihaz Bağlama Kodu", + "verify.howto_1": "Başka bir cihazda Lantern Pro hesabı kullanıyorsanız, bu cihazda da kullanmak için buraya e-posta adresinizi girin", + "verify.howto_1a": "Şu anda yetkisiz bir Pro kullanıcısısınız. Lütfen Pro hesabınızı yetkilendirmek için e-posta adresinizi girin. Bu birden fazla cihaz bağlamanızı sağlayacak.", + "verify.howto_2": "Pro Hesabınıza Bir Cihaz Bağlamak İçin:", + "verify.howto_3": "1. Diğer cihazınızın Menü'sünden \"Cihazı Pro Hesabına Dahil Et\" öğesini seçin.", + "verify.howto_4": "2. 1. adımdan elde edilen bağlama pinini girin ve gönderin.", + "verify.reminder": "*Her iki cihazın da Lantern'ın en son sürümünü çalıştırdığından emin olun", + "verify.enter_pin": "Cihaz Bağlama Pini Gir veya Yapıştır", + "verify.submit": "Gönder", + "verify.title": "Hesap Doğrulama", + "welcomeToPro.continue": "Pro'ya Devam Et", + "welcomeToPro.invite": "Arkadaşlarınızı davet edin! Eğer 2 yıllık plan satın alırlarsa ikiniz de 3'er aylık, 1 yıllık plan satın alırlarsa ikiniz de 1'er aylık ücretsiz Lantern Pro kazanacaksınız. Haydi davet edin!", + "welcomeToPro.thanks": "Artık en hızlı veri merkezlerimizi kullanmak için sınırsız erişime sahipsiniz. Hesabınıza en fazla üç cihaz bağlanabilir.", + "welcomeToPro.title": "Lantern Pro'ya Hoş Geldiniz!", + "welomeToPro.title_exclamation": "Lantern Pro'ya Hoş Geldiniz!", + "purchase.failed": "Satın alma başarısız oldu. Lütfen daha sonra tekrar deneyin.", + "purchase.success": "Satın Alma Başarılı", + "purchase.success_title": "Lantern {{planType}} planına hoş geldiniz!", + "purchase.success_content_pro": "Artık en hızlı veri merkezlerimizi kullanmak için sınırsız erişime sahipsiniz. Hesabınıza en fazla üç cihaz bağlanabilir.", + "purchase.success_content_platinum": "Artık en hızlı veri merkezlerimizi ve özel hatlarımızı kullanmak için sınırsız erişime sahipsiniz. Hesabınıza en fazla üç cihaz bağlanabilir.", + "welcomeToPro.description": "Artık engelli sitelere ve hizmetlere sınırsız erişime sahipsiniz", + "messages.copied_to_clipboard": "Kod Kopyalandı. Arkadaşlarınızla paylaşın!", + "messages.datacap": "Ücretsiz Lantern hızlı erişim verinizi tamamını kullandınız. Pro'ya yükselterek sınırsız yüksek hıza sahip olun.", + "messages.fatal_error": "Üzgünüz, Lantern sunucularına erişmekte sorun yaşıyoruz. Lütfen İnternet bağlantınızı denetleyip tekrar deneyin.", + "messages.backend_gone": "Üzgünüz, Lantern çalışmıyor gibi görünüyor. Lütfen Lantern'ı yeniden başlatıp tekrar deneyin.", + "messages.get_help": "Yardım Alın", + "freeProCredits.title": "Arkadaşlarını Davet Et", + "freeProCredits.shareWithFriends": "Kodunuzu arkadaşlarınızla paylaşın ve ücretsiz aylık üyelik kazanın!", + "freeProCredits.shareWithFriendsDesc": "Arkadaşınız iki yıllık plan aldığında 3 ay ücretsiz; bir yıllık plan aldığında da 1 ay ücretsiz hakkınız olacak.", + "cards.serverLocation.unknown": "Bilinmeyen", + "cards.serverLocation.description": "Optimize edilmiş Sunucu Konumu", + "cards.serverLocation.description-free": "Sunucu Konumu", + "cards.serverLocation.description-upgrade": "Daha Hızlı Sunuculara Yükselt", + "cards.serverLocation.title": "Mevcut Konum:", + "cards.serverLocation.location": "%s,%s", + "cards.serverLocation.text": "Lantern, Tokyo, Singapur, Hong Kong, San Francisco, New York, Amsterdam, Bangalore ve daha fazlasındaki veri merkezlerimizden size en hızlı bağlantıyı otomatik olarak bulmak için akıllı sunucu seçimini kullanır.", + "cards.serverLocation.text-free": "Lantern, sizi en iyi veri merkezlerimize bağlamak için akıllı sunucu seçimini kullanır.", + "cards.serverLocation.upgrade-link": "Özel Lantern Pro veri merkezlerimizden optimize edilmiş sunucu seçimi ile daha yüksek bir hız için Lantern Pro'ya yükseltin.", + "cards.httpsUpgrades.description": "HTTPS Yükseltmeleri", + "cards.httpsUpgrades.title": "HTTPS Yükseltmeleri: %d", + "cards.httpsUpgrades.text": "Lantern, internette gezinirken bilgilerinizi gizli tutmak için mümkün olunca güvenli olmayan HTTP bağlantılarını otomatik olarak şifreli HTTPS bağlantılarına yükseltir.", + "cards.adsBlocked.description": "Engellenen Reklamlar", + "cards.adsBlocked.title": "Engellenen Reklamlar: %d", + "cards.adsBlocked.text": "Lantern, web sayfalarının yüklenme sürecini hızlandırmak, bant genişliğinden tasarruf etmek ve size daha sorunsuz bir gezinme deneyimi sağlamak için araya giren reklamları engeller.", + "cards.dataUsage.description": "Veri Kullanımı", + "cards.dataUsage.upgrade": "Şimdi Yükselt", + "cards.dataUsage.mb-used": "Aylık yüksek hızlı trafiğinizin%d/%dMB'lık kısmını kullandınız.", + "cards.dataUsage.upgrade-link": "Sınırsız yüksek hızlı servis için şimdi yükseltin", + "cards.subscription.description": "Pro Abonelik", + "cards.subscription.renew": "Yenile", + "cards.subscription.months": "Aboneliğinizde %d aylık Lantern Pro kaldı.", + "cards.subscription.days": "Aboneliğinizde %dgünlükLantern Pro kaldı", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "GÜNLER", + "cards.subscription.renew-link": "Daha fazla zaman eklemek için aboneliğinizi yenileyin", + "auth.email": "E-posta", + "auth.username": "Kullanıcı adı", + "auth.username.or.email": "Kullanıcı Adı veya E-posta", + "auth.signin": "Giriş", + "current.password": "Geçerli Parola", + "new.password": "Yeni Parola", + "auth.change.password": "Parolayı Değiştir", + "confirm.new.password": "Yeni Parolayı Onayla", + "auth.password": "Şifre", + "auth.have.recovery.phrase": "Bir Kurtarma İfedeniz var mı?", + "auth.forgot.password": "Parolanızı mı unuttunuz ya da parolanız yok mu?", + "auth.create.account": "Hesap Oluştur", + "auth.missing.username": "Kullanıcı adı eksik", + "auth.missing.current.password": "Geçerli parola eksik", + "auth.missing.new.password": "Yeni parola eksik", + "auth.missing.confirm.password": "Onay parolası eksik", + "invalid_credentials": "Geçersiz Kimlik Bilgileri", + "yinbi.wallet": "Yinbi Cüzdan", + "create.wallet": "Cüzdan Oluştur", + "new.to.yinbi": "Yinbi'de yeni misiniz?", + "setup.wallet": "Evet, şimdi yeni bir cüzdan hazırlayalım!", + "web.wallet": "Hayır, Yin.bi Web Sitesinde Cüzdanım var", + "yinbi.next": "İleri", + "yinbi.amount": "Tutar", + "yinbi.missing.address": "Sağlanan hedef adresi yok", + "yinbi.missing.amount": "Belirtilen tutar yok", + "yinbi.missing.email": "E-posta adresi belirtilmedi", + "yinbi.missing.username": "Kullanıcı adı belirtilmedi", + "yinbi.missing.password": "Parola belirtilmedi", + "yinbi.invalid.address": "{{destination}} geçerli bir Stellar adresi değil", + "yinbi.send": "Gönder", + "yinbi.to": "Hedef:", + "yinbi.try_again": "Tekrar denensin mi?", + "yinbi.success.transaction": "İşlem Başarılı!", + "yinbi.failure.transaction": "İşlem Başarısız Oldu", + "yinbi.confirm.transaction": "İşlemi Onayla", + "yinbi.sent.details": "Şuraya {{amount}} YNB gönderdiniz: {{destination}}", + "yinbi.sent.failure.details": "İşleminiz aşağıdaki nedenlerden dolayı başarısız oldu:", + "yinbi.recipient": "Alıcı", + "yinbi.available.send": "Gönderilebilecek {{balance}} YNB'niz var", + "yinbi.wallet.header": "Cüzdan", + "yinbi.send.header": "Yinbi Gönder", + "yinbi.recovery.phrase": "Yinbi Kurtarma İfadesi", + "yinbi.recover.account": "Yinbi Cüzdanınızı ve Lantern hesabınızı kurtarmak için Yinbi Kurtarma İfadenizi girin veya yapıştırın", + "yinbi.recovery.desc": "Lantern hesabınıza ek olarak Yinbi Cüzdan'da oturum açmak istiyorsanız bu yöntemi kullanın", + "yinbi.redeem.codes": "Toplu Yinbi Kodları Kullan", + "yinbi.obtain.codes": "Toplu Yinbi Kullanım kodları, reseller.lantern.io'dan alınabilir", + "yinbi.receive.header": "Yinbi Al", + "yinbi.this.is.your.wallet": "Bu, insanların size YNB gönderebileceği Yinbi cüzdan adresinizdir.", + "yinbi.your.address": "Adresiniz", + "yinbi.no.activity.header": "Etkinlik Yok", + "yinbi.upgrade.pro.button": "Pro'ya Yükseltin ve Ücretsiz Yinbi Alın", + "yinbi.renew.pro.button": "Pro'yu Yenileyin ve Ücretsiz Yinbi Alın", + "yinbi.wallet.activity_header": "Etkinlik", + "yinbi.wallet.send": "Gönder", + "yinbi.wallet.receive": "Al", + "yinbi.wallet.balance": "Bakiye", + "yinbi.wallet.getlantern.pro": "Lantern Pro + Ücretsiz Yinbi Alın", + "yinbi.redemption.codes": "Yinbi Kullanım Kodları", + "redeem_codes.title": "Yinbi Kodlarını Kullan", + "redeem_codes.redeem_button_text": "Kullan", + "redeem_codes.cancel_button_text": "İptal", + "redeem_codes.success": "Başarılı", + "redeem_codes.errors.missing_codes": "Girilen geçerli kod yok", + "redeem_codes.errors.invalid_codes": "Hata, lütfen vurgulanan kodları kontrol edin. Üstü çizili kodların süresi dolmuştur ve artık kullanılamaz.", + "yinbi.new.account.text": "Yinbi gönderdikten veya aldıktan sonra işlemleriniz burada görünecektir.", + "yinbi.createAccount": "Hesap Oluştur", + "yinbi.confirm.account.text": "İfadeyi doğru yazdığınızdan emin olmak için lütfen kurtarma ifadenizden aşağıdaki sözcükleri girin", + "create_account.invalid_words.error": "Girilen sözcükler kurtarma parolasındakilerle eşleşmedi", + "yinbi.recovery_text": "Bu sizin Yinbi Cüzdan Kurtarma İfadenizdir. Parolayı unuttuğunuzda Yinbi Cüzdanınızı\nkurtarmanın TEK yolu budur. Bu ifadeyi muhafaza ederken parola yöneticisi kullanın\nveya basılı bir kopya oluşturun.", + "yinbi.recovery_confirm_text": "Bu sizin Yinbi Cüzdan Kurtarma İfadenizdir. Parolayı unuttuğunuzda Yinbi Cüzdanınızı\nkurtarmanın TEK yolu budur. Bu ifadeyi muhafaza ederken parola yöneticisi kullanın\nveya basılı bir kopya oluşturun.", + "yinbi.import.wallet": "Cüzdanı İçe Aktar", + "yinbi.setup.wallet": "Cüzdanı Kur", + "yinbi.importWallet": "Yin.bi Cüzdan'ı İçe Aktar", + "yinbi.import.wallet.continue": "Cüzdanınıza Devam Edin", + "yinbi.import.wallet.success": "Cüzdan İçe Aktarma Başarılı!", + "yinbi.wallet.text": "Yinbi Cüzdan'a erişmek için Hesap Oluşturabilir, Oturum Açabilir veya\ndaha önce Yin.bi web sitesine kaydolduysanız Yin.bi'den cüzdanınızı\niçe aktarabilirsiniz.", + "yinbi.wallet.pro.text": "Yinbi Cüzdan'a erişmek için Hesap Oluşturabilir, daha önce kaydolduysanız Yin.bi'den cüzdanınızı içe aktarabilirsiniz.", + "yinbi.recovery_subheader": "Yinbi Cüzdan Kurtarma İfadesi", + "yinbi.import_wallet.subheader": "Yinbi Cüzdan'ı İçe Aktar", + "yinbi.import_wallet.text": "Cüzdanınızı Lantern'a aktarmak için Yin.bi kimlik bilgilerinizi kullanarak oturum açın", + "yinbi.import_wallet.success": "Cüzdanınız başarıyla içe aktarıldı, lütfen hesap kaydını tamamlamak için e-postanızı ekleyin.", + "yinbi.import_wallet.success_subheader": "İçe Aktarma Başarılı!", + "yinbi.import_wallet.button": "Yin.bi Cüzdan'ı İçe Aktar", + "yinbi.import_wallet.success_button": "Kaydı Tamamla", + "yinbi.recovery_passphrase.label_text": "Kurtarma İfadesi", + "yinbi.recovery_passphrase.copy_button_text": "Kopyala", + "terms_of_service.notice": "Bildirim", + "terms_of_service.i_agree": "Kabul ediyorum", + "platinum": "Platinum", + "platinum.one_year": "1 yıllık fiyatlandırma", + "platinum.two_years": "2 yıllık fiyatlandırma", + "platinum.save": "%{{savings}} oranına kadar tasarruf!", + "platinum.unlimited": "Sınırsız Veri", + "platinum.logs": "Günlük yok", + "platinum.devices": "3 cihaza kadar bağlayın", + "platinum.everything_in_pro": "Pro içine dahil olan her şey", + "platinum.faster_data": "Daha hızlı veri merkezleri", + "platinum.dedicated": "Özel hat", + "platinum.reliability": "Artmış Güvenilirlik", + "platinum.platinum_one_year": "Lantern Platinum 1 yıllık", + "platinum.platinum_two_years": "Lantern Platinum 2 yıllık", + "platinum.pro_one_year": "Lantern Pro 1 yıllık", + "platinum.pro_two_years": "Lantern Pro 2 yıllık", + "platinum.total": "Toplam", + "platinum.free": "Ücretsiz", + "platinum.credit.days": "+ {{ days }} gün", + "platinum.credit.months": "{{ months }} ay", + "platinum.upgrade": "Platinum'a Yükselt", + "platinum.upgrade_details": "Özel Hat + Daha Hızlı Veri merkezleri!", + "platinum.unused_time_disclaimer": "Platinum'a yükselten Pro kullanıcıları, dönüştürülen Pro aboneliğini yukarıda eklenilen süre olarak görecek.", + "p2p.opt_in_description": "İnternetinizi kullanarak insanların sansürsüz internete erişmesine yardım edin", + "p2p.active_sharing_description": "İnternet paylaşımınız açık", + "p2p.dialog.title": "İnternet erişimini paylaş", + "p2p.dialog.text.1": "Bağlantınızı paylaşarak kısıtlanmış interneti olanlara yardım edin. İnternetinizi erişime açarak internetin daha açık bir yer olmasını sağlayan gönüllü ağının bir parçası olursunuz.", + "p2p.dialog.text.2": "Paylaşmak kimlik veya güvenliğinizi tehlikeye atmaz. İstediğiniz zaman internet paylaşımınızı durdurabilirsiniz.", + "p2p.dialog.yes_button": "EVET, PAYLAŞMAYA BAŞLA", + "p2p.dialog.no_button": "İPTAL ET", + "p2p.banner.introducing": "KARŞINIZDA", + "top_sites.top_sites": "Başlıca Siteler" +} \ No newline at end of file diff --git a/locale/translation/ug.json b/locale/translation/ug.json new file mode 100644 index 000000000..b14206029 --- /dev/null +++ b/locale/translation/ug.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Show Lantern", + "TRAY_QUIT": "Lantern دىن چېكىنىش" +} \ No newline at end of file diff --git a/locale/translation/uk.json b/locale/translation/uk.json new file mode 100644 index 000000000..6bf9e6784 --- /dev/null +++ b/locale/translation/uk.json @@ -0,0 +1,462 @@ +{ + "TRAY_LANTERN": "Lantern", + "TRAY_STATUS": "Status: %v", + "TRAY_CONNECT": "Connect", + "TRAY_DISCONNECT": "Disconnect", + "TRAY_SHOW_LANTERN": "Показати Lantern", + "TRAY_UPGRADE_TO_PRO": "Upgrade to Pro", + "TRAY_QUIT": "Вийти з Lantern", + "BACKEND_DATA_TITLE": "No more high speed Lantern data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using Lantern at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your Lantern data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your Lantern high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "Допомога", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update Lantern to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "Lantern %s has been downloaded. Please restart Lantern to use it.", + "BACKEND_MITM_INSTALL_CERT": "Lantern wants to install a custom certificate in order to unblock your traffic", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "Lantern is an application that delivers fast, reliable and secure access to the open Internet.", + "about.faq": "Read the Lantern FAQs", + "about.open": "Open Internet for Everyone", + "about.questions": "Questions?", + "about.title": "Про нас", + "account.cancel": "Cancel Pro Account", + "account.free.cap": "{{mb}} MB remaining of your free monthly data", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To link this device to your Pro account:", + "account.freelink.step1": "1. Open the 'Add Device' menu item on your Pro device.", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Make sure you're updated to the latest version of Lantern on your Pro device", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "Your account will automatically be charged for another year of Lantern Pro at the end of your billing cycle.", + "account.upgrade": "Upgrade to Pro", + "account.pro.email": "Email Address:", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Devices authorized to use your Pro account:", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "Only One Device", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "Скасувати", + "adyen.dismissButton": "Гаразд", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Card Number", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "Month", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "Year", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "Помилка", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "Authorize Device for Pro", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Link this device", + "authorize.step1.or": "або", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}}. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "Your Email", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "Your Referral Code", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "Continue to Pro", + "authorized.text": "This device is now authorized to use your Lantern Pro account!", + "authorized.title": "Device Authorized", + "button.renew": "Renew", + "button.upgrade": "Upgrade", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "Upgrade to Lantern Pro", + "button.copy_your_code": "Copy your code", + "button.try_again": "Try again", + "button.continue": "Продовжити", + "bullet.click_button": "Click on the button below", + "bullet.paste_code": "Paste the code & download link in a message", + "bullet.send_to_friends": "Send to your friends", + "cancel": "Скасувати", + "confirm": "Confirm", + "google_search": "Google Search", + "link_device": "Already have a Pro account? Link device", + "err.unknown_error": "Unknown error", + "err.internal_error": "Internal error", + "err.bad_input": "Bad input", + "err.not_authorized": "Not authorized", + "err.user_exists": "User exists", + "err.no_such_user": "No such user", + "err.user_already_verified": "User already verified", + "err.invalid_user_verification": "Invalid user verification", + "err.user_unverified": "User Unverified", + "err.operation_temporarily_unavailable": "Operation temporarily unavailable", + "err.wrong_or_inexistent_plan": "Wrong or inexistent plan", + "err.user_has_active_subscription": "User has active subscription", + "err.payment_error": "Payment error", + "err.no_codes_left": "No referral codes left", + "err.wrong_code": "Wrong referral code", + "err.redeeming_own_code_not_allowed": "Redeeming codes of oneself is not allowed", + "err.wrong_charge_id": "Wrong charge ID", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "Faster Speed", + "feature.faster": "Faster data centers", + "feature.unlimited": "Unlimited data", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern Pro", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "Get Lantern Pro", + "input.email": "Email", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "Write a valid email address", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "Your Email", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "Please try again", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "Languages", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "Про нас", + "nav.account": "Account Management", + "nav.authorize": "Add Device", + "nav.authorized": "Device Authorized", + "nav.unauthorized_link": "Authorize Device for Pro", + "nav.language": "Мова", + "nav.lantern": "Lantern", + "nav.mobile": "Get Mobile Version", + "nav.report_issue": "Report an Issue", + "nav.settings": "Параметри", + "nav.verify": "Account Verification", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "Повторити", + "notifications.whatisnew": "What's New?", + "payment.close": "Закрити", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "Select", + "plans.title": "Lantern Pro Plans", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "Your credits will be applied to your account in the next billing cycle.", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "Share your code with friends to start earning more credits!", + "promotion.title": "Lantern Pro Checkout", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "Referral Code", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "Pay {{amount}}", + "promotion.select": "Select", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Enter your Activation Code", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Continue to Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Share your referral code", + "referral.text": "Use my code %s and get 3 months free when you sign up!", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.delete_file": "Delete File", + "replica.docs": "Документи", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "Search Public Files", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "Закрити", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "Скасувати", + "replica.delete": "Delete", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "from your uploads", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "Звантажити", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "Drag file here or browse to post", + "settings.general": "General", + "settings.feedback": "Feedback", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "Securely report usage statistics to contribute to Lantern", + "settings.proxyAll": "Перенаправити весь трафік", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "Show Advanced Settings", + "settings.hide_advanced": "Hide Advanced Settings", + "settings.systemProxy": "Manage system proxy", + "settings.title": "Параметри", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "Select Langauge", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "Server Location", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "З'єднання…", + "status.no_internet": "Off", + "status.no_internet_connection": "No Internet connection", + "status.connected": "On", + "status.disconnected": "Off", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "verify.header": "Want to link another device to this Pro account? Enter your Device Linking Code below", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_3": "1. Open the 'Authorize Device for Pro' menu item on your unauthorized device.", + "verify.howto_4": "2. Enter the linking code obtained from step 1, and submit.", + "verify.reminder": "*Make sure you are updated to the latest version of Lantern on your unauthorized device", + "verify.submit": "Submit", + "verify.title": "Account Verification", + "welcomeToPro.continue": "Continue to Pro", + "welcomeToPro.invite": "Invite friends and you will each get 3 months free when they purchase the two-year plan, the one year plan gets you each 1 month free. Start inviting!", + "welcomeToPro.thanks": "Thanks for your purchase of Lantern Pro!", + "welcomeToPro.title": "Welcome To Lantern Pro", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "Get Help", + "freeProCredits.title": "Invite Friends", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "Optimized Server Location", + "cards.serverLocation.description-free": "Server Location", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "Current Location:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time." +} \ No newline at end of file diff --git a/locale/translation/uk_UA.json b/locale/translation/uk_UA.json new file mode 100644 index 000000000..efc2ca839 --- /dev/null +++ b/locale/translation/uk_UA.json @@ -0,0 +1,4 @@ +{ + "TRAY_SHOW_LANTERN": "Показати Lantern", + "TRAY_QUIT": "Вийти з Lantern" +} \ No newline at end of file diff --git a/locale/translation/vi.json b/locale/translation/vi.json new file mode 100644 index 000000000..94bf62f5a --- /dev/null +++ b/locale/translation/vi.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "Lantern", + "pro": "Pro", + "BEAM": "Beam", + "TRAY_STATUS": "Trạng thái: %v", + "TRAY_CONNECT": "Kết nối", + "TRAY_DISCONNECT": "Ngắt kết nối", + "TRAY_SHOW": "Hiển thị %s", + "TRAY_UPGRADE_TO_PRO": "Nâng cấp lên bản Pro", + "TRAY_QUIT": "Thoát %s", + "BACKEND_DATA_TITLE": "Không còn dữ liệu %s tốc độ cao nữa", + "BACKEND_DATA_MESSAGE": "Vui lòng nâng cấp lên Pro để tiếp tục sử dụng %s ở tốc độ tối đa!", + "BACKEND_DATA_PERCENT_TITLE": "Đã dùng đến %s trong số %s dữ liệu của bạn", + "BACKEND_DATA_PERCENT_MESSAGE": "Bạn đã sử dụng %s trong số %s dữ liệu tốc độ cao của mình. Nâng cấp ngay bây giờ!", + "BACKEND_CLICK_LABEL": "Mở", + "BACKEND_CLICK_LABEL_OPEN": "Mở", + "BACKEND_CLICK_LABEL_HELP": "Trợ giúp", + "BACKEND_CLICK_LABEL_GOT_IT": "Đã nhận được", + "BACKEND_AUTOUPDATED_TITLE": "Cập nhật %s lên phiên bản %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s đã được tải xuống. Vui lòng khởi động lại %s để sử dụng.", + "BACKEND_MITM_INSTALL_CERT": "%s muốn cài đặt chứng chỉ tùy chỉnh để cải thiện hiệu suất", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Vui lòng cho phép %v thay đổi hệ thống của bạn", + "BACKEND_ALERT_TITLE": "Cảnh báo quan trọng cần bạn chú ý", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "% s cần sự cho phép của bạn để cài đặt các công cụ chẩn đoán. Điều này sẽ giúp chúng tôi cải thiện trải nghiệm% s của bạn.", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Không thể lưu cấu hình", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Không thể lưu cấu hình ứng dụng. %s không thể đảm bảo rằng lưu lượng truy cập sẽ được tính theo tỷ lệ chính xác.", + "about.content": "Lantern là một ứng dụng để kết nối vào mạng Internet lẹ, chắc và an toàn.", + "app.error": "Đã xảy ra lỗi!", + "about.faq": "Đọc Những Câu Hỏi Thường Gặp về Lantern", + "about.open": "Internet Mở cho Mọi Người", + "about.questions": "Thắc mắc?", + "about.title": "Thông tin", + "account.add.password": "Thêm mật khẩu tài khoản", + "account.agree.terms": "Tôi hiểu rằng mất mật khẩu có nghĩa là\nmất quyền truy cập tài khoản. Lantern không thể giúp bạn\nkhôi phục mật khẩu.", + "account.agree.terms.error": "Trước tiên phải đồng ý với các điều khoản", + "account.cancel": "Hủy Tài Khoản Pro", + "account.created": "Tài khoản đã được tạo!", + "account.create.pro.account.header": "Tạo tài khoản Pro", + "account.create.pro.account.text": "Lantern đang thay đổi cách xử lý các tài khoản người dùng. Từ bây giờ người dùng Pro sẽ cần tạo tên người dùng và mật khẩu. Các thông tin xác thực này sẽ được sử dụng để đăng nhập vào các thiết bị khác và cung cấp quyền truy cập vào các tính năng mới.", + "account.have.a.account": "Có tài khoản?", + "account.link.username.pro": "Liên kết tên người dùng với Tài khoản Pro", + "account.recovery": "Phục Hồi Tài Khoản", + "account.recovery.link.device": "Liên kết thiết bị", + "account.recovery.device.code": "Mã Số Kết Nối Máy", + "account.recovery.device.enter.code": "Nhập hoặc dán mã pin liên kết thiết bị", + "account.recovery.device.instructions.header": "Nối kết máy này với tài khoản Pro của bạn:", + "account.recovery.device.instructions.step.one": "1. Chọn tùy chọn ‘Liên kết thiết bị’ từ mục màn hình Quản lý tài khoản trên thiết bị Desktop Pro của bạn hoặc từ menu trên Thiết bị Mobile Pro của bạn.", + "account.recovery.device.instructions.step.two": "2. Điền vào mã số kết nối máy, rồi nộp vào.", + "account.recovery.device.instructions.part.three": "*Đảm bảo cả hai thiết bị đang chạy phiên bản Lantern mới nhất", + "account.recovery.method": "Vui lòng chọn một phương pháp để khôi phục tài khoản của bạn", + "account.recovery.send.email": "Gửi Email", + "account.recovery.submit": "Nộp", + "account.recovery.success": "Liên kết thành công!", + "account.pro_management": "Quản Trị Tài Khoản Pro", + "account.free_management": "Quản Trị Tài Khoản", + "account.free.cap": "Còn lại {{mb}} MB dữ liệu miễn phí. Đặt lại lúc {{reset}}", + "account.free.cap.upgrade": "Nâng cấp lên bản Pro để có dung lượng tốc độ cao và không giới hạn", + "account.freelink.validFor": "có giá trị trong %s", + "account.freelink.desc": "Để cho phép thiết bị này sử dụng tài khoản Pro của bạn:", + "account.freelink.step1": "1. Chọn tùy chọn 'Liên kết thiết bị' từ Menu trên Thiết bị Pro của bạn", + "account.freelink.step2": "2. Điền vào mã số kết nối máy, rồi nộp vào.", + "account.freelink.reminder": "* Đảm bảo cả hai thiết bị đang chạy phiên bản Lantern mới nhất", + "account.freelink.errorTitle": "Có Lỗi Kết Nối", + "account.freelink.errorText": "Bạn có chắc là đã điền mã số vào trong máy Pro?", + "account.freelink.headerDesc": "Kết nối máy này với tài khoản Pro của bạn", + "account.freelink.title": "Mã Số Kết Nối Máy", + "account.pro.charge": "Tài khoản bạn sẽ được tự động tính tiền thêm một năm cho Lantern Pro khi gần hết hạn.", + "account.upgrade_pro": "Nâng cấp lên bản Pro", + "account.upgrade": "Nâng Cấp", + "account.upgrade_platinum": "Nâng cấp lên Platinum", + "account.create": "Tạo tài khoản", + "account.email": "Email", + "account.confirm.password": "Xác nhận mật khẩu", + "account.password": "Mật khẩu", + "account.pro.email": "E-mail:", + "account.pro.expiration": "Tài khoản Pro hết hạn", + "account.platinum.expiration": "Tài khoản Platinum hết hạn", + "account.pro.expired": "Tài khoản Pro của bạn đã hết hạn. Hãy gia hạn ngay để nhận được lưu lượng hàng tháng không giới hạn", + "account.pro.expiry": "Tài khoản Pro của bạn hết hạn trong %s ngày vào %s.", + "account.pro.bonusMonths": "Bao gồm {{bonusMonths}} tháng thưởng thêm!", + "account.pro.thisdevice": "Thiết bị này", + "account.pro.logout": "Đăng xuất", + "account.pro.removedevice": "XÓA", + "account.pro.devices": "Thiết bị Lantern Pro (tối đa 3)", + "account.pro.device.confirm.title": "Rút Phép của Máy", + "account.pro.device.confirm": "Bạn có chắc chắn muốn gỡ '{{device}}' khỏi tài khoản Lantern Pro của mình không?", + "account.pro.device.one.title": "Chỉ Có Một Máy", + "account.pro.device.one": "Rất tiếc, bạn không thể xóa máy được phép cuối cùng này.", + "account.pro.linkingcode": "Mã Số Kết Nối Máy:", + "account.pro.renew": "Gia hạn Tài khoản Pro", + "account.platinum.renew": "Gia hạn tài khoản Platinum", + "account.pro.renew_CN": "Làm mới", + "account.prolink.errorTitle": "Có Lỗi Kết Nối", + "account.prolink.errorText": "Bạn có chắc là chép đúng mã số từ máy kia?", + "account.prolink.successTitle": "Máy được kết nối", + "account.prolink.successText": "Bạn đã kết nối máy tốt đẹp! Xin vui lòng chờ trong giây lát để các máy khác tự động chuyển qua bản Pro.", + "account.signin": "Đăng nhập", + "account.signout": "Đăng xuất", + "account.submit": "Nộp", + "account.username": "Tên người dùng", + "account.switch.to.register": "Chuyển sang Tạo tài khoản", + "account.switch.to.signin": "Chuyển sang Đăng nhập", + "account.invalid.username": "Tên người dùng không hợp lệ", + "account.invalid.email": "Email không hợp lệ", + "account.password.mismatch": "Xác nhận Mật khẩu không khớp với mật khẩu", + "account.password.short": "Mật khẩu quá ngắn", + "account.password.lowercase": "Mật khẩu phải chứa ít nhất một chữ cái viết thường", + "account.password.uppercase": "Mật khẩu phải chứa ít nhất một chữ cái viết hoa", + "account.password.number": "Mật khẩu phải chứa ít nhất một chữ số", + "account.password.compromised": "Mật khẩu xuất hiện trên danh sách các mật khẩu bị xâm phạm", + "modal.register.free.header": "Đăng ký hoặc Đăng nhập để truy cập Ví Yinbi", + "modal.register.pro.header": "Thêm mật khẩu tài khoản để truy cập Ví Yinbi", + "modal.register.pro.signin.header": "Đăng nhập để truy cập Ví Yinbi", + "modal.register.free.text": "Để sử dụng Ví Yinbi, bạn phải có Tài khoản Lantern, vui lòng Đăng ký hoặc\nĐăng nhập để Tiếp tục.", + "modal.register.pro.text": "Để sử dụng Ví Yinbi, bạn phải thêm mật khẩu vào tài khoản Lantern của bạn.", + "modal.register.pro.signin.text": "Để sử dụng ví Yinbi, bạn phải đăng nhập vào tài khoản Lantern của mình", + "adyen.paymentMethods.title": "Phương thức thanh toán", + "adyen.paymentMethods.storedMethods": "Phương thức thanh toán của bạn", + "adyen.paymentMethods.otherMethods": "Chọn phương thức khác", + "adyen.paymentMethods.moreMethodsButton": "Thêm phương thức thanh toán", + "adyen.payButton": "Thanh toán", + "adyen.payButton.formatted": "Thanh toán %@", + "adyen.cancelButton": "Hủy bỏ", + "adyen.dismissButton": "ĐỒNG Ý", + "adyen.storeDetails": "Lưu cho lần thanh toán tiếp theo", + "adyen.payment.redirecting": "Bạn sẽ được chuyển hướng", + "adyen.payment.processing": "Quá trình thanh toán của bạn đang được xử lý", + "adyen.creditCard.title": "Thông tin chi tiết về thẻ", + "adyen.creditCard.holderName": "Tên chủ thẻ", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "Số Thẻ Tín Dụng", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Số thẻ không hợp lệ", + "adyen.creditCard.expiryDateField.title": "Ngày hết hạn", + "adyen.creditCard.expiryDateField.placeholder": "THÁNG/NĂM", + "adyen.creditCard.expiryDateField.invalid": "Ngày hết hạn không hợp lệ", + "adyen.creditCard.expiryDateField.month": "Tháng", + "adyen.creditCard.expiryDateField.month.placeholder": "THÁNG", + "adyen.creditCard.expiryDateField.year.placeholder": "NĂM", + "adyen.creditCard.expiryDateField.year": "Năm", + "adyen.creditCard.cvcField.title": "Mã xác minh của thẻ", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Số lần trả", + "adyen.creditCard.storeDetailsButton": "Nhớ thẻ này cho lần thanh toán tiếp theo của tôi", + "adyen.creditCard.oneClickVerification.title": "Xác minh thẻ của bạn", + "adyen.creditCard.oneClickVerification.message": "Vui lòng nhập Mã xác minh cho %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Mã xác minh không hợp lệ", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Vui lòng nhập Mã xác minh hợp lệ để tiếp tục", + "adyen.sepaDirectDebit.ibanField.title": "Số tài khoản (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Số tài khoản này không hợp lệ", + "adyen.sepaDirectDebit.nameField.title": "Tên chủ thẻ", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "Tôi đồng ý rằng số tiền dưới đây sẽ được trích từ tài khoản ngân hàng của tôi.", + "adyen.sepa.ownerName": "Tên chủ thẻ", + "adyen.sepa.ibanNumber": "Số tài khoản (IBAN)", + "adyen.giropay.searchField.placeholder": "Tên ngân hàng / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Tối thiểu 3 ký tự", + "adyen.giropay.noResults": "Không tìm thấy kết quả", + "adyen.error.title": "Lỗi", + "adyen.error.subtitle.redirect": "Chuyển hướng thất bại", + "adyen.error.subtitle.payment": "Thanh toán thất bại", + "adyen.error.subtitle.refused": "Thanh toán bị từ chối", + "adyen.error.message.unknown": "Đã xảy ra lỗi không xác định", + "adyen.error.message.cannotConnectToInternet": "Không có kết nối Internet: Vui lòng kiểm trang mạng Internet của bạn", + "adyen.error.message.cannotConnectToHost": "Không kết nối được với máy chủ thanh toán của chúng tôi", + "adyen.error.retryButton": "Thử lại", + "adyen.idealIssuer.selectField.title": "Ngân hàng", + "adyen.idealIssuer.selectField.placeholder": "Chọn ngân hàng của bạn", + "adyen.creditCard.success": "Thanh toán thành công", + "adyen.oneClick.confirmationAlert.title": "Xác nhận %@ thanh toán", + "adyen.redirect.cannotOpenApp.title": "Không thể mở ứng dụng", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "Không thể mở được ứng dụng này vì nó không được cài trên thiết bị này.", + "adyen.holderName": "Tên chủ thẻ", + "adyen.countryCode": "Mã quốc gia", + "adyen.telephone.number": "Số điện thoại", + "android.download": "Lantern Android", + "android.download.title": "Tải xuống Lantern Android", + "authorize.title": "Cho Phép Máy dùng bản Pro", + "authorize.step1.have_pro_device": "Tôi có một máy Lantern Pro khác", + "authorize.step1.link": "Liên kết thiết bị", + "authorize.step1.email_linking": "Liên kết Email", + "authorize.device_linking_explanation": "Sử dụng phương pháp này nếu bạn đã đăng nhập vào một thiết bị khác và mang theo bên mình", + "authorize.device_email_explanation": "Sử dụng phương pháp này nếu bạn muốn một Mã pin liên kết thiết bị được gửi đến email của bạn", + "authorize.link_device": "Liên kết thiết bị", + "authorize.step1.choose": "Vui lòng chọn một phương pháp để Liên kết tài khoản của bạn", + "authorize.step1.or": "hoặc", + "authorize.step1.recover": "Cần phục hồi lại tài khoản Lantern Pro của tôi", + "authorize.step1.start": "bắt đầu phục hồi", + "authorize.step1.no_mail": "Không nhớ địa chỉ email của bạn?", + "authorize.step1.description": "Nhập email của bạn và nếu tài khoản đã tồn tại, chúng tôi sẽ gửi email có mã liên kết thiết bị", + "authorize.step2b.enter_code": "Điền vào Mã Số Phục Hồi Tài Khoản", + "authorize.step2b.code": "Mã Số Phục Hồi Tài Khoản", + "authorize.step2b.instruction": "Email có mã khôi phục đã được gửi tới {{email}} nếu tài khoản này tồn tại. Có thể mất vài giờ để nhận được email này. Vui lòng kiểm tra thư mục thư rác của bạn nếu bạn không thấy email này.", + "authorize.step2b.no_mail": "Không nhận được email", + "authorize.step3.recovery": "Phục Hồi Tài Khoản", + "authorize.step3.no_email": "Chúng tôi không tìm thấy địa chỉ email đó. Xin vui lòng cung cấp thêm dữ kiện để giúp tìm lại tài khoản của bạn.", + "authorize.step3.no_code_received": "Có khó khăn trong việc nhận email phục hồi? Điền vào thông tin dưới đây và chúng tôi sẽ liên lạc với bạn trong vòng 48 tiếng.", + "authorize.step3.your_email": "Email của bạn", + "authorize.step3.payment_method": "Phương thức Trả tiền", + "authorize.step3.payment_method_hint": "Chọn phương thức trả tiền khi mua tài khoản Pro trước đây", + "authorize.step3.credit_card": "Thẻ Tín Dụng", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Có bản Pro bằng cách Giới thiệu người bạn", + "authorize.step3.payment_account": "Tài khoản Trả tiền", + "authorize.step3.payment_account_hint": "Điền vào thông tin tài khoản Alipay của bạn", + "authorize.step3.referral_code": "Mã Số Giới Thiệu của bạn", + "authorize.step3.purchase_date": "Ngày Mua", + "authorize.step3.note": "Xin cung cấp thêm các thông tin nào khác có thể giúp chúng tôi tìm lại tài khoản bạn.", + "authorize.step4.title": "Đang Trong Tiến Trình Phục Hồi Tài Khoản", + "authorize.step4.text1": "Cám ơn! Chúng tôi đã nhận được yêu cầu phục hồi tài khoản.", + "authorize.step4.text2": "Xin chờ 48 tiếng để tìm lại thông tin tài khoản Pro của bạn.", + "authorize.step4.text3": "Chúng tôi sẽ gửi thông tin đến địa chỉ email đã điền trong trang trước.", + "authorized.continue": "Tiếp tục qua bản Pro", + "authorized.continue.lantern": "Tiếp tục đến Lantern", + "authorized.text": "Máy này đã được phép dùng tài khoản Lantern Pro!", + "authorized.title": "Máy đã được phép", + "button.account": "Tài khoản", + "button.renew": "Làm mới", + "button.upgrade": "Nâng Cấp", + "button.upgrade_now": "Nâng cấp ngay", + "button.upgrade_to_lantern_pro": "Nâng Cấp lên Lantern Pro", + "button.copy_your_code": "Sao chép mã số của", + "button.try_again": "Thử lại", + "button.continue": "Tiếp tục", + "button.continue_to": "Tiếp tục đến {{planType}}", + "bullet.click_button": "Bấm vào nút dưới đây", + "bullet.paste_code": "Dán mã số & đường tải trong tin nhắn", + "bullet.send_to_friends": "Gửi đến bạn bè", + "cancel": "Hủy bỏ", + "confirm": "Xác nhận", + "norecoveryyinbi": "*Không khôi phục Ví Yinbi", + "email.recovery.check.email": "Kiểm tra email của bạn để tìm thư có Mã khôi phục", + "email.recovery.code.label": "Nhập hoặc dán mã khôi phục", + "email.recovery.no.code": "Không nhận được mã?", + "email.recovery.text": "Nhập email của bạn và chúng tôi sẽ gửi cho bạn một mã để đặt lại mật khẩu.\nNếu bạn có Ví Yinbi, việc này sẽ KHÔNG khôi phục ví Yinbi, để khôi phục Ví Yinbi, hãy nhập Cụm từ khôi phục Yinbi của bạn.", + "email.recovery.desc": "Sử dụng phương pháp này nếu bạn muốn gửi mã khôi phục đến email của mình", + "device.recovery.desc": "Sử dụng phương pháp này nếu bạn đã đăng nhập vào một thiết bị khác và mang theo bên mình", + "google_search": "Tìm kiếm Google", + "giveaway.upgrade": "Nâng cấp để nhận bản miễn phí hôm nay", + "giveaway.title_released_today": "{{formattedTokens}} YNB được phát hành hôm nay", + "giveaway.what_is_it": "Tặng phẩm Yinbi là gì?", + "giveaway.description1": "Nền tảng Yinbi đang tặng 888 tỷ YNB tiền điện tử độc quyền thông qua Lantern cho những người mua Lantern Pro.", + "giveaway.description2": "YNB sẽ được phân phối vào cuối mỗi ngày, dựa trên số lượng Yinbi được phát hành vào ngày hôm đó, số người nâng cấp/gia hạn, và số năm hoặc tài khoản bạn mua. YNB sẽ được gửi trực tiếp vào Ví Yinbi của bạn ở Lantern.", + "giveaway.learn_more": "Tìm hiểu thêm", + "link_device": "Đã có tài khoản Pro? Liên kết thiết bị", + "email.recovery": "Khôi phục Email", + "email_taken": "Email đã đăng ký", + "username_taken": "Tên người dùng đã đăng ký", + "err.unknown_error": "Lỗi không rõ", + "err.internal_error": "Lỗi nội bộ", + "err.bad_input": "Dữ liệu đầu vào sai", + "err.not_authorized": "Không được phép", + "err.user_exists": "Người dùng đã có rồi", + "err.no_such_user": "Không thấy người dùng đó", + "err.user_already_verified": "Người dùng đã kiểm chứng", + "err.invalid_user_verification": "Kiểm chứng người dùng không hợp lệ", + "err.user_unverified": "Người dùng chưa kiểm chứng", + "err.operation_temporarily_unavailable": "Hoạt động tạm thời ngưng", + "err.wrong_or_inexistent_plan": "Gói cước không đúng hoặc không có", + "err.user_has_active_subscription": "Người dùng có tài khoản hợp lệ", + "err.payment_error": "Có lỗi trả tiền", + "err.no_codes_left": "Hết mã số giới thiệu", + "err.wrong_code": "Mã số giới thiệu sai", + "err.redeeming_own_code_not_allowed": "Không được phép dùng mã số của chính mình", + "err.wrong_charge_id": "ID trả tiền không đúng", + "err.wrong_link_code": "Mã liên kết sai", + "err.invalid_credentials": "Thông tin đăng nhập người dùng được cung cấp không hợp lệ", + "footer.reseller": "Muốn kiếm tiền! Trở thành đại lý cho Lantern Pro. Bấm vào đây", + "footer.reseller.email_subject": "Cho biết thêm về Chương Trình Đại Lý Lantern", + "footer.reseller.email_body": "Khi làm Đại Lý cho Lantern, bạn có thể hưởng lên tới 25% khi bán được một tài khoản Lantern Pro. Cho chúng tôi tại sao bạn muốn làm đại lý.", + "feature.faster_speed": "Tốc độ lẹ hơn", + "feature.faster": "Trung tâm dữ liệu nhanh hơn", + "feature.unlimited": "Dung Lượng Không Giới Hạn", + "feature.nologs": "Không có nhật ký", + "feature.devices": "Kết nối tối đa 3 thiết bị", + "feature.noads": "Không có quảng cáo", + "feature.yinbi.tooltip": "Nền tảng Yinbi đang tặng 888 tỷ YNB tiền điện tử độc quyền thông qua Lantern cho những người mua Lantern Pro. YNB sẽ được phân phối vào cuối mỗi ngày, dựa trên số lượng Yinbi được phát hành vào ngày hôm đó, số người nâng cấp/gia hạn và số năm hoặc số tài khoản bạn mua. YNB sẽ được gửi trực tiếp vào Ví Yinbi của bạn trong Lantern!", + "feature.antiblock": "Chống khóa tài khoản", + "feature.data_center": "Trung tâm dữ liệu tốt hơn", + "feature.free_yinbi": "Tiền điện tử Yinbi miễn phí!", + "free.title": "Lantern Pro", + "free.desc": "Nhanh hơn. Mạnh hơn. Không giới hạn. Bảo mật.", + "free.link_account": "Đã có tài khoản Pro? Liên kết tài khoản.", + "home.get_lantern_pro": "Lấy Lantern Pro", + "home.get_lantern_platinum": "Nâng cấp gói của bạn", + "home.welcome_popup_subheader": "Chào mừng bạn đến với Lantern mới!", + "home.welcome_popup_content_1": "Chúng tôi đã làm việc chăm chỉ, cập nhật Lantern và thêm các tính năng mới.", + "home.welcome_popup_content_2": "Trong giao diện người dùng mới của chúng tôi, bạn sẽ tìm thấy thanh tìm kiếm cho phép bạn tìm kiếm các tệp được chia sẻ trên mạng Lantern. Bạn cũng có thể đóng góp nội dung bằng cách tự đăng tệp. Đây là tính năng Beta, vì vậy hãy dùng thử và cho chúng tôi biết suy nghĩ của bạn, chúng tôi sẽ tiếp tục cải tiến dựa trên phản hồi của bạn.", + "home.welcome_popup_button": "Dùng thử", + "input.email": "Email", + "input.your_email": "Email của bạn", + "input.confirm_email": "Xác nhận địa chỉ email", + "input.enter_email": "Điền email của bạn", + "input.use_valid_email": "Cho địa chỉ email hợp lệ", + "input.email_not_match": "Địa chỉ email không giống", + "input.existing_email": "Email hiện có", + "issue.your_email": "Email của bạn", + "issue.attach_image_failure": "Không thể đính kèm hình ảnh", + "issue.try_again": "Xin thử lại", + "issue.select_issue": "Hãy chọn 1 vấn đề", + "issue.selected_issue": "Chọn vấn đề", + "issue.select_issue_hint": "Chọn một vấn đề từ trình đơn thả xuống.", + "issue.note": "Mô tả vấn đề của bạn", + "issue.description": "Mô tả vấn đề", + "issue.error": "Lỗi gửi báo cáo", + "issue.submit": "Gửi báo cáo", + "issue.report_screenshot": "Kéo hình ảnh hoặc nhấp để tải lên ảnh chụp màn hình lên", + "issue.reported": "Cảm ơn bạn đã báo cáo sự cố của mình, chúng tôi sẽ liên hệ lại với bạn qua Email ngay khi có thể", + "issue.report_sent": "Đã gửi báo cáo", + "issue.type.no_access": "Không thể truy cập các trang bị chặn", + "issue.type.payment_fail": "Không thể hoàn thành việc thanh toán", + "issue.type.cannot_login": "Không thẻ đăng nhập", + "issue.type.always_spinning": "Tải trang mãi không dừng", + "issue.type.slow": "chậm", + "issue.type.cannot_link_device": "Không thể liên kết các thiết bị", + "issue.type.crashes": "Xảy ra lổi với Lantern", + "issue.type.other": "Khác", + "languages.title": "Ngôn ngữ", + "lantern.email": "Email của Lantern", + "mobile.link": "Vào liên kết để tải Lantern trên thiết bị Android:", + "mobile.title": "Tải phiên bản cho Android", + "nav.about": "Thông tin", + "nav.account": "Quản Trị Tài Khoản", + "nav.authorize": "Thêm Máy", + "nav.authorized": "Máy Được phép", + "nav.unauthorized_link": "Cho Phép Máy dùng bản Pro", + "nav.language": "Ngôn ngữ", + "nav.lantern": "Lantern", + "nav.mobile": "Lấy Phiên Bản Di Động", + "nav.report_issue": "Báo cáo vấn đề", + "nav.settings": "Thiết đặt", + "nav.support": "Hỗ trợ", + "nav.verify": "Kiểm Chứng Tài Khoản", + "nav.yinbi": "Đổi thưởng Yinbi", + "nav.home": "Trang Chủ", + "nav.discover": "Khám phá", + "nav.wallet": "Ví", + "nav.yinbi_wallet": "Ví Yinbi", + "notification.retry": "Thử lại", + "notifications": "Thông báo", + "notifications.whatisnew": "Có gì mới?", + "password.change": "Đổi mật khẩu", + "password.changed": "Mật khẩu đã được thay đổi", + "continue.to.pro": "Tiếp tục qua bản Pro", + "username": "Tên người dùng", + "password.new": "Mật khẩu mới", + "password.requirements": "
Mật khẩu phải chứa:
  • 8 ký tự trở lên
  • 1 chữ thường
  • 1 chữ in hoa
  • Ít nhất 1 số
  • Không có trong danh sách mật khẩu bị xâm phạm
", + "password.reset": "Đặt lại mật khẩu", + "paxful.buy": "Mua", + "paxful.payment": "Phương thức trả tiền", + "paxful.bitcoin": "Bitcoin (BTC)", + "paxful.tether": "Tether (USDT)", + "paxful.wallet": "Các ví trực tuyến", + "paxful.bank": "Chuyển khoản ngân hàng", + "paxful.gamer_card": "Thẻ Game", + "paxful.gift_card": "Thẻ quà tặng", + "paxful.cash": "Thanh toán tiền mặt", + "paxful.digital_currency": "Tiền kỹ thuật số", + "paxful.button": "Hiển thị các ưu đãi tốt nhất", + "payment.close": "Đóng lại", + "payment.redirectErrorTitle": "Lỗi kết nối với máy chủ thanh toán", + "payment.redirectErrorText": "Chúng tôi hiện đang làm việc để giải quyết vấn đề này. Vui lòng kiểm tra lại sau.", + "payment.wait_for_pro": "Cảm ơn đã mua Lantern Pro! Vui lòng chờ trong giây lát để phiên bản Lantern của bạn tự động cập nhật lên bản Pro.", + "payment.moreOptions": "Thêm tùy chọn", + "payment.fewerOptions": "Bớt tùy chọn", + "payment_methods.select_name": "Chọn phương thức thanh toán", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "Mua Lantern Pro", + "payment_methods.shetab.details.body": "Khi bạn nhấp vào tiếp tục mua hàng, bạn sẽ được chuyển hướng đến trang bên ngoài để hoàn tất thanh toán và lấy mã kích hoạt của bạn.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Tiếp tục mua hàng", + "payment_methods.shetab.details.input_code_button": "Nhập mã kích hoạt", + "plan.step1": "Bước 1", + "plan.apply": "Áp dụng", + "plan.step2": "Bước 2", + "plan.most_popular": "Phổ biến nhất!", + "plan.step3": "Bước 3", + "plan.choose_plan": "Chọn gói", + "plan.enter_email": "Nhập Email", + "plan.choose_method": "Chọn phương thức thanh toán", + "plan.bestValue": "Giá lợi nhất!", + "plan.per_month": "mỗi tháng", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 năm", + "plan.add_referral": "Thêm mã giới thiệu", + "plan.years": "Gói {{years}} năm", + "plan.desc": "{{price}} thanh toán một lần", + "plan.bonus_months": "+ {{bonusMonths}} tháng", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/Năm", + "plan.select": "Chọn", + "plan.two_year": "Hai năm", + "plan.one_year": "Một năm", + "plan.savings": "Tiết kiệm {{formattedDiscount}} %", + "plans.title": "Các Gói Cước Lantern Pro", + "plans.lantern_pro": "Lantern Pro", + "plans.platforms": "Dành cho Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Bạn có mã kích hoạt Lantern Pro? Bấm vào đây.", + "plans.with_voucher_code": "Có mã kích hoạt? Bấm vào đây.", + "pro.apply": "Điểm sẽ được tính vào tài khoản của bạn trong chu kỳ tính tiền kế tiếp.", + "pro.title": "Mời thêm bạn bè, để được bản Pro miễn phí", + "pro.subtitle": "Khi bạn bè mua gói cước hai năm, bạn và người đó sẽ được thêm 3 tháng Pro, gói cước một năm sẽ được thêm 1 tháng Pro miễn phí.", + "pro.share": "Chia sẽ mã số với bạn bè để bắt đầu tích tụ thêm điểm!", + "promotion.title": "Tính Tiền Lantern Pro", + "promotion.title.activation": "Kích hoạt Latern Pro", + "promotion.enter_and_confirm_email": "Xin điền và xác nhận email của bạn", + "promotion.code.hint": "Điền mã giới thiệu của bạn (tùy chọn)", + "promotion.code.label": "Mã Số Giới Thiệu", + "promotion.payment": "Chuyển sang Thanh toán", + "promotion.payment.btc": "Thanh toán bằng ₿", + "promotion.loading": "Đang tải...", + "promotion.howto_1y": "Nếu người bạn chia sẻ mã số giới thiệu với bạn, điền số vào đây để được một tháng Lantern Pro miễn phí sau khi tính tiền xong.", + "promotion.howto_2y": "Nếu người bạn chia sẻ mã số giới thiệu với bạn, điền số vào đây để được ba tháng Lantern Pro miễn phí sau khi tính tiền xong.", + "promotion.pay": "Trả {{amount}}", + "promotion.select": "Chọn", + "promotion.promotion_applied_1y": "+1 tháng thưởng", + "promotion.promotion_applied_2y": "+3 tháng thưởng", + "promotion.too_many_referrals": "Mã số giới thiệu này đã được tính. Ra quầy tính tiền để nhận được thêm các tháng miễn phí.", + "promotion.activation.enter_and_confirm_email": "Vui lòng điền và xác nhận địa chỉ email để đăng ký tài khoản Lantern Pro", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Mã kích hoạt", + "promotion.activation.instructions": "Nhập email của bạn và mã kích hoạt gồm 25 chữ số nhận được từ người bán lại để đăng ký tài khoản của bạn.", + "promotion.activation.howto": "Vui lòng điền mã kích hoạt Lantern Pro gồm 25 ký tự ở trên. Nếu bạn không có mã này, vui lòng mua bản Pro tại màn hình trước hoặc tìm một nhà bán lẻ Lantern Pro trực tuyến.", + "promotion.activation.continue": "Đăng ký Pro", + "promotion.voucher.hint": "Mã kích hoạt", + "promotion.voucher.howto": "Vui lòng nhập mã kích hoạt Fast World Pay gồm 12 ký tự của bạn ở trên", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Lỗi khi đổi mã kích hoạt của bạn.", + "promotion.voucher.error.invalid_code": "Mã kích hoạt không hợp lệ", + "promotion.voucher.error.invalid_plan": "Mã kích hoạt được liên kết với gói không hợp lệ", + "promotion.voucher.error.already_redeemed": "Mã kích hoạt đã được đổi", + "referral.code": "Mã giới thiệu", + "referral.text": "Dùng số %s này của tôi để được 3 tháng miễn phí khi bạn đăng ký!", + "referral.description_free": "Chia sẻ mã của bạn với bạn bè và nhận 1 tháng dịch vụ Lantern Pro miễn phí khi họ mua Pro!", + "referral.description_pro": "Chia sẻ mã của bạn với bạn bè và nhận thêm 1 tháng dịch vụ Lantern Pro miễn phí khi họ mua Pro!", + "register": "Đăng ký", + "renew.subtitle_early": "Gia hạn trong 3 tháng miễn phí!", + "renew.subtitle_last_day": "Gia hạn trong 3 tháng miễn phí!", + "renew.subtitle_expired": "Gia hạn trong 45 ngày miễn phí!", + "renew.details_early": "Tư cách thành viên Lantern Pro của bạn sắp kết thúc. Gia hạn ngay bây giờ và tận hưởng tối đa ba tháng miễn phí!", + "renew.details_last_day": "Tư cách thành viên Lantern Pro của bạn kết thúc hôm nay! Gia hạn ngay bây giờ và tận hưởng tối đa ba tháng miễn phí!", + "renew.details_expired": "Tư cách thành viên Lantern Pro của bạn đã hết hạn. Gia hạn ngay bây giờ và tận hưởng tối đa bốn mươi lăm ngày miễn phí!", + "renew.asterisk_early": "* Ưu đãi có thời hạn này chỉ áp dụng cho những trường hợp gia hạn sớm.", + "renew.asterisk_last_day": "* Đây là cơ hội cuối cùng để bạn nhận được ưu đãi đặc biệt này!", + "renew.asterisk_expired": "* Đây là một ưu đãi trong thời gian có hạn!", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 THÁNG MIỄN PHÍ", + "renew.plan_renewal_bonus_months": "$%d%s + %d THÁNG MIỄN PHÍ", + "renew.plan_renewal_bonus_days": "$%d%s + %d NGÀY MIỄN PHÍ", + "renew.next": "tiếp", + "renew.decline": "Từ chối khuyến mại", + "renew.decline_question": "Bạn có chắc muốn từ chối khuyến mại này?", + "renew.decline_yes": "Gia hạn sau", + "renew.decline_dismiss": "Gia hạn ngay", + "renew.notification_title_30_days": "Gia hạn Pro ngay để tiết kiệm cực nhiều!", + "renew.notification_title_30_days_platinum": "Gia hạn Platinum ngay để tiết kiệm cực nhiều!", + "renew.notification_text_30_days": "Tài khoản {{planName}} của bạn sẽ hết hạn sau {{remainingDays}} ngày nữa. Gia hạn ngay bây giờ và nhận đến 3 tháng miễn phí.", + "renew.notification_title_2_days": "{{planName}} khuyến mại hết vào ngày mai!", + "renew.notification_text_2_days": "Tài khoản {{planName}} của bạn sẽ hết hạn ngày mai. Đừng bỏ lỡ cơ hội giảm giá lớn.", + "renew.notification_title_last_day": "Cơ hội cuối cùng để được giảm giá!", + "renew.notification_text_last_day": "Tài khoản {{planName}} của bạn đã hết hạn. Gia hạn ngay hôm nay và tận hưởng thêm tới 3 tháng miễn phí.", + "replica.upload": "Tải lên", + "replica.favorite": "Yêu thích", + "replica.added_to_favorites": "Đã thêm vào Yêu thích", + "replica.filedrop_error": "Lỗi khi tải lên tệp này", + "replica.filedrop_error.file-too-large": "Kích thước tệp tối đa được phép là {{fileSize}}", + "replica.filedrop_error.file-too-small": "Tệp quá nhỏ", + "replica.filedrop_error.too-many-files": "Có quá nhiều tệp", + "replica.filedrop_error.file-invalid-type": "Loại tệp này hiện không được hỗ trợ", + "replica.filedrop_remove_file": "Xóa khỏi hàng đợi", + "replica.post": "Tải tệp lên", + "replica.relevance": "Liên quan", + "replica.upload_date": "Ngày tải lên", + "replica.gallery_view": "Xem thư viện", + "replica.list_view": "Xem danh sách", + "replica.copy_lantern_link": "Sao chép liên kết Lantern", + "replica.documents": "Tài liệu", + "replica.audio": "Âm thanh", + "replica.application": "Ứng dụng", + "replica.image": "Hình ảnh", + "replica.video": "Video", + "replica.web": "Web", + "replica.news": "Tin tức", + "replica.upload_alert.dont_show": "Không hiển thị lại", + "replica.upload_alert.cancel": "Hủy tải lên", + "replica.upload_alert.resume": "Tiếp tục Tải lên", + "replica.upload_alert.info": "Thông tin quan trọng!", + "replica.upload_alert.desc1": "Các tệp được tải lên Lantern được phân phối và phi tập trung. Khi các tệp này được người dùng khác truy cập, không ai có thể xóa các tệp này khỏi mạng, kể cả Lantern, ngay cả khi chúng bị xóa khỏi danh sách 'Tệp của tôi' của bạn.", + "replica.upload_alert.desc2": "Vui lòng không sử dụng thông tin nhận dạng cá nhân trong tệp hoặc tên tệp khi tải lên nội dung nhạy cảm.", + "replica.add_details": "Thêm chi tiết", + "replica.cannot_edit": "Tên tệp không thể chỉnh sửa sau khi xuất bản.", + "replica.next": "Tiếp theo", + "replica.previous": "Trước", + "replica.selectAll": "Chọn tất cả", + "replica.search_replica": "Tìm kiếm", + "replica.search_results_info": "Tab này chỉ hiển thị kết quả của Lantern.", + "replica.search_results_info_message": "Kết quả của Lantern bao gồm nội dung do người dùng tải lên mạng Lantern.", + "replica.no_files_found": "Không có kết quả", + "replica.or_content": "nội dung của riêng bạn để người khác tìm thấy!", + "replica.try_again": "Hãy thử một từ khóa khác, hoặc", + "replica.upload_success": "Tải lên thành công!", + "replica.cannot_preview": "Không có bản xem trước cho loại tệp này", + "replica.no_description": "Không có mô tả được cung cấp", + "replica.size": "Kích thước", + "replica.uploaded": "Đã tải lên", + "replica.invalid_link": "Liên kết không hợp lệ", + "replica.close": "Đóng lại", + "replica.files": "Tệp", + "replica.upload_history": "Lịch sử tải lên", + "replica.my_favorites": "Yêu thích", + "replica.no_uploads": "Chưa có tải lên", + "replica.no_favorites": "Chưa có mục Yêu thích", + "replica.mime_type": "Loại tệp: {{mime}}", + "replica.image_loading_error": "Lỗi khi tải hình ảnh", + "replica.play": "Phát", + "replica.pause": "Dừng", + "replica.scrub": "Scrub", + "replica.skip_forward": "Bỏ qua đi tiếp", + "replica.skip_backwards": "Bỏ qua quay lại", + "replica.trending_videos": "Video thịnh hành", + "replica.file_uploaded": "Đã tải lên: {{days}} ngày trước", + "replica.file_size": "Kích thước", + "replica.duration": "Thời lượng", + "replica.filename": "Tên tệp", + "replica.filename_required": "Đặt tên tệp của bạn", + "replica.description_optional": "Thêm mô tả", + "replica.expand": "Mở rộng chi tiết", + "replica.filetype": "Loại tệp", + "replica.sortby": "Sắp xếp theo", + "replica.link": "Liên kết bản sao", + "replica.collapse": "Thu gọn", + "replica.publish": "Xuất bản", + "replica.cancel": "Hủy bỏ", + "replica.progress_current_upload": "Tải lên", + "replica.progress_files": "tệp", + "replica.progress_of": "của", + "replica.progress_upload_complete": "Hoàn thành", + "replica.progress_upload_failure": "Tải lên không thành công, vui lòng thử lại.", + "replica.upload_in_progress": "Đang tải lên", + "replica.upload_pending": "Đang chờ tải lên", + "replica.upload_error": "Lỗi tải lên", + "replica.upload_cancel": "Hủy tải lên", + "replica.upload_confirm": "Bạn có chắc chắn muốn hủy tải lên không?", + "replica.progress_view": "Xem", + "replica.delete": "Xóa", + "replica.remove": "Xóa bỏ", + "replica.delete_file": "Xóa tệp", + "replica.remove_favorite": "Gỡ bỏ khỏi mục Yêu thích", + "replica.failed_to_delete": "Không xóa được", + "replica.failed_to_remove": "Gỡ bỏ không thành công", + "replica.link_lookup_failure": "Không tìm thấy liên kết", + "replica.delete_file_confirmation_1": "Bạn có chắc chắn muốn xóa", + "replica.delete_file_confirmation_2": "từ tải lên của bạn", + "replica.remove_favorite_confirmation_1": "Bạn có chắc chắn muốn gỡ", + "replica.remove_favorite_confirmation_2": "khỏi yêu thích của bạn?", + "replica.share_file": "Chia sẻ tệp", + "replica.download_and_view": "Tải xuống/Xem", + "replica.download": "Tải xuống", + "replica.copy_link": "Sao chép liên kết bản sao", + "replica.find_file": "Tìm tập tin", + "replica.file_drop_prompt": "Thả tệp để bắt đầu tải lên!", + "replica.empty_uploads_text1": "Nhấn", + "replica.empty_uploads_text2": "tại đây", + "replica.empty_uploads_text3": "để tạo bài viết đầu tiên của bạn.", + "replica.error_header": "Ôi trời", + "replica.error": "Có lỗi xảy ra khi xử lý yêu cầu của bạn. Vui lòng thử lại.", + "replica.serp_empty": "Google đã không trả lại bất kỳ kết quả nào cho truy vấn này.", + "replica.disclaimer": "Lantern ẩn danh các tìm kiếm của bạn và bảo vệ chúng khỏi các bên thứ ba", + "settings.general": "Chung", + "settings.feedback": "Phản hồi", + "settings.autoLaunch": "Khởi động Lantern cung với hệ thống", + "settings.autoReport": "Báo cáo thống kê sử dụng một cách an toàn để đóng góp cho Lantern", + "settings.lantern_ads": "Hiển thị Quảng cáo Lantern", + "settings.lantern_ads_tooltip": "Lantern hiển thị cho bạn quảng cáo trên một số trang web để giúp hỗ trợ dịch vụ của chúng tôi. Không có thông tin người dùng nào được thu thập hoặc chuyển đến máy chủ của chúng tôi. Nếu bạn tắt tùy chọn này, bạn vẫn có thể thấy quảng cáo, nhưng những quảng cáo đó không đến từ mạng Lantern.", + "settings.proxyAll": "Proxy tất cả lưu lượng", + "settings.proxyAllHelpTitle": "\"PROXY TẤT CẢ LƯU LƯỢNG\" LÀ LÀM GÌ?", + "settings.proxyAllHelp1": "Nếu bật tính năng này, tất cả các gói tin đều được gửi qua Lantern (tùy chọn Bảo mật nhất).", + "settings.proxyAllHelp2": "Nếu tắt tính năng này, chỉ các gói tin bị chặn sẽ gửi qua Lantern (tùy chọn nhanh nhất, thông dụng nhất).", + "settings.show_advanced": "Hiển thị cài đặt nâng cao", + "settings.hide_advanced": "Ẩn cài đặt nâng cao", + "settings.systemProxy": "Quản trị proxy hệ thống", + "settings.title": "Thiết đặt", + "settings.http_proxy": "HTTP(S) proxy:", + "settings.socks_proxy": "SOCKS proxy:", + "settings.caution": "Cảnh báo:", + "settings.caution_text": "Khi mà bạn bỏ chọn \"Quản lý Proxy của Hệ thống\", trình duyệt và ứng dụng của bạn của bạn sẻ không thể sư dụng Latern một cách tự động được nửa. Nếu bạn biết làm thế nào để tự cấu hình những cài đặt này dựa vào những thông tin ở trên.", + "settings.select_language": "Chọn ngôn ngữ", + "settings.diagnostics": "Đính kèm thông tin chẩn đoán", + "settings.diagnostics_tooltip": "Việc đính kèm thông tin chẩn đoán sẽ gửi dữ liệu nhóm Lantern được thu thập từ kết nối của bạn. Điều này sẽ giúp chúng tôi tăng khả năng xác định và giải quyết vấn đề của bạn.", + "status.lantern": "Lantern là", + "status.click_reconnect": "Bấm vào đây để kết nối lại", + "status.server_location": "Địa chỉ Server", + "status.tooltip1": "Lantern lựa chọn server một cách thông minh để kết nối bạn với các trung tâm dữ liệu tốt nhất của chúng tôi.", + "status.tooltip2": "Nâng cấp lên Lantern Pro để có tốc độ nhanh hơn với lựa chọn máy chủ được tối ưu hóa từ các trung tâm dữ liệu Lantern Pro độc quyền của chúng tôi", + "status.protected_connection": "Kết nối của bạn được bảo vệ", + "status.please_wait": "Quá trình này có thể mất một hoặc hai phút...", + "status.connecting": "Đang kết nối...", + "status.no_internet": "Tắt", + "status.no_internet_connection": "Không có kết nối Internet", + "status.connected": "Bật", + "status.disconnected": "Tắt", + "status.throttled": "Hạn chế tốc độ (giới hạn lưu lượng)", + "status.no_system_proxy": "{{status}}, không quản lý proxy hệ thống", + "status.fail_to_set_system_proxy": "Không đặt được Lantern làm proxy hệ thống", + "status.fail_to_open_browser": "Không mở được cửa sổ trình duyệt để hiển thị giao diện người dùng Lantern", + "support.forum": "Diễn đàn người dùng Lantern", + "support.faq": "FAQ", + "terms_of_service.acknowledgment": "Bằng cách nhấn vào {{buttonText}} , bạn đồng ý với Điều khoản dịch vụ của chúng tôi", + "terms_of_service.replica": "Bằng cách tìm kiếm, tải lên hoặc sử dụng sản phẩm của chúng tôi theo bất kỳ cách nào, bạn đồng ý với Điều khoản dịch vụ, Chính sách quyền riêng tưChính sách bản quyền DMCA của chúng tôi", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Nhập hoặc dán mã pin liên kết thiết bị", + "verify.code": "Mã Số Kết Nối Máy", + "verify.howto_1": "Nếu bạn có tài khoản Lantern Pro trên máy khác, điền vào địa chỉ email nơi đây để nhận mã số cho phép sử dụng", + "verify.howto_1a": "Bạn chưa được phép dùng bản Pro. Xin điền vào địa chỉ email để được phép dùng tài khoản Pro. Thao tác này cho phép bạn kết nối nhiều máy.", + "verify.howto_2": "Để liên kết thiết bị với tài khoản Pro của bạn:", + "verify.howto_3": "1. Chọn ‘Cấp phép thiết bị cho Pro' từ Menu của thiết bị khác của bạn.", + "verify.howto_4": "2. Nhập mã pin liên kết có được từ bước 1 và gửi.", + "verify.reminder": "*Đảm bảo cả hai thiết bị đang chạy phiên bản Lantern mới nhất", + "verify.enter_pin": "Nhập hoặc dán mã pin liên kết thiết bị", + "verify.submit": "Nộp", + "verify.title": "Kiểm Chứng Tài Khoản", + "welcomeToPro.continue": "Tiếp tục qua bản Pro", + "welcomeToPro.invite": "Mời bạn bè tham gia, sau đó bạn và họ sẽ được 3 tháng miễn phí khi họ mua gói cước hai-năm, còn mua gói cước một năm thì sẽ được 1 tháng miễn phí. Hãy mời ngay!", + "welcomeToPro.thanks": "Bây giờ bạn có quyền truy cập không giới hạn bằng cách sử dụng các trung tâm dữ liệu nhanh nhất của chúng tôi. Có thể kết nối tối đa ba thiết bị với tài khoản của bạn.", + "welcomeToPro.title": "Chào mừng bạn đến với Lantern Pro", + "welomeToPro.title_exclamation": "Chào mừng đến với Lantern Pro!", + "purchase.failed": "Mua không thành công. Vui lòng thử lại.", + "purchase.success": "Mua thành công", + "purchase.success_title": "Chào mừng đến với Lantern {{planType}}!", + "purchase.success_content_pro": "Bây giờ bạn có quyền truy cập không giới hạn bằng cách sử dụng các trung tâm dữ liệu nhanh nhất của chúng tôi. Có thể kết nối tối đa ba thiết bị với tài khoản của bạn.", + "purchase.success_content_platinum": "Bây giờ bạn có quyền truy cập không giới hạn bằng cách sử dụng các đường truyền chuyên dụng và trung tâm dữ liệu nhanh nhất của chúng tôi. Có thể kết nối tối đa ba thiết bị với tài khoản của bạn.", + "welcomeToPro.description": "Giờ đây, bạn có quyền truy cập không hạn chế vào các trang web và dịch vụ bị chặn", + "messages.copied_to_clipboard": "Mã số được chép. Chia sẻ chúng với bạn bè!", + "messages.datacap": "Bạn đã dùng hết dung lượng miễn phí tốc độ cao. Nâng cấp lên bản Pro để có dung lượng tốc độ cao không giới hạn.", + "messages.fatal_error": "Xin lỗi, chúng tôi gặp khó khăn kết nối máy chủ Lantern. Xin xem lại đường dây nối mạng của bạn và thử lại.", + "messages.backend_gone": "Xin lỗi, Lantern dường như không chạy. Xin khởi động lại Lantern và thử lại.", + "messages.get_help": "Nhận trợ giúp", + "freeProCredits.title": "Mời Bạn Bè", + "freeProCredits.shareWithFriends": "Chia sẻ mã số với bạn bè để được thêm các tháng miễn phí!", + "freeProCredits.shareWithFriendsDesc": "Khi bạn bè mua gói cước hai năm, bạn và họ sẽ được 3 tháng miễn phí, gói cước một năm sẽ được 1 tháng miễn phí.", + "cards.serverLocation.unknown": "Không rõ", + "cards.serverLocation.description": "Địa chỉ Server tối ưu", + "cards.serverLocation.description-free": "Địa chỉ Server", + "cards.serverLocation.description-upgrade": "Nâng cấp lên Server tốc độ cao hơn", + "cards.serverLocation.title": "Địa chỉ hiện tại:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern lựa chọn server một cách thông minh để tự động tìm kết nối nhanh nhất có thể từ các trung tâm dữ liệu của chúng tôi tại Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore và hơn thế nữa.", + "cards.serverLocation.text-free": "Lantern lựa chọn server một cách thông minh để kết nối bạn với các trung tâm dữ liệu tốt nhất của chúng tôi.", + "cards.serverLocation.upgrade-link": "Nâng cấp lên Lantern Pro để có tốc dộ cao hơn, lựa chọn server tối ưu từ các trung tâm dữ liệu Lantern Pro riêng biệt.", + "cards.httpsUpgrades.description": "Nâng cấp HTTPS", + "cards.httpsUpgrades.title": "Nâng cấp HTTPS: %d", + "cards.httpsUpgrades.text": "Khi có thể, Lantern tự động nâng cấp các kết nối HTTP thiếu bảo mật lên các kết nối HTTPS được mã hóa, để bảo đảm tính riêng tư cho thông tin của bạn khi lướt web.", + "cards.adsBlocked.description": "Chặn quảng cáo", + "cards.adsBlocked.title": "Quảng cáo bị chặn: %d", + "cards.adsBlocked.text": "Lantern chặn các quảng cáo khó chịu để tăng tốc thời gian tải trang, tiết kiệm băng thông, và đem lại cho bạn trải nghiệm lướt web mượt mà hơn.", + "cards.dataUsage.description": "Sử dụng dữ liệu", + "cards.dataUsage.upgrade": "Nâng cấp ngay", + "cards.dataUsage.mb-used": "Bạn đã dùng hết %d/%dMB trong số dung lượng tốc độ cao hàng tháng.", + "cards.dataUsage.upgrade-link": "Nâng cấp ngay để tận hưởng dịch vụ tốc độ cao không giới hạn!", + "cards.subscription.description": "Thuê bao Pro", + "cards.subscription.renew": "Làm mới", + "cards.subscription.months": "Bạn còn %d tháng Lantern Pro trong thời gian thuê bao của mình.", + "cards.subscription.days": "Bạn còn %d ngày Lantern Pro ltrong thời gian thuê bao của mình.", + "cards.subscription.unit.months": "TH", + "cards.subscription.unit.days": "NGÀY", + "cards.subscription.renew-link": "Gia hạn thuê bao để sử dụng thêm", + "auth.email": "Email", + "auth.username": "Tên người dùng", + "auth.username.or.email": "Tên người dùng hoặc email", + "auth.signin": "Đăng nhập", + "current.password": "Mật khẩu hiện tại", + "new.password": "Mật khẩu mới", + "auth.change.password": "Đổi mật khẩu", + "confirm.new.password": "Xác nhận mật khẩu mới", + "auth.password": "Mật khẩu", + "auth.have.recovery.phrase": "Có một cụm từ khôi phục?", + "auth.forgot.password": "Quên hoặc không có mật khẩu?", + "auth.create.account": "Tạo tài khoản", + "auth.missing.username": "Thiếu tên người dùng", + "auth.missing.current.password": "Thiếu mật khẩu hiện tại", + "auth.missing.new.password": "Thiếu mật khẩu mới", + "auth.missing.confirm.password": "Thiếu mật khẩu xác nhận", + "invalid_credentials": "Thông tin không hợp lệ", + "yinbi.wallet": "Ví Yinbi", + "create.wallet": "Tạo ví", + "new.to.yinbi": "Mới sử dụng Yinbi?", + "setup.wallet": "Đúng, hãy thiết lập ví mới!", + "web.wallet": "Không, tôi có một Ví trên Trang web Yin.bi", + "yinbi.next": "Tiếp theo", + "yinbi.amount": "Số tiền", + "yinbi.missing.address": "Không có địa chỉ đích được cung cấp", + "yinbi.missing.amount": "Không có số tiền được chỉ định", + "yinbi.missing.email": "Không có địa chỉ email được chỉ định", + "yinbi.missing.username": "Không có tên người dùng được chỉ định", + "yinbi.missing.password": "Không có mật khẩu được chỉ định", + "yinbi.invalid.address": "{{destination}} không phải là địa chỉ Stellar hợp lệ", + "yinbi.send": "Gửi", + "yinbi.to": "Đến:", + "yinbi.try_again": "Thử lại?", + "yinbi.success.transaction": "Giao dịch thành công!", + "yinbi.failure.transaction": "Giao dịch không thành công", + "yinbi.confirm.transaction": "Xác nhận giao dịch", + "yinbi.sent.details": "Bạn đã gửi {{amount}} YNB tới {{destination}}", + "yinbi.sent.failure.details": "Giao dịch của bạn không thành công vì những lý do sau:", + "yinbi.recipient": "Người nhận", + "yinbi.available.send": "Bạn có {{balance}} YNB có sẵn để gửi", + "yinbi.wallet.header": "Ví", + "yinbi.send.header": "Gửi Yinbi", + "yinbi.recovery.phrase": "Cụm từ khôi phục Yinbi", + "yinbi.recover.account": "Nhập hoặc dán Cụm từ khôi phục Yinbi của bạn để khôi phục Ví Yinbi và tài khoản Lantern của bạn", + "yinbi.recovery.desc": "Sử dụng phương pháp này nếu bạn muốn đăng nhập vào Ví Yinbi ngoài tài khoản Lantern của mình", + "yinbi.redeem.codes": "Đổi thưởng hàng loạt mã Yinbi", + "yinbi.obtain.codes": "Bạn có thể lấy số lượng lớn mã Đổi thưởng Yinbi từ reseller.lantern.io", + "yinbi.receive.header": "Nhận Yinbi", + "yinbi.this.is.your.wallet": "Đây là địa chỉ ví Yinbi của bạn, nơi mọi người có thể gửi YNB cho bạn.", + "yinbi.your.address": "Địa chỉ của bạn", + "yinbi.no.activity.header": "Không hoạt động", + "yinbi.upgrade.pro.button": "Nâng cấp lên Pro và nhận Yinbi miễn phí", + "yinbi.renew.pro.button": "Gia hạn Pro và Nhận Yinbi miễn phí", + "yinbi.wallet.activity_header": "Hoạt động", + "yinbi.wallet.send": "Gửi", + "yinbi.wallet.receive": "Nhận", + "yinbi.wallet.balance": "Số dư", + "yinbi.wallet.getlantern.pro": "Nhận Lantern Pro + Yinbi miễn phí", + "yinbi.redemption.codes": "Mã đổi thưởng Yinbi", + "redeem_codes.title": "Đổi thưởng mã Yinbi", + "redeem_codes.redeem_button_text": "Đổi thưởng", + "redeem_codes.cancel_button_text": "Hủy bỏ", + "redeem_codes.success": "Thành công", + "redeem_codes.errors.missing_codes": "Không có mã hợp lệ nào được nhập", + "redeem_codes.errors.invalid_codes": "Lỗi, vui lòng kiểm tra các mã được đánh dấu. Các mã bị gạch chéo đã hết hạn và không thể đổi được nữa.", + "yinbi.new.account.text": "Sau khi bạn gửi hoặc nhận Yinbi, các giao dịch của bạn sẽ xuất hiện ở đây.", + "yinbi.createAccount": "Tạo tài khoản", + "yinbi.confirm.account.text": "Để đảm bảo rằng bạn đã viết cụm từ chính xác, vui lòng nhập các từ sau từ cụm từ khôi phục của bạn", + "create_account.invalid_words.error": "Các từ đã nhập không khớp với các từ của cụm mật khẩu khôi phục", + "yinbi.recovery_text": "Đây là Cụm từ khôi phục ví Yinbi của bạn. Đây là cách DUY NHẤT để khôi phục Ví Yinbi của bạn\ntrong trường hợp quên mật khẩu. Sử dụng trình quản lý mật khẩu hoặc tạo bản cứng khi\nlưu trữ cụm từ này.", + "yinbi.recovery_confirm_text": "Đây là Cụm từ khôi phục ví Yinbi của bạn. Đây là cách DUY NHẤT để khôi phục Ví Yinbi của bạn trong trường hợp quên mật khẩu. Sử dụng trình quản lý mật khẩu hoặc tạo bản cứng khi lưu trữ cụm từ này.", + "yinbi.import.wallet": "Nhập khẩu Ví", + "yinbi.setup.wallet": "Thiết lập Ví", + "yinbi.importWallet": "Nhập ví Yin.bi", + "yinbi.import.wallet.continue": "Tiếp tục đến Ví của bạn", + "yinbi.import.wallet.success": "Nhập khẩu Ví thành công!", + "yinbi.wallet.text": "Để truy cập vào Ví Yinbi, bạn có thể Tạo tài khoản, Đăng nhập hoặc Nhập khẩu ví của mình từ Yin.bi nếu bạn đã đăng ký trên trang web Yin.bi trước đó.", + "yinbi.wallet.pro.text": "Để truy cập Ví Yinbi, bạn có thể Tạo tài khoản, Nhập khẩu ví từ Yin.bi nếu bạn đã đăng ký trước đó.", + "yinbi.recovery_subheader": "Cụm từ khôi phục ví Yinbi", + "yinbi.import_wallet.subheader": "Nhập ví Yinbi", + "yinbi.import_wallet.text": "Đăng nhập bằng thông tin đăng nhập Yin.bi của bạn để chuyển ví của bạn sang Lantern", + "yinbi.import_wallet.success": "Ví của bạn đã được nhập thành công, vui lòng thêm email của bạn để hoàn tất đăng ký tài khoản.", + "yinbi.import_wallet.success_subheader": "Nhập thành công!", + "yinbi.import_wallet.button": "Nhập ví Yin.bi", + "yinbi.import_wallet.success_button": "Hoàn tất đăng ký", + "yinbi.recovery_passphrase.label_text": "Cụm từ khôi phục", + "yinbi.recovery_passphrase.copy_button_text": "Sao chép", + "terms_of_service.notice": "Chú ý", + "terms_of_service.i_agree": "Tôi đồng ý", + "platinum": "Platinum", + "platinum.one_year": "Báo giá 1 năm", + "platinum.two_years": "Báo giá 2 năm", + "platinum.save": "Tiết kiệm lên đến {{savings}}%!", + "platinum.unlimited": "Dung Lượng Không Giới Hạn", + "platinum.logs": "Không có nhật ký", + "platinum.devices": "Kết nối tối đa 3 thiết bị", + "platinum.everything_in_pro": "Mọi thứ có trong Pro", + "platinum.faster_data": "Trung tâm dữ liệu nhanh hơn", + "platinum.dedicated": "Đường truyền chuyên dụng", + "platinum.reliability": "Tăng độ tin cậy", + "platinum.platinum_one_year": "Lantern Platinum 1 năm", + "platinum.platinum_two_years": "Lantern Platinum 2 năm", + "platinum.pro_one_year": "Lantern Pro 1 năm", + "platinum.pro_two_years": "Lantern Pro 2 năm", + "platinum.total": "Tổng", + "platinum.free": "Miễn phí", + "platinum.credit.days": "+ {{ days }} ngày", + "platinum.credit.months": "{{ months }} tháng", + "platinum.upgrade": "Nâng cấp lên Platinum", + "platinum.upgrade_details": "Đường truyền chuyên dụng + Trung tâm dữ liệu nhanh hơn!", + "platinum.unused_time_disclaimer": "Người dùng Pro nâng cấp lên Platinum sẽ thấy đăng ký Pro đã chuyển đổi của họ được liệt kê dưới dạng thời gian thêm ở trên.", + "p2p.opt_in_description": "Sử dụng mạng internet của bạn để giúp mọi người truy cập internet không bị kiểm duyệt", + "p2p.active_sharing_description": "Chia sẻ mạng internet của bạn đang bật", + "p2p.dialog.title": "Chia sẻ truy cập internet", + "p2p.dialog.text.1": "Giúp những người khác có quyền truy cập hạn chế vào Internet bằng cách chia sẻ kết nối mạng của bạn. Bằng cách cho phép truy cập internet, bạn sẽ là một phần của mạng lưới các tình nguyện viên giúp mở rộng internet hơn.", + "p2p.dialog.text.2": "Chia sẻ sẽ không ảnh hưởng đến danh tính hoặc sự an toàn của bạn. Bạn có thể ngừng chia sẻ internet của mình bất cứ khi nào bạn muốn.", + "p2p.dialog.yes_button": "CÓ, BẮT ĐẦU CHIA SẺ", + "p2p.dialog.no_button": "HỦY BỎ", + "p2p.banner.introducing": "GIỚI THIỆU", + "top_sites.top_sites": "Các trang web hàng đầu" +} \ No newline at end of file diff --git a/locale/translation/zh-CN.json b/locale/translation/zh-CN.json new file mode 100644 index 000000000..bffca440d --- /dev/null +++ b/locale/translation/zh-CN.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "蓝灯", + "pro": "Pro", + "BEAM": "小手电", + "TRAY_STATUS": "状态: %v", + "TRAY_CONNECT": "连接", + "TRAY_DISCONNECT": "断开", + "TRAY_SHOW": "显示%s", + "TRAY_UPGRADE_TO_PRO": "升级到专业版", + "TRAY_QUIT": "退出%s", + "BACKEND_DATA_TITLE": "高速流量仅剩%s", + "BACKEND_DATA_MESSAGE": "请升级到%s专业版继续使用高速流量!", + "BACKEND_DATA_PERCENT_TITLE": "高速流量已使用 %s %s", + "BACKEND_DATA_PERCENT_MESSAGE": "您已经使用本月高速流量 %s %s。立刻升级!", + "BACKEND_CLICK_LABEL": "打开", + "BACKEND_CLICK_LABEL_OPEN": "打开", + "BACKEND_CLICK_LABEL_HELP": "帮助", + "BACKEND_CLICK_LABEL_GOT_IT": "明白了", + "BACKEND_AUTOUPDATED_TITLE": "更新 %s到版本 %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s 已经下载完成. 请重启 %s 即可使用.", + "BACKEND_MITM_INSTALL_CERT": "%s 希望安装定制证书以改善性能", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "请允许 %v对您的系统进行更改", + "BACKEND_ALERT_TITLE": "严重告警提请您关注", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s 请求你授权安装诊断工具,以改进%s的使用体验。", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Unable to save configuration", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Unable to save application configuration. %s cannot guarantee that traffic will be correctly proxied.", + "about.content": "蓝灯能帮助你快速、可靠、安全地访问互联网。", + "app.error": "啊呀,出现一些问题!", + "about.faq": "阅读蓝灯常见问题", + "about.open": "人人可享的真互联网", + "about.questions": "有疑问?", + "about.title": "关于", + "account.add.password": "添加账户密码", + "account.agree.terms": "I understand that losing my password means losing\naccount access. Lantern cannot help you recover\nyour password.", + "account.agree.terms.error": "Must first agree to terms", + "account.cancel": "取消专业版账户", + "account.created": "账号建立成功", + "account.create.pro.account.header": "Create Pro Account", + "account.create.pro.account.text": "Lantern is changing the way user accounts are handled. From now on Pro users will need to create a username and password. These credentials will be used to sign in to other devices, and provide access to new features.", + "account.have.a.account": "Have an Account?", + "account.link.username.pro": "Link username to Pro Account", + "account.recovery": "邮箱登陆", + "account.recovery.link.device": "授权设备", + "account.recovery.device.code": "动态授权码", + "account.recovery.device.enter.code": "输入或粘贴验证码", + "account.recovery.device.instructions.header": "授权这台设备使用您的专业版帐户", + "account.recovery.device.instructions.step.one": "请到电脑专业版账户管理界面或手机专业版菜单选择“授权设备”", + "account.recovery.device.instructions.step.two": "2. 输入设备的授权码,并提交。", + "account.recovery.device.instructions.part.three": "*请确保两台设备都使用最新版本", + "account.recovery.method": "请选择授权设备的方式", + "account.recovery.send.email": "发送电子邮件", + "account.recovery.submit": "提交", + "account.recovery.success": "授权成功!", + "account.pro_management": "专业版账户管理", + "account.free_management": "账号管理", + "account.free.cap": "本月高速流量只剩下{{mb}},高速流量将在{{reset}}重置。", + "account.free.cap.upgrade": "升级到专业版来享受无限的高速流量", + "account.freelink.validFor": "%s 内有效", + "account.freelink.desc": "授权这台设备使用您的专业版帐户", + "account.freelink.step1": "在已登陆专业版的设备上点击“授权其他设备使用专业版”", + "account.freelink.step2": "2. 输入设备的授权码,并提交。", + "account.freelink.reminder": "*请确保两台设备都使用最新版本", + "account.freelink.errorTitle": "授权失败", + "account.freelink.errorText": "您在专业版设备上输入正确的授权码了吗?", + "account.freelink.headerDesc": "授权这台设备使用您的专业版帐户", + "account.freelink.title": "动态授权码", + "account.pro.charge": "您的账户将自动在您的结算周期结束时为下一年的蓝灯专业版付费。", + "account.upgrade_pro": "升级到专业版", + "account.upgrade": "升级", + "account.upgrade_platinum": "升级为白金版", + "account.create": "创建账号", + "account.email": "电子邮件", + "account.confirm.password": "确认密码", + "account.password": "密码", + "account.pro.email": "电子邮件", + "account.pro.expiration": "专业版到期日", + "account.platinum.expiration": "白金账户到期时间", + "account.pro.expired": "你的蓝灯专业版账号已过期。现在就续期,享受无限制的高速流量。", + "account.pro.expiry": "您的专业版账户将在 %s 天后,即 %s 过期。", + "account.pro.bonusMonths": "这包括您的 {{bonusMonths}} 奖金月!", + "account.pro.thisdevice": "(此设备)", + "account.pro.logout": "退出登录", + "account.pro.removedevice": "解绑", + "account.pro.devices": "蓝灯专业版(最多3台设备)", + "account.pro.device.confirm.title": "取消设备绑定", + "account.pro.device.confirm": "您确定不再需要让此设备使用专业版帐户吗?", + "account.pro.device.one.title": "最后一台设备", + "account.pro.device.one": "这是你的专业版帐户绑定的惟一一台设备,不能解绑", + "account.pro.linkingcode": "动态授权码", + "account.pro.renew": "续订专业版账户", + "account.platinum.renew": "更新白金版账户", + "account.pro.renew_CN": "Renew", + "account.prolink.errorTitle": "授权失败", + "account.prolink.errorText": "您的授权码是否正确?", + "account.prolink.successTitle": "设备已授权", + "account.prolink.successText": "授权成功。请等待您的设备自动成为专业版。", + "account.signin": "登录", + "account.signout": "退出登录", + "account.submit": "提交", + "account.username": "用户名", + "account.switch.to.register": "Switch to Create Account", + "account.switch.to.signin": "Switch to Sign In", + "account.invalid.username": "用户名错误", + "account.invalid.email": "Email错误", + "account.password.mismatch": "确认密码和密码不对应。", + "account.password.short": "密码太短。", + "account.password.lowercase": "密码必须有小写字母。", + "account.password.uppercase": "密码必须有大写字母。", + "account.password.number": "密码必须有数字", + "account.password.compromised": "密码不能在已经被泄漏的密码中", + "modal.register.free.header": "注册或登录以访问隐币钱包", + "modal.register.pro.header": "添加账号密码以访问隐币钱包", + "modal.register.pro.signin.header": "Sign in to access Yinbi Wallet", + "modal.register.free.text": "您须通过蓝灯账户使用隐币钱包, 请点击注册或\n登录继续使用。", + "modal.register.pro.text": "请为您的蓝灯账户添加密码以继续使用隐币钱包。", + "modal.register.pro.signin.text": "To use the Yinbi wallet you must sign in to your Lantern account", + "adyen.paymentMethods.title": "支付方式", + "adyen.paymentMethods.storedMethods": "您的支付方式", + "adyen.paymentMethods.otherMethods": "选择其他方式", + "adyen.paymentMethods.moreMethodsButton": "更多支付方式", + "adyen.payButton": "支付", + "adyen.payButton.formatted": "支付 %@", + "adyen.cancelButton": "取消", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "下次继续使用这些信息", + "adyen.payment.redirecting": "你将会被重定向", + "adyen.payment.processing": "支付处理中", + "adyen.creditCard.title": "信用卡详情", + "adyen.creditCard.holderName": "持卡人姓名", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "卡号", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "卡号无效", + "adyen.creditCard.expiryDateField.title": "到期时间", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "到期时间无效", + "adyen.creditCard.expiryDateField.month": "月", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "年", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "计划分期数", + "adyen.creditCard.storeDetailsButton": "下次付款时自动选择这张卡", + "adyen.creditCard.oneClickVerification.title": "验证信用卡", + "adyen.creditCard.oneClickVerification.message": "请输入%@的CVC码", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC码无效", + "adyen.creditCard.oneClickVerification.invalidInput.message": "请输入有效的CVC码", + "adyen.sepaDirectDebit.ibanField.title": "帐号 (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "帐号无效", + "adyen.sepaDirectDebit.nameField.title": "持有人名称", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "我同意以下金额将从我的银行帐户中扣除。", + "adyen.sepa.ownerName": "持有人名称", + "adyen.sepa.ibanNumber": "帐号 (IBAN)", + "adyen.giropay.searchField.placeholder": "银行名称 / BIC代码", + "adyen.giropay.minimumLength": "最少需要3个字符", + "adyen.giropay.noResults": "没有搜索结果", + "adyen.error.title": "错误", + "adyen.error.subtitle.redirect": "重定向失败", + "adyen.error.subtitle.payment": "支付失败", + "adyen.error.subtitle.refused": "支付被拒绝", + "adyen.error.message.unknown": "未知错误", + "adyen.error.message.cannotConnectToInternet": "无法连接互联网,请检查网络。", + "adyen.error.message.cannotConnectToHost": "无法连接支付服务器", + "adyen.error.retryButton": "重试", + "adyen.idealIssuer.selectField.title": "银行", + "adyen.idealIssuer.selectField.placeholder": "选择银行", + "adyen.creditCard.success": "支付成功", + "adyen.oneClick.confirmationAlert.title": "确认 %@ 支付", + "adyen.redirect.cannotOpenApp.title": "无法打开应用", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "该应用在这台设备上没有安装,所以无法打开", + "adyen.holderName": "持卡人姓名", + "adyen.countryCode": "国家代码", + "adyen.telephone.number": "电话号码", + "android.download": "蓝灯安卓版", + "android.download.title": "Download Lantern Android", + "authorize.title": "授权设备使用专业版", + "authorize.step1.have_pro_device": "已有其他专业版的设备", + "authorize.step1.link": "通过设备授权登录", + "authorize.step1.email_linking": "通过邮箱授权登录", + "authorize.device_linking_explanation": "如果您身边已经有一台专业版设备,请选用“设备授权”登录", + "authorize.device_email_explanation": "如果您有邮箱验证码,请选用“邮箱授权”登录", + "authorize.link_device": "授权设备", + "authorize.step1.choose": "选择授权设备登录的方式", + "authorize.step1.or": "或", + "authorize.step1.recover": "邮箱登陆", + "authorize.step1.start": "登陆", + "authorize.step1.no_mail": "不记得您的电子邮件地址吗?", + "authorize.step1.description": "请输入您正确的注册邮箱,验证码就会发到你的邮箱", + "authorize.step2b.enter_code": "输入邮箱登陆码", + "authorize.step2b.code": "邮箱登陆码", + "authorize.step2b.instruction": "如果此蓝灯账号存在,蓝灯恢复码已发送到{{email}}。Email送达可能需要几小时,请检查您的垃圾邮件。", + "authorize.step2b.no_mail": "没有收到email", + "authorize.step3.recovery": "帐号登陆", + "authorize.step3.no_email": "出错了!我们找不到对应的邮箱地址。请提供更多信息来找回帐号。", + "authorize.step3.no_code_received": "收不到邮箱登陆码? 请输入以下信息来人工找回帐号,我们会在48小时内联系你。", + "authorize.step3.your_email": "您的邮箱", + "authorize.step3.payment_method": "付款方式", + "authorize.step3.payment_method_hint": "请选择你购买专业版的方式", + "authorize.step3.credit_card": "信用卡", + "authorize.step3.alipay": "支付宝", + "authorize.step3.android_pay": "安卓Pay", + "authorize.step3.by_referral": "因为邀请朋友而免费获得了专业版", + "authorize.step3.payment_account": "付款帐号", + "authorize.step3.payment_account_hint": "请输入支付宝帐号信息", + "authorize.step3.referral_code": "您的邀请码", + "authorize.step3.purchase_date": "付款日期", + "authorize.step3.note": "请输入其他相关信息,方便我们寻找你的帐号。", + "authorize.step4.title": "正在进行帐号恢复", + "authorize.step4.text1": "感谢!我们已收到你的帐号恢复请求。", + "authorize.step4.text2": "请等待48小时让我们寻找你的专业版帐号。", + "authorize.step4.text3": "我们会反馈结果给上面填写的邮箱地址。", + "authorized.continue": "下一步", + "authorized.continue.lantern": "进入蓝灯专业版", + "authorized.text": "当前设备被授权使用您蓝灯专业版账户了!", + "authorized.title": "设备已授权", + "button.account": "帐号", + "button.renew": "续期", + "button.upgrade": "升级", + "button.upgrade_now": "现在升级", + "button.upgrade_to_lantern_pro": "升级到蓝灯专业版", + "button.copy_your_code": "复制您的邀请码", + "button.try_again": "重试", + "button.continue": "继续", + "button.continue_to": "继续使用 {{planType}}", + "bullet.click_button": "点击下面的按钮", + "bullet.paste_code": "复制邀请码和下载链接", + "bullet.send_to_friends": "发送给你的朋友", + "cancel": "取消", + "confirm": "确认", + "norecoveryyinbi": "无法恢复隐币钱包", + "email.recovery.check.email": "请到邮箱查看授权码", + "email.recovery.code.label": "输入或粘贴授权码", + "email.recovery.no.code": "没有收到授权码?", + "email.recovery.text": "请输入您的邮箱,我们将发送验证码协助您重设密码。\n如果您有隐币钱包,上述方法无法恢复您的隐币钱包。如需恢复隐币钱包,请输入隐币助记词", + "email.recovery.desc": "如果您希望通过邮箱收到授权码,请选此方式", + "device.recovery.desc": "如果您已经有专业版设备在身边,请选此方法", + "google_search": "谷歌搜索", + "giveaway.upgrade": "升级蓝灯免费领取当日的隐币分配!", + "giveaway.title_released_today": "当日YNB额度", + "giveaway.what_is_it": "什么是Yinbi赠送?", + "giveaway.description1": "YNB会根据购买当天发放隐币总量,当天购买/续费蓝灯专业版的数量和和时长,您购买/续费蓝灯专业版的数量和时长当日日终直接发放到您的隐币钱包。", + "giveaway.description2": "YNB会根据购买当天发放隐币总量,当天购买/续费蓝灯专业版的数量和和时长,您购买/续费蓝灯专业版的数量和时长当日日终直接发放到您的隐币钱包。", + "giveaway.learn_more": "了解更多", + "link_device": "已经有专业版帐户?请登录", + "email.recovery": "通过邮箱恢复", + "email_taken": "邮箱已使用", + "username_taken": "用户名已使用", + "err.unknown_error": "未知错误", + "err.internal_error": "内部错误", + "err.bad_input": "错误输入", + "err.not_authorized": "登录失败", + "err.user_exists": "用户存在", + "err.no_such_user": "无此用户", + "err.user_already_verified": "用户已验证", + "err.invalid_user_verification": "无效用户验证", + "err.user_unverified": "用户未验证", + "err.operation_temporarily_unavailable": "操作暂时不可用", + "err.wrong_or_inexistent_plan": "错误或不存在的套餐", + "err.user_has_active_subscription": "用户已激活订阅", + "err.payment_error": "支付错误", + "err.no_codes_left": "无邀请码", + "err.wrong_code": "邀请码错误", + "err.redeeming_own_code_not_allowed": "不允许兑换自己的邀请码", + "err.wrong_charge_id": "充值 ID 不正确", + "err.wrong_link_code": "设备授权码错误", + "err.invalid_credentials": "提供的用户凭证无效", + "footer.reseller": "想赚钱吗?成为蓝灯代理商吧。请点击这里。", + "footer.reseller.email_subject": "关于蓝灯代理商的详情", + "footer.reseller.email_body": "当你成为蓝灯代理商,你可以对销售蓝灯专业版销售额进行最多25% 的提成。请联络我们并知之为何想要成为蓝灯代理商。", + "feature.faster_speed": "速度更快", + "feature.faster": "速度更快", + "feature.unlimited": "无限流量", + "feature.nologs": "无服务器记录", + "feature.devices": "支持3个设备", + "feature.noads": "无广告", + "feature.yinbi.tooltip": "隐币基金会将通过蓝灯向购买蓝灯专业版的用户独家赠送 8880 亿个隐币。在每天结束时,基金会会根据当天发布的隐币数量、升级/续费人数以及购买年限或账户数量来发放隐币。隐币将直接存入您在蓝灯的隐币钱包!", + "feature.antiblock": "更抗封锁", + "feature.data_center": "更好的服务器", + "feature.free_yinbi": "免费加密货币!", + "free.title": "蓝灯专业版", + "free.desc": "更快速,更强大,无限流量,安全", + "free.link_account": "已经有专业版帐户?请登录", + "home.get_lantern_pro": "购买蓝灯专业版", + "home.get_lantern_platinum": "升级您的计划", + "home.welcome_popup_subheader": "欢迎用Lantern!", + "home.welcome_popup_content_1": "我们正在努力更新蓝灯,增加新功能。", + "home.welcome_popup_content_2": "在新界面中,您可以在蓝灯网络中搜索文件,您也可以上传文件。这是一个测试功能,欢迎大家测试反馈。", + "home.welcome_popup_button": "试试", + "input.email": "电子邮件", + "input.your_email": "你的Email", + "input.confirm_email": "确认你的Email", + "input.enter_email": "请输入你的Email", + "input.use_valid_email": "请输入有效的电子邮件地址", + "input.email_not_match": "电子邮件地址不相符", + "input.existing_email": "Existing email", + "issue.your_email": "您的邮件", + "issue.attach_image_failure": "无法上传图片", + "issue.try_again": "请重试", + "issue.select_issue": "请选择问题类型", + "issue.selected_issue": "选择问题", + "issue.select_issue_hint": "请用下拉框选择问题类型", + "issue.note": "描述你的问题", + "issue.description": "问题描述", + "issue.error": "报告问题出错", + "issue.submit": "发送报告", + "issue.report_screenshot": "拖拽或点击上传图片", + "issue.reported": "感谢报告问题,我们会尽快通过邮件反馈。", + "issue.report_sent": "报告已发送", + "issue.type.no_access": "无法访问被屏蔽网站", + "issue.type.payment_fail": "无法完成支付", + "issue.type.cannot_login": "无法登录", + "issue.type.always_spinning": "始终显示载入中", + "issue.type.slow": "很慢", + "issue.type.cannot_link_device": "无法链接设备", + "issue.type.crashes": "Lantern 崩溃了", + "issue.type.other": "其他", + "languages.title": "语言", + "lantern.email": "蓝灯邮箱", + "mobile.link": "使用这个链接在您的安卓设备上下载蓝灯", + "mobile.title": "获取安卓版", + "nav.about": "关于", + "nav.account": "账号管理", + "nav.authorize": "授权其他设备使用专业版", + "nav.authorized": "在当前设备登录成功", + "nav.unauthorized_link": "授权设备使用专业版", + "nav.language": "语言", + "nav.lantern": "蓝灯", + "nav.mobile": "获取移动版本", + "nav.report_issue": "报告问题", + "nav.settings": "设置", + "nav.support": "支持", + "nav.verify": "账号验证", + "nav.yinbi": "兑换隐币", + "nav.home": "主页", + "nav.discover": "发现", + "nav.wallet": "钱包", + "nav.yinbi_wallet": "隐币钱包", + "notification.retry": "重试", + "notifications": "通知", + "notifications.whatisnew": "新功能", + "password.change": "修改密码", + "password.changed": "密码修改成功", + "continue.to.pro": "下一步", + "username": "用户名", + "password.new": "新密码", + "password.requirements": "
密码必须包含如下:
  • 8个及以上的字符
  • 1 个小写字母
  • 1 大写字母
  • 至少1个数字
  • 不是已经泄露的密码
", + "password.reset": "重设密码", + "paxful.buy": "购买", + "paxful.payment": "支付方式", + "paxful.bitcoin": "比特币 (BTC)", + "paxful.tether": "泰达币(USDT)", + "paxful.wallet": "电子钱包", + "paxful.bank": "银行转账", + "paxful.gamer_card": "游戏卡", + "paxful.gift_card": "礼品卡", + "paxful.cash": "现金", + "paxful.digital_currency": "数字货币", + "paxful.button": "显示优惠的交易", + "payment.close": "关闭", + "payment.redirectErrorTitle": "Error connecting to payment server", + "payment.redirectErrorText": "We are currently working on resolving this issue. Please check back later.", + "payment.wait_for_pro": "感谢你购买蓝灯专业版。请稍等片刻,蓝灯会自动会变成专业版。", + "payment.moreOptions": "更多选项", + "payment.fewerOptions": "更少选项", + "payment_methods.select_name": "选择付款方式", + "payment_methods.alipay": "信用卡/支付宝", + "payment_methods.shetab": "快速全球支付(Shetab)", + "payment_methods.shetab.details.header": "购买蓝灯专业版", + "payment_methods.shetab.details.body": "当您单击继续购买时,您将被重定向到外部站点以完成支付并收集激活码。", + "payment_methods.shetab.details.tutorial_header": "获取教程", + "payment_methods.shetab.details.purchase_voucher_button": "继续购买", + "payment_methods.shetab.details.input_code_button": "输入激活码", + "plan.step1": "步骤1", + "plan.apply": "应用", + "plan.step2": "步骤2", + "plan.most_popular": "最受欢迎", + "plan.step3": "步骤3", + "plan.choose_plan": "选择套餐", + "plan.enter_email": "输入邮箱", + "plan.choose_method": "选择付款方式", + "plan.bestValue": "最实惠!", + "plan.per_month": "每月", + "plan.yinbi_2x": "两倍隐币", + "plan.oneYear": "1 年", + "plan.add_referral": "输入邀请码", + "plan.years": "{{years}}年版", + "plan.desc": "收取{{price}}", + "plan.bonus_months": "+ {{bonusMonths}} 月", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(人民币)", + "plan.currency.usd": "(美元)", + "plan.time_unit": "年", + "plan.select": "选择", + "plan.two_year": "两年", + "plan.one_year": "一年", + "plan.savings": "节省 {{formattedDiscount}} %", + "plans.title": "蓝灯专业版套餐", + "plans.lantern_pro": "蓝灯专业版", + "plans.platforms": "支持Windows、安卓、Mac 和 Ubuntu。", + "plans.from_reseller": "有蓝灯专业版激活码吗?请点击这里。", + "plans.with_voucher_code": "网上打折购买了专业版激活码?点此升级", + "pro.apply": "您的积分将在下一个结算周期加入到您的账号。", + "pro.title": "邀请好友来获得更多的专业版使用时间。", + "pro.subtitle": "好友购买两年套餐后,双方都赠送三个月的专业版使用时间;好友购买一年套餐后,双方都会赠送一个月的使用时间。", + "pro.share": "与好友分享您的代码,开始赚取更多积分!", + "promotion.title": "蓝灯专业版购买", + "promotion.title.activation": "蓝灯专业版激活", + "promotion.enter_and_confirm_email": "请输入并确认的你的email地址", + "promotion.code.hint": "请输入邀请码(可选)", + "promotion.code.label": "邀请码", + "promotion.payment": "继续支付", + "promotion.payment.btc": "Pay with ₿", + "promotion.loading": "加载中…", + "promotion.howto_1y": "朋友给您分享了邀请码?输入邀请码,购买一年套餐后自动赠送一个月。", + "promotion.howto_2y": "朋友给您分享了邀请码?输入邀请码,购买两年套餐后自动赠送3个月。", + "promotion.pay": "支付 {{amount}}", + "promotion.select": "选择", + "promotion.promotion_applied_1y": "赠送一个月", + "promotion.promotion_applied_2y": "赠送3个月", + "promotion.too_many_referrals": "此邀请码已经添加。您获赠的时间付款后就能使用了。", + "promotion.activation.enter_and_confirm_email": "请输入并确认你的Email地址来注册蓝灯专业版账号。", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "激活码", + "promotion.activation.instructions": "注册专业版账户,请输入邮箱和代理商处购买的25位激活码", + "promotion.activation.howto": "请输入25位蓝灯专业版激活码。如果你没有激活码,请退回选择套餐界面直接购买,或者在网上寻找蓝灯代理商。", + "promotion.activation.continue": "注册专业版账户", + "promotion.voucher.hint": "激活码", + "promotion.voucher.howto": "请在上面输入您的12个字符的快速全球支付激活码", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "兑换激活码时出错。", + "promotion.voucher.error.invalid_code": "激活码无效", + "promotion.voucher.error.invalid_plan": "与无效预付关联的激活码", + "promotion.voucher.error.already_redeemed": "激活码已被兑换", + "referral.code": "邀请码", + "referral.text": "输入我的邀请码 %s 来获得三个月的蓝灯专业版!立即下载 https://github.com/getlantern/forum", + "referral.description_free": "与朋友分享你的邀请码,双方各获赠1个月时间。", + "referral.description_pro": "与朋友分享你的邀请码,双方各获赠1个月时间。", + "register": "注册", + "renew.subtitle_early": "现在续期立即获赠3个月!", + "renew.subtitle_last_day": "现在续期立即获赠3个月!", + "renew.subtitle_expired": "现在续期立即获赠45天!", + "renew.details_early": "你的蓝灯专业版快要过期了。现在续期可获赠最多3个月!", + "renew.details_last_day": "你的蓝灯专业版今天过期。现在续期可获赠最多3个月!", + "renew.details_expired": "你的蓝灯专业版账号过期了。今天续期可以获赠最多45天!", + "renew.asterisk_early": "* 只有提前续期的用户才能享受这项优惠。", + "renew.asterisk_last_day": "* 这是你获得这项特别优惠的最后机会!", + "renew.asterisk_expired": "* 这是一项限期优惠!", + "renew.plan_label": "蓝灯专业版 - %s", + "renew.plan_renewal_bonus_1_month": "¥%d%s + 免费 1 个月", + "renew.plan_renewal_bonus_months": "¥%d%s + 免费 %d 个月", + "renew.plan_renewal_bonus_days": "¥%d%s + 免费 %d 天", + "renew.next": "下一步", + "renew.decline": "拒接优惠", + "renew.decline_question": "你确认拒绝这个优惠么?", + "renew.decline_yes": "稍后续期", + "renew.decline_dismiss": "现在就续期", + "renew.notification_title_30_days": "现在续期可以获得限量折扣!", + "renew.notification_title_30_days_platinum": "现在续订白金版,可节省大量资金", + "renew.notification_text_30_days": "您的 {{planName}} 账户在 {{remainingDays}} 天后到期。现在续约,可获得长达 3 个月的免费使用期。", + "renew.notification_title_2_days": "{{planName}} 优惠明天结束!", + "renew.notification_text_2_days": "您的 {{planName}} 账户将于明天到期。不要错过享受超值优惠的机会。", + "renew.notification_title_last_day": "最后一次获得优惠的机会!", + "renew.notification_text_last_day": "您的 {{planName}} 账户已过期。今天续订,可获得长达 3 个月的免费服务。", + "replica.upload": "上传", + "replica.favorite": "收藏", + "replica.added_to_favorites": "Added to Favorites", + "replica.filedrop_error": "上传文件错误", + "replica.filedrop_error.file-too-large": "Maximum allowed file size is {{fileSize}}", + "replica.filedrop_error.file-too-small": "File is too small", + "replica.filedrop_error.too-many-files": "Too many files", + "replica.filedrop_error.file-invalid-type": "This file type is not currently supported", + "replica.filedrop_remove_file": "停止上传图片", + "replica.post": "上传文件", + "replica.relevance": "相关度", + "replica.upload_date": "上传日期", + "replica.gallery_view": "预览图展示", + "replica.list_view": "列表展示", + "replica.copy_lantern_link": "复制蓝灯链接", + "replica.documents": "文件", + "replica.audio": "音频", + "replica.application": "应用", + "replica.image": "图片", + "replica.video": "视频", + "replica.web": "网页", + "replica.news": "News", + "replica.upload_alert.dont_show": "不再显示", + "replica.upload_alert.cancel": "取消上传", + "replica.upload_alert.resume": "继续上传", + "replica.upload_alert.info": "重要信息!", + "replica.upload_alert.desc1": "文件上传到蓝灯网络后将去中心化分布式存储。一旦其他用户访问了这些文件,任何人 (包括蓝灯) 都无法将它们从网络中删除。 即使你已经删除该文件,也可能继续存在网络中。", + "replica.upload_alert.desc2": "因此上传敏感内容时请注意不要包含个人信息。", + "replica.add_details": "Add details", + "replica.cannot_edit": "Filenames cannot be edited once published.", + "replica.next": "下一步", + "replica.previous": "上一页", + "replica.selectAll": "全选", + "replica.search_replica": "搜索", + "replica.search_results_info": "此界面i显示蓝灯网络的结果", + "replica.search_results_info_message": "蓝灯网络的结果包含了用户上传的文件", + "replica.no_files_found": "无结果", + "replica.or_content": "你想让其他人看到的内容", + "replica.try_again": "尝试搜索其他关键词,或", + "replica.upload_success": "上传成功", + "replica.cannot_preview": "此文件无法预览", + "replica.no_description": "No description provided", + "replica.size": "dax", + "replica.uploaded": "已上传", + "replica.invalid_link": "无效链接", + "replica.close": "关闭", + "replica.files": "Files", + "replica.upload_history": "Upload history", + "replica.my_favorites": "收藏", + "replica.no_uploads": "还未上传", + "replica.no_favorites": "No Favorites Yet", + "replica.mime_type": "File type: {{mime}}", + "replica.image_loading_error": "加载图片错误", + "replica.play": "Play", + "replica.pause": "Pause", + "replica.scrub": "Scrub", + "replica.skip_forward": "Skip forward", + "replica.skip_backwards": "Skip backwards", + "replica.trending_videos": "热门视频", + "replica.file_uploaded": "Uploaded: {{days}} days ago", + "replica.file_size": "文件大小: %s", + "replica.duration": "Duration", + "replica.filename": "文件名", + "replica.filename_required": "命名文件", + "replica.description_optional": "Add Description", + "replica.expand": "Expand details", + "replica.filetype": "文件类型", + "replica.sortby": "排序", + "replica.link": "链接", + "replica.collapse": "折叠", + "replica.publish": "发布", + "replica.cancel": "取消", + "replica.progress_current_upload": "上传", + "replica.progress_files": "文件", + "replica.progress_of": "of", + "replica.progress_upload_complete": "完成", + "replica.progress_upload_failure": "上传文件失败,请重试", + "replica.upload_in_progress": "上传文件中", + "replica.upload_pending": "正在上传", + "replica.upload_error": "上传失败", + "replica.upload_cancel": "取消上传", + "replica.upload_confirm": "您确认取消上传吗?", + "replica.progress_view": "View", + "replica.delete": "删除", + "replica.remove": "移除", + "replica.delete_file": "删除文件", + "replica.remove_favorite": "Remove from Favorites", + "replica.failed_to_delete": "无法删除", + "replica.failed_to_remove": "Failed to remove", + "replica.link_lookup_failure": "无法找到链接", + "replica.delete_file_confirmation_1": "确定删除?", + "replica.delete_file_confirmation_2": "你的上传", + "replica.remove_favorite_confirmation_1": "Are you sure you want to remove", + "replica.remove_favorite_confirmation_2": "from your favorites", + "replica.share_file": "分享内容", + "replica.download_and_view": "下载/查看", + "replica.download": "下载", + "replica.copy_link": "复制Replica链接", + "replica.find_file": "查找内容", + "replica.file_drop_prompt": "Drop file to begin upload!", + "replica.empty_uploads_text1": "点击", + "replica.empty_uploads_text2": "这里", + "replica.empty_uploads_text3": "来发表您的第一篇文章。", + "replica.error_header": "Oops", + "replica.error": "There was an error processing your request. Please try again.", + "replica.serp_empty": "谷歌对此没有任何搜索结果。", + "replica.disclaimer": "Lantern anonymizes your searches and protects them from third parties", + "settings.general": "通用", + "settings.feedback": "反馈", + "settings.autoLaunch": "系统启动时运行 Lantern", + "settings.autoReport": "安全报告使用统计以帮助改进蓝灯", + "settings.lantern_ads": "Show Lantern Ads", + "settings.lantern_ads_tooltip": "Lantern shows you ads on some websites to help support our service. No user information is collected or passed to our servers. If you turn this option off, you may still see ads, but they will not be from the Lantern network.", + "settings.proxyAll": "代理全部流量", + "settings.proxyAllHelpTitle": "什么叫“代理全部流量”", + "settings.proxyAllHelp1": "如果开启,所有流量将通过蓝灯传输(最安全)", + "settings.proxyAllHelp2": "如果关闭,仅被封锁的流量通过蓝灯传输(最快且常用)", + "settings.show_advanced": "显示高级设置", + "settings.hide_advanced": "隐藏高级设置", + "settings.systemProxy": "管理系统代理", + "settings.title": "设置", + "settings.http_proxy": "HTTP(S)代理服务器:", + "settings.socks_proxy": "SOCKS代理服务器:", + "settings.caution": "请注意:", + "settings.caution_text": "在您取消“管理系统代理”后,您的浏览器和应用程序将不会自动使用蓝灯。手动配置相关设置的方法见上文。", + "settings.select_language": "选择语言", + "settings.diagnostics": "Attach Diagnostic Information", + "settings.diagnostics_tooltip": "Attaching diagnostic information will send the Lantern team data captured from your connection. This will increase our ability to identify and solve your issue.", + "status.lantern": "蓝灯状态", + "status.click_reconnect": "点击重新联网", + "status.server_location": "服务器位置", + "status.tooltip1": "蓝灯智能选择服务器,使您连接至我们最好的数据中心", + "status.tooltip2": "升级蓝灯专业版,使用高速流量,尊享专业版数据中心和优化的服务器", + "status.protected_connection": "已保护您的链接", + "status.please_wait": "这可能需要1-2分钟...", + "status.connecting": "连接中…", + "status.no_internet": "没有联网", + "status.no_internet_connection": "没有互联网连接", + "status.connected": "已连接", + "status.disconnected": "已断开", + "status.throttled": "限速中(高速流量已用尽)", + "status.no_system_proxy": "{{status}},没有管理系统代理", + "status.fail_to_set_system_proxy": "无法将蓝灯设置为系统代理", + "status.fail_to_open_browser": "无法打开浏览器显示蓝灯界面", + "support.forum": "蓝灯用户论坛", + "support.faq": "蓝灯论坛", + "terms_of_service.acknowledgment": "点击 {{buttonText}},即表示您同意接受我们的条款", + "terms_of_service.replica": "点击搜索 ,上传或通过任何方式使用我们的产品 ,即表示您同意我们的 Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "谷歌", + "top_sites.twitter": "推特", + "top_sites.youtube": "油管", + "top_sites.facebook": "脸书", + "top_sites.wikipedia": "维基百科", + "verify.header": "输入或粘贴验证码", + "verify.code": "动态授权码或支持码", + "verify.howto_1": "如果您已经有蓝灯专业版帐户,请输入您的电子邮件地址,以接收验证码,来绑定当前设备。", + "verify.howto_1a": "请输入您的电子邮件地址来验证您的专业版账户。验证通过后您就能绑定多台设备。", + "verify.howto_2": "授权设备使用你的专业版账户", + "verify.howto_3": "在已登陆专业版的设备上点击“授权其他设备使用专业版”", + "verify.howto_4": "在现在这个界面输入上一步获得的动态授权码或支持码", + "verify.reminder": "*请确保两台设备都使用最新版本", + "verify.enter_pin": "输入或粘贴验证码", + "verify.submit": "提交", + "verify.title": "账号验证", + "welcomeToPro.continue": "下一步", + "welcomeToPro.invite": "邀请好友购买,如果对方购买两年套餐,双方都会免费得到三个月的专业版使用时间;如果购买一年套餐,双方都会免费得到一个月的使用时间。现在就邀请!", + "welcomeToPro.thanks": "现在起,蓝灯最高速的数据中心和专线将开始为您提供无限量上网服务。您最多可同时接入三台设备。", + "welcomeToPro.title": "欢迎使用蓝灯专业版", + "welomeToPro.title_exclamation": "欢迎使用蓝灯专业版!", + "purchase.failed": "购买失败,请稍后重试。", + "purchase.success": "购买成功", + "purchase.success_title": "欢迎使用蓝灯 {{planType}}!", + "purchase.success_content_pro": "现在起,蓝灯最高速的数据中心和专线将开始为您提供无限量上网服务。您最多可同时接入三台设备。", + "purchase.success_content_platinum": "现在您可以使用我们的专线和最快的数据中心进行无限量访问。您最多可同时接入三台设备。", + "welcomeToPro.description": "现在您可以访问被封锁网站和服务了。", + "messages.copied_to_clipboard": "代码已复制。与您的朋友分享吧!", + "messages.datacap": "您已经用完了免费的高速流量,将被限速。请升级到专业版来享受无限高速流量。", + "messages.fatal_error": "很抱歉,我们无法连接到蓝灯的服务器。请检查您的网络连接并重试。", + "messages.backend_gone": "很抱歉,蓝灯似乎未在运行。请重启蓝灯并重试。", + "messages.get_help": "获取帮助", + "freeProCredits.title": "邀请好友", + "freeProCredits.shareWithFriends": "和朋友分享邀请码免费获赠专业版", + "freeProCredits.shareWithFriendsDesc": "好友购买两年套餐后,会赠送双方3个月专业版;好友购买一年套餐后,则赠送双方1个月。", + "cards.serverLocation.unknown": "未知", + "cards.serverLocation.description": "最快的服务器位置", + "cards.serverLocation.description-free": "服务器位置", + "cards.serverLocation.description-upgrade": "升级至更快的服务器", + "cards.serverLocation.title": "当前位置", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "蓝灯专业版会根据独创的算法和你的本地网络状况智能在日本, 新加坡, 香港, 旧金山, 纽约, 阿姆斯特丹, 班加罗尔等地自动选择最快的服务器。", + "cards.serverLocation.text-free": "蓝灯智能选择服务器,使您连接至我们最好的数据中心", + "cards.serverLocation.upgrade-link": "升级到蓝灯专业版可以获得更快的上网速度,因为专业版有专供的服务器和优化的访问线路。", + "cards.httpsUpgrades.description": "增加网站安全性", + "cards.httpsUpgrades.title": "增加了 %d 个网站的安全性", + "cards.httpsUpgrades.text": "蓝灯会自动将不安全的HTTP链接升级成为加密的HTTPS链接以保证您在访问网站时的信息安全。蓝灯的服务器也无法知道HTTPS链接的内容。", + "cards.adsBlocked.description": "广告拦截", + "cards.adsBlocked.title": "已拦截 %d 个广告", + "cards.adsBlocked.text": "蓝灯会阻止侵入式广告,加快网页加载速度,节省带宽,为您提供更为流畅的浏览体验。", + "cards.dataUsage.description": "数据用量", + "cards.dataUsage.upgrade": "现在升级", + "cards.dataUsage.mb-used": "您已使用本月%d/%dMB高速流量", + "cards.dataUsage.upgrade-link": "升级到专业版可无限量的高速浏览!", + "cards.subscription.description": "专业版购买", + "cards.subscription.renew": "续期", + "cards.subscription.months": "您的蓝灯专业版订阅还有%d个月剩余", + "cards.subscription.days": "您的蓝灯专业版订阅还有%d天剩余", + "cards.subscription.unit.months": "个月", + "cards.subscription.unit.days": "天", + "cards.subscription.renew-link": "续期您的订阅来增加更多使用时间", + "auth.email": "电子邮件", + "auth.username": "用户名", + "auth.username.or.email": "用户名或邮箱", + "auth.signin": "登录", + "current.password": "当前密码", + "new.password": "新密码", + "auth.change.password": "修改密码", + "confirm.new.password": "确认新密码", + "auth.password": "密码", + "auth.have.recovery.phrase": "Have a Recovery Phrase?", + "auth.forgot.password": "忘记或没有密码?", + "auth.create.account": "创建账号", + "auth.missing.username": "缺失用户名", + "auth.missing.current.password": "缺失当前密码", + "auth.missing.new.password": "缺失新密码", + "auth.missing.confirm.password": "缺失再次确认密码", + "invalid_credentials": "无效凭证", + "yinbi.wallet": "隐币钱包", + "create.wallet": "开通钱包", + "new.to.yinbi": "第一次来到隐币?", + "setup.wallet": "是,开通隐币钱包", + "web.wallet": "否,我已经通过网站Yin.bi注册了钱包", + "yinbi.next": "下一步", + "yinbi.amount": "金额", + "yinbi.missing.address": "未提供接收钱包地址", + "yinbi.missing.amount": "未填写具体金额", + "yinbi.missing.email": "未填写具体邮箱", + "yinbi.missing.username": "未填写用户名", + "yinbi.missing.password": "未填写密码", + "yinbi.invalid.address": "{{destination}} 不是一个有效的恒星币地址", + "yinbi.send": "发送", + "yinbi.to": "支付到:", + "yinbi.try_again": "重新尝试?", + "yinbi.success.transaction": "交易成功!", + "yinbi.failure.transaction": "交易失败", + "yinbi.confirm.transaction": "确认交易", + "yinbi.sent.details": "您将支付{{amount}} YNB到 {{destination}}", + "yinbi.sent.failure.details": "您的交易因如下原因失败:", + "yinbi.recipient": "接收方", + "yinbi.available.send": "您有 {{balance}} YNB 可供支付", + "yinbi.wallet.header": "钱包", + "yinbi.send.header": "支付隐币", + "yinbi.recovery.phrase": "隐币恢复助记词", + "yinbi.recover.account": "输入或复制您的隐币助记词以恢复您的隐币钱包及蓝灯账户", + "yinbi.recovery.desc": "如果您希望同时登入隐币钱包和蓝灯账户,请使用此方法", + "yinbi.redeem.codes": "批量兑换隐币", + "yinbi.obtain.codes": "批量获取隐币兑换码请到 reseller.lantern.io", + "yinbi.receive.header": "接收隐币", + "yinbi.this.is.your.wallet": "这是您的隐币钱包地址,他人可通过这个地址向您支付隐币", + "yinbi.your.address": "您的地址", + "yinbi.no.activity.header": "无交易记录", + "yinbi.upgrade.pro.button": "升级到专业版即可免费获取隐币", + "yinbi.renew.pro.button": "专业版续费可免费获赠隐币", + "yinbi.wallet.activity_header": "交易", + "yinbi.wallet.send": "发送", + "yinbi.wallet.receive": "接收", + "yinbi.wallet.balance": "余额", + "yinbi.wallet.getlantern.pro": "获取蓝灯专业版+赠送隐币", + "yinbi.redemption.codes": "隐币兑换码", + "redeem_codes.title": "兑换隐币", + "redeem_codes.redeem_button_text": "兑换", + "redeem_codes.cancel_button_text": "取消", + "redeem_codes.success": "成功", + "redeem_codes.errors.missing_codes": "无效的兑换码", + "redeem_codes.errors.invalid_codes": "错误,请检查标记的兑换码是否正确。\n划掉的兑换码已经过期且不能用于兑换隐币。", + "yinbi.new.account.text": "您的交易收支记录将会显示在这里。", + "yinbi.createAccount": "创建账号", + "yinbi.confirm.account.text": "请确保您正确记下了助记词,并输入如下单词", + "create_account.invalid_words.error": "这个单词与提供的助记词不符", + "yinbi.recovery_text": "这是您的隐币钱包恢复助记词。如果您忘记了密码,这是恢复您的隐币钱包的唯一方式\n建议使用密码管理器或打印存储这些助记词。", + "yinbi.recovery_confirm_text": "这是您的隐币钱包恢复助记词。如果您忘记了密码,这是恢复您的隐币钱包的唯一方式\n建议使用密码管理器或打印存储这些助记词。", + "yinbi.import.wallet": "Import Wallet", + "yinbi.setup.wallet": "Set up Wallet", + "yinbi.importWallet": "导入Yin.bi 钱包", + "yinbi.import.wallet.continue": "Continue to Your Wallet", + "yinbi.import.wallet.success": "Import Wallet Success!", + "yinbi.wallet.text": "使用隐币钱包,您可以创建或登录账户,或导入通过Yin.bi注册的隐币钱包。", + "yinbi.wallet.pro.text": "使用隐币钱包,您可以创建新账户,或导入通过Yin.bi注册的隐币钱包。", + "yinbi.recovery_subheader": "隐币钱包恢复助记词", + "yinbi.import_wallet.subheader": "导入隐币钱包", + "yinbi.import_wallet.text": "将隐币钱包整合到蓝灯,请输入您的隐币密码", + "yinbi.import_wallet.success": "已经成功导入您的隐币钱包,请输入邮箱完成注册", + "yinbi.import_wallet.success_subheader": "钱包导入成功!", + "yinbi.import_wallet.button": "导入Yin.bi 钱包", + "yinbi.import_wallet.success_button": "完成注册", + "yinbi.recovery_passphrase.label_text": "恢复助记词", + "yinbi.recovery_passphrase.copy_button_text": "复制", + "terms_of_service.notice": "提醒", + "terms_of_service.i_agree": "我同意", + "platinum": "白金版", + "platinum.one_year": "1 年价格", + "platinum.two_years": "2 年价格", + "platinum.save": "节省高达 {{savings}}%!", + "platinum.unlimited": "无限流量", + "platinum.logs": "无服务器记录", + "platinum.devices": "支持3个设备", + "platinum.everything_in_pro": "专业版中包含所有内容", + "platinum.faster_data": "速度更快", + "platinum.dedicated": "专线", + "platinum.reliability": "更可靠", + "platinum.platinum_one_year": "蓝灯白金版 1 年", + "platinum.platinum_two_years": "蓝灯白金版 2 年", + "platinum.pro_one_year": "蓝灯专业版 1 年", + "platinum.pro_two_years": "蓝灯专业版 2 年", + "platinum.total": "总计", + "platinum.free": "免费", + "platinum.credit.days": "+ {{ days }} 天", + "platinum.credit.months": "{{ months }} 月", + "platinum.upgrade": "升级为白金版", + "platinum.upgrade_details": "专线 + 更快的数据中心!", + "platinum.unused_time_disclaimer": "专业版用户升级到白金版后,将看到他们转换后的专业版订阅被列为上面的新增时间。", + "p2p.opt_in_description": "Use your internet to help people access the internet uncensored", + "p2p.active_sharing_description": "Your internet sharing is on", + "p2p.dialog.title": "Share internet access", + "p2p.dialog.text.1": "Help others with restricted access to the internet by sharing your connection. By allowing access to your internet, you will be part of a network of volunteers that makes the internet more open.", + "p2p.dialog.text.2": "Sharing will not compromise your identity or safety. You can stop sharing your internet whenever you want.", + "p2p.dialog.yes_button": "YES, START SHARING", + "p2p.dialog.no_button": "CANCEL", + "p2p.banner.introducing": "INTRODUCING", + "top_sites.top_sites": "热门网站" +} \ No newline at end of file diff --git a/locale/translation/zh-HK.json b/locale/translation/zh-HK.json new file mode 100644 index 000000000..21463c417 --- /dev/null +++ b/locale/translation/zh-HK.json @@ -0,0 +1,632 @@ +{ + "LANTERN": "藍燈", + "BEAM": "小手電", + "TRAY_STATUS": "狀態:%v", + "TRAY_CONNECT": "連線", + "TRAY_DISCONNECT": "斷線", + "TRAY_SHOW": "顯示%s", + "TRAY_UPGRADE_TO_PRO": "昇級到付費版", + "TRAY_QUIT": "退出%s", + "BACKEND_DATA_TITLE": "No more high speed %s data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using %s at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your %s data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your %s high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "幫助", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update %s to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s has been downloaded. Please restart %s to use it.", + "BACKEND_MITM_INSTALL_CERT": "%s wants to install a custom certificate to improve performance", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "藍燈是一個自由免費的應用程式可以傳送快速、可靠與安全的開放網路近用", + "about.faq": "閱讀使用者問答集", + "about.open": "每個人的開放網路", + "about.questions": "問題?", + "about.title": "關於", + "account.add.password": "Add Account Password", + "account.cancel": "取消付費帳號", + "account.recovery": "Account Recovery", + "account.recovery.link.device": "Link Device", + "account.recovery.device.code": "Device Linking Code", + "account.recovery.device.enter.code": "Enter or Paste Device Linking Pin", + "account.recovery.device.instructions.header": "To link this device to your Pro account:", + "account.recovery.device.instructions.step.one": "1. Choose the ‘Link a Device’ option from the Account Management screen item on your Desktop Pro device, or From the menu on you Mobile Pro Device.", + "account.recovery.device.instructions.step.two": "2. Enter the device linking code, and submit.", + "account.recovery.device.instructions.part.three": "*Ensure both devices are running the most recent version of Lantern", + "account.recovery.method": "Please Choose a method to recover your account", + "account.recovery.send.email": "寄出電子郵件", + "account.recovery.submit": "提交", + "account.recovery.success": "Linking Success!", + "account.pro_management": "付費版帳號管理", + "account.free.cap": "每月免費資料流量還剩{{mb}} MB", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To Authorize this device to use your Pro account:", + "account.freelink.step1": "1. Choose the 'Link a Device' option from the Menu on your Pro Device", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Ensure both devices are running the most recent version of Lantern", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "當付費版帳號快到期前,你將會自動被收取下一年的費用", + "account.upgrade": "昇級到付費版", + "account.create": "Create Account", + "account.email": "電子郵件", + "account.confirm.password": "Confirm Password", + "account.password": "Password", + "account.pro.email": "Email:", + "account.pro.expiration": "Pro Account Expiration", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Lantern Pro Devices (up to 3)", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "只有一個設備", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "account.signin": "登入", + "account.signout": "Sign Out", + "account.submit": "提交", + "account.username": "Username", + "modal.register.free.header": "Register or Sign in to access Yinbi Wallet", + "modal.register.pro.header": "Add account password to access Yinbi Wallet", + "modal.register.free.text": "To use the Yinbi Wallet you must have a Lantern Account, please Register or\nSign in to Continue.", + "modal.register.pro.text": "To use the Yinbi wallet you must add a password to your Lantern account.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "取消", + "adyen.dismissButton": "確定", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "卡片號碼", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "月", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "年", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "錯誤", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "授權付費版的設備", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Device Linking", + "authorize.step1.email_linking": "Email Linking", + "authorize.device_linking_explanation": "Use this method if you are signed into another device and have it with you", + "authorize.device_email_explanation": "Use this method if you want a Device linking pin sent to your email", + "authorize.link_device": "Link Device", + "authorize.step1.choose": "Please choose a method to Link your account", + "authorize.step1.or": "或", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step1.description": "Enter your email and if the account exists we will send an email with a device linking code", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}} if this account exists. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "你的電子郵件", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "你的邀請碼", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "繼續使用付費版", + "authorized.text": "這個設備已被授權使用專業付費版Lantern", + "authorized.title": "裝置已授權", + "button.renew": "Renew", + "button.upgrade": "㫒級 ", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "昇級到付費版", + "button.copy_your_code": "複制代碼", + "button.try_again": "Try again", + "button.continue": "繼續", + "bullet.click_button": "點擊下方按鈕", + "bullet.paste_code": "貼上代碼並下載訊息中的連結網址", + "bullet.send_to_friends": "寄送給好友", + "cancel": "取消", + "confirm": "Confirm", + "norecoveryyinbi": "*Does not recover Yinbi Wallet", + "email.recovery.check.email": "Check your email for a message with a Recovery Code", + "email.recovery.code.label": "Enter or Paste Recovery Code", + "email.recovery.no.code": "Didnt get a Code?", + "email.recovery.text": "Enter your email, and we will send you a code to reset your password.\nIf you have a Yinbi Wallet, this will NOT recover your Yinbi wallet, to recover your Yinbi Wallet enter your Yinbi Recovery Phrase.", + "email.recovery.desc": "Use this method if you want a recovery code sent to your email", + "device.recovery.desc": "Use this method if you are signed in to another device and have it with you", + "google_search": "Google Search", + "giveaway.upgrade": "Upgrade to receive today's free distribution", + "giveaway.title_released_today": "%s YNB being released today", + "giveaway.what_is_it": "What is the Yinbi Giveaway?", + "giveaway.description1": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro.", + "giveaway.description2": "YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern.", + "giveaway.learn_more": "Learn More", + "link_device": "Already have a Pro account? Link device", + "email.recovery": "Email Recovery", + "email_taken": "Email already registered", + "username_taken": "Username already registered", + "err.unknown_error": "不明的錯誤", + "err.internal_error": "內部出錯", + "err.bad_input": "不正確的輸入", + "err.not_authorized": "未授權", + "err.user_exists": "帳號已存在", + "err.no_such_user": "本帳號不存在", + "err.user_already_verified": "用戶已認證", + "err.invalid_user_verification": "無效的用戶認證", + "err.user_unverified": "用戶未認證", + "err.operation_temporarily_unavailable": "服務暫時無法使用", + "err.wrong_or_inexistent_plan": "錯誤或不存在的計畫", + "err.user_has_active_subscription": "用戶有效訂閱", + "err.payment_error": "付款出錯", + "err.no_codes_left": "未有邀請碼", + "err.wrong_code": "錯誤的邀請碼", + "err.redeeming_own_code_not_allowed": "無法事後填補邀請碼", + "err.wrong_charge_id": "錯誤的支付代號", + "err.invalid_credentials": "The supplied user credentials were invalid", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "更快速度", + "feature.faster": "Faster data centers", + "feature.unlimited": "無流量限制", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern 付費專業版", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "取得Lantern 付費專業版", + "input.email": "電子郵件", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "輸入一個有效的電子信箱位址", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "你的電子郵件", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "請重試一次", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "語言", + "lantern.email": "Lantern Email", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "關於", + "nav.account": "帳號管理", + "nav.authorize": "Add Device", + "nav.authorized": "裝置已授權", + "nav.unauthorized_link": "授權付費版的設備", + "nav.language": "語言", + "nav.lantern": "Lantern", + "nav.mobile": "取得行動版", + "nav.report_issue": "回報問題", + "nav.settings": "設定", + "nav.verify": "帳號認證", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "重是", + "password.change": "Change Password", + "password.changed": "Password Changed", + "continue.to.pro": "繼續使用付費版", + "username": "Username", + "password.new": "New Password", + "password.requirements": "
Password must contain the following:
  • 8 or more characters
  • 1 lowercase letter
  • 1 uppercase letter
  • At least 1 number
  • Not on a list of compromised passwords
", + "password.reset": "Reset Password", + "notifications.whatisnew": "What's New?", + "payment.close": "關閉", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.most_popular": "Most Popular!", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "選擇", + "plans.title": "Lantern 付費專業版方案", + "plans.lantern_pro": "Lantern 付費專業版", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "你的優惠點數可以在下回帳單中使用", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "分享你的邀請給好友以賺得更多優惠點數", + "promotion.title": "取得Lantern 付費專業版付款", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "邀請碼", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "支付 {{amount}}", + "promotion.select": "選擇", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Activation Code", + "promotion.activation.instructions": "Enter your email and the 25 digit activation code received from the reseller to register your account.", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Register for Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Referral code", + "referral.text": "使用邀請碼 %s 註冊後可以得到3個月免費專業版試用!", + "referral.description_free": "Share Your code with your friends, and get 1 month of Lantern Pro service for free when they Purchase Pro!", + "referral.description_pro": "Share Your code with your friends and get 1 month of Additional Lantern Pro service for free when they Purchase Pro!", + "register": "Register", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.docs": "文件", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.upload_alert.dont_show": "Don't show this again", + "replica.upload_alert.cancel": "Cancel Upload", + "replica.upload_alert.resume": "Resume Upload", + "replica.upload_alert.info": "Important Information!", + "replica.upload_alert.desc1": "Files uploaded to Lantern are distributed and decentralized. Once they are accessed by another user they cannot be deleted from the network by anyone, including Lantern, even if they are deleted from your 'My Files' list.", + "replica.upload_alert.desc2": "Please refrain from using personal identifying information in the file or filename when uploading sensitive content.", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "搜尋", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "關閉", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "取消", + "replica.delete": "Delete", + "replica.delete_file": "Delete File", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "從您的上傳", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "下載", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "將文件拖到此處或瀏覽進行上傳", + "settings.general": "一般", + "settings.feedback": "意見回饋", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "安全地回報使用統計數據以改進藍燈", + "settings.proxyAll": "代理所有流量", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "顯示高級設置", + "settings.hide_advanced": "隱藏高級設置", + "settings.systemProxy": "管理系統代理", + "settings.title": "設定", + "settings.http_proxy": "HTTP(S) 代理:", + "settings.socks_proxy": "SOCKS 代理:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "選擇語言", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "伺服器位置", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "連線中...", + "status.no_internet": "已斷線", + "status.no_internet_connection": "No Internet connection", + "status.connected": "已連線", + "status.disconnected": "已斷線", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "terms_of_service.replica": "By Searching, uploading or using our products in any way, you agree to our Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Enter or Paste Device Linking Pin", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_2": "To Link a Device to your Pro Account:", + "verify.howto_3": "1. Choose ‘Authorize Device for Pro from the Menu of your other device.", + "verify.howto_4": "2. Enter the linking pin obtained from step 1, and submit.", + "verify.reminder": "*Ensure both devices are running the most recent version of Lantern", + "verify.enter_pin": "Enter or Paste Device Linking Pin", + "verify.submit": "提交", + "verify.title": "帳號認證", + "welcomeToPro.continue": "繼續使用付費版", + "welcomeToPro.invite": "邀請朋友加入,當你介紹的朋友購買了二年份的方案,你將可免費取得 3個月的專業版使用優惠,若友人購買一年份方案你則取得 1個月專業版優惠。立馬邀請!", + "welcomeToPro.thanks": "感謝購買Lantern付費專業版", + "welcomeToPro.title": "歡迎來到 Lantern Pro!", + "welomeToPro.title_exclamation": "歡迎來到 Lantern Pro!", + "welcomeToPro.description": "You now have unrestricted access to blocked sites and services", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "獲取幫助", + "freeProCredits.title": "邀請朋友加入", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "優化的伺服器位置", + "cards.serverLocation.description-free": "伺服器位置", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "當前位置:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time.", + "auth.username.or.email": "Username or Email", + "auth.signin": "登入", + "current.password": "Current Password", + "new.password": "New Password", + "auth.change.password": "Change Password", + "confirm.new.password": "Confirm New Password", + "auth.password": "Password", + "auth.forgot.password": "Forgot or do not have password?", + "auth.create.account": "Create Account", + "auth.missing.username": "Missing username", + "auth.missing.current.password": "Missing current password", + "auth.missing.new.password": "Missing new password", + "auth.missing.confirm.password": "Missing confirm password", + "invalid_credentials": "Invalid Credentials", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Create Wallet", + "new.to.yinbi": "New to Yinbi?", + "setup.wallet": "Yes, lets set up a new wallet!", + "web.wallet": "No, I have a Wallet on the Yin.bi Website", + "yinbi.next": "Next", + "yinbi.amount": "Amount", + "yinbi.missing.address": "No destination address provided", + "yinbi.missing.amount": "No amount specified", + "yinbi.missing.email": "No email address specified", + "yinbi.missing.username": "No username specified", + "yinbi.missing.password": "No password specified", + "yinbi.invalid.address": "{{destination}} is not a valid Stellar address", + "yinbi.send": "傳送", + "yinbi.to": "To:", + "yinbi.try_again": "Try again?", + "yinbi.success.transaction": "Transaction Successful!", + "yinbi.failure.transaction": "Transaction Failed", + "yinbi.confirm.transaction": "Confirm Transaction", + "yinbi.sent.details": "You sent {{amount}} YNB to {{destination}}", + "yinbi.sent.failure.details": "Your Transaction failed for the following reasons:", + "yinbi.recipient": "Recipient", + "yinbi.available.send": "You have {{balance}} YNB available to send", + "yinbi.wallet.header": "Wallet", + "yinbi.send.header": "Send Yinbi", + "yinbi.recovery.phrase": "Yinbi Recovery Phrase", + "yinbi.recover.account": "Enter or Paste your Yinbi Recovery Phrase to recover your Yinbi Wallet, and Lantern account", + "yinbi.recovery.desc": "Use this method if you want to sign in to a Yinbi Wallet in addition to your Lantern account", + "yinbi.redeem.codes": "Redeem Bulk Yinbi Codes", + "yinbi.obtain.codes": "Bulk Yinbi Redemption codes can be obtained from reseller.lantern.io", + "yinbi.receive.header": "Receive Yinbi", + "yinbi.this.is.your.wallet": "This is your Yinbi wallet address where people can send you YNB.", + "yinbi.your.address": "Your Address", + "yinbi.no.activity.header": "No Activity", + "yinbi.upgrade.pro.button": "Upgrade to Pro and Get Free Yinbi", + "yinbi.renew.pro.button": "Renew Pro and Get Free Yinbi", + "yinbi.wallet.activity_header": "Activity", + "yinbi.wallet.send": "傳送", + "yinbi.wallet.receive": "Receive", + "yinbi.wallet.balance": "Balance", + "yinbi.wallet.getlantern.pro": "Get Lantern Pro + Free Yinbi", + "yinbi.redemption.codes": "Yinbi Redemption Codes", + "redeem_codes.title": "Redeem Yinbi Codes", + "redeem_codes.redeem_button_text": "Redeem", + "redeem_codes.cancel_button_text": "取消", + "redeem_codes.success": "Success", + "redeem_codes.errors.missing_codes": "No valid codes entered", + "redeem_codes.errors.invalid_codes": "Error, please check the highlighted codes. Crossed out codes are expired and can no longer be redeemed.", + "yinbi.new.account.text": "Once you send or receive Yinbi your transactions will appear here.", + "yinbi.createAccount": "Create Account", + "yinbi.confirm.account.text": "To make sure that you wrote the phrase down correctly, please enter the following words from your recovery phrase", + "create_account.invalid_words.error": "The words entered didn't match those of the recovery passphrase", + "yinbi.recovery_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet\nin case of a forgotten password. Use a password manager or make a hard copy when\nstoring this phrase.", + "yinbi.recovery_confirm_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet in case of a forgotten password. Use a password manager or make a hard copy when storing this phrase.", + "yinbi.importWallet": "Import Yin.bi Wallet", + "yinbi.wallet.text": "To access the Yinbi Wallet, you can Create an Account, Sign In or\nImport your wallet from Yin.bi if you have signed up on the Yin.bi\nwebsite before.", + "yinbi.wallet.pro.text": "To access the Yinbi Wallet, you can Create an Account, Import your wallet from Yin.bi if you have signed up before.", + "yinbi.recovery_subheader": "Yinbi Wallet Recovery Phrase", + "yinbi.import_wallet.subheader": "Import Yinbi Wallet", + "yinbi.import_wallet.text": "Sign in using your Yin.bi credentials to transfer your wallet to Lantern", + "yinbi.import_wallet.success": "Your Wallet has been imported successfully please add your email to complete account registration.", + "yinbi.import_wallet.success_subheader": "Import Success!", + "yinbi.import_wallet.button": "Import Yin.bi Wallet", + "yinbi.import_wallet.success_button": "Complete Registration", + "yinbi.recovery_passphrase.label_text": "Recovery Phrase", + "yinbi.recovery_passphrase.copy_button_text": "Copy", + "replica.my_uploads": "我的上載", + "replica.mime_type": "Filetype: {{mime}}", + "replica.image_loading_error": "Error loading image", + "replica.trending_videos": "Trending Videos", + "replica.file_uploaded": "Uploaded: %d days ago", + "replica.file_size": "Size: %s", + "replica.finishing": "Finishing up", + "terms_of_service.notice": "Notice", + "terms_of_service.i_agree": "I agree", + "top_sites.top_sites": "Top Sites" +} \ No newline at end of file diff --git a/locale/translation/zh-TW.json b/locale/translation/zh-TW.json new file mode 100644 index 000000000..21463c417 --- /dev/null +++ b/locale/translation/zh-TW.json @@ -0,0 +1,632 @@ +{ + "LANTERN": "藍燈", + "BEAM": "小手電", + "TRAY_STATUS": "狀態:%v", + "TRAY_CONNECT": "連線", + "TRAY_DISCONNECT": "斷線", + "TRAY_SHOW": "顯示%s", + "TRAY_UPGRADE_TO_PRO": "昇級到付費版", + "TRAY_QUIT": "退出%s", + "BACKEND_DATA_TITLE": "No more high speed %s data", + "BACKEND_DATA_MESSAGE": "Please upgrade to Pro to keep using %s at full speed!", + "BACKEND_DATA_PERCENT_TITLE": "Reached %s of your %s data", + "BACKEND_DATA_PERCENT_MESSAGE": "You have used %s of your %s high speed data for the month. Upgrade now!", + "BACKEND_CLICK_LABEL": "Open", + "BACKEND_CLICK_LABEL_OPEN": "Open", + "BACKEND_CLICK_LABEL_HELP": "幫助", + "BACKEND_CLICK_LABEL_GOT_IT": "Got it", + "BACKEND_AUTOUPDATED_TITLE": "Update %s to version %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s has been downloaded. Please restart %s to use it.", + "BACKEND_MITM_INSTALL_CERT": "%s wants to install a custom certificate to improve performance", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "Please allow %v to make changes to your system", + "BACKEND_ALERT_TITLE": "Critical alert needs your attention", + "about.content": "藍燈是一個自由免費的應用程式可以傳送快速、可靠與安全的開放網路近用", + "about.faq": "閱讀使用者問答集", + "about.open": "每個人的開放網路", + "about.questions": "問題?", + "about.title": "關於", + "account.add.password": "Add Account Password", + "account.cancel": "取消付費帳號", + "account.recovery": "Account Recovery", + "account.recovery.link.device": "Link Device", + "account.recovery.device.code": "Device Linking Code", + "account.recovery.device.enter.code": "Enter or Paste Device Linking Pin", + "account.recovery.device.instructions.header": "To link this device to your Pro account:", + "account.recovery.device.instructions.step.one": "1. Choose the ‘Link a Device’ option from the Account Management screen item on your Desktop Pro device, or From the menu on you Mobile Pro Device.", + "account.recovery.device.instructions.step.two": "2. Enter the device linking code, and submit.", + "account.recovery.device.instructions.part.three": "*Ensure both devices are running the most recent version of Lantern", + "account.recovery.method": "Please Choose a method to recover your account", + "account.recovery.send.email": "寄出電子郵件", + "account.recovery.submit": "提交", + "account.recovery.success": "Linking Success!", + "account.pro_management": "付費版帳號管理", + "account.free.cap": "每月免費資料流量還剩{{mb}} MB", + "account.free.cap.upgrade": "Upgrade to Pro for unlimited high speed data", + "account.freelink.validFor": "valid for %s", + "account.freelink.desc": "To Authorize this device to use your Pro account:", + "account.freelink.step1": "1. Choose the 'Link a Device' option from the Menu on your Pro Device", + "account.freelink.step2": "2. Enter the device linking code, and submit.", + "account.freelink.reminder": "* Ensure both devices are running the most recent version of Lantern", + "account.freelink.errorTitle": "Error Linking", + "account.freelink.errorText": "Are you sure you entered the code on your Pro device?", + "account.freelink.headerDesc": "Link this device to your Pro account", + "account.freelink.title": "Device Linking Code", + "account.pro.charge": "當付費版帳號快到期前,你將會自動被收取下一年的費用", + "account.upgrade": "昇級到付費版", + "account.create": "Create Account", + "account.email": "電子郵件", + "account.confirm.password": "Confirm Password", + "account.password": "Password", + "account.pro.email": "Email:", + "account.pro.expiration": "Pro Account Expiration", + "account.pro.expired": "Your Pro account has expired. Renew now for Unlimited monthly data.", + "account.pro.expiry": "Your Pro account expires in %s days on %s.", + "account.pro.bonusMonths": "This includes your {{bonusMonths}} bonus months!", + "account.pro.thisdevice": "(This Device)", + "account.pro.logout": "LOG OUT", + "account.pro.removedevice": "REMOVE", + "account.pro.devices": "Lantern Pro Devices (up to 3)", + "account.pro.device.confirm.title": "Deauthorize Device", + "account.pro.device.confirm": "Are you sure you want to remove '{{device}}' from your Lantern Pro account?", + "account.pro.device.one.title": "只有一個設備", + "account.pro.device.one": "Sorry, but you cannot remove your last authorized device.", + "account.pro.linkingcode": "Device Linking Code:", + "account.pro.renew": "RENEW PRO ACCOUNT", + "account.prolink.errorTitle": "Error Linking", + "account.prolink.errorText": "Are you sure you copied the code correctly from your other device?", + "account.prolink.successTitle": "Device Linked", + "account.prolink.successText": "You have successfully linked your device! Please wait a moment for your other device to automatically become pro.", + "account.signin": "登入", + "account.signout": "Sign Out", + "account.submit": "提交", + "account.username": "Username", + "modal.register.free.header": "Register or Sign in to access Yinbi Wallet", + "modal.register.pro.header": "Add account password to access Yinbi Wallet", + "modal.register.free.text": "To use the Yinbi Wallet you must have a Lantern Account, please Register or\nSign in to Continue.", + "modal.register.pro.text": "To use the Yinbi wallet you must add a password to your Lantern account.", + "adyen.paymentMethods.title": "Payment Methods", + "adyen.paymentMethods.storedMethods": "Your payment methods", + "adyen.paymentMethods.otherMethods": "Select other method", + "adyen.paymentMethods.moreMethodsButton": "More payment methods", + "adyen.payButton": "Pay", + "adyen.payButton.formatted": "Pay %@", + "adyen.cancelButton": "取消", + "adyen.dismissButton": "確定", + "adyen.storeDetails": "Save for my next payment", + "adyen.payment.redirecting": "You will be redirected", + "adyen.payment.processing": "Your payment is being processed", + "adyen.creditCard.title": "Card Details", + "adyen.creditCard.holderName": "Cardholder name", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "卡片號碼", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "Invalid card number", + "adyen.creditCard.expiryDateField.title": "Expiry Date", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "Invalid expiration date", + "adyen.creditCard.expiryDateField.month": "月", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "年", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "Number of installments", + "adyen.creditCard.storeDetailsButton": "Remember this card for my next payment", + "adyen.creditCard.oneClickVerification.title": "Verify your card", + "adyen.creditCard.oneClickVerification.message": "Please enter the CVC code for %@", + "adyen.creditCard.oneClickVerification.invalidInput.title": "Invalid CVC", + "adyen.creditCard.oneClickVerification.invalidInput.message": "Please enter a valid CVC to continue.", + "adyen.sepaDirectDebit.ibanField.title": "Account Number (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "Invalid account number", + "adyen.sepaDirectDebit.nameField.title": "Holder Name", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "I agree that the amount below will be debited from my bank account.", + "adyen.sepa.ownerName": "Holder Name", + "adyen.sepa.ibanNumber": "Account Number (IBAN)", + "adyen.giropay.searchField.placeholder": "Bankname / BIC / Bankleitzahl", + "adyen.giropay.minimumLength": "Min. 3 characters", + "adyen.giropay.noResults": "No search results", + "adyen.error.title": "錯誤", + "adyen.error.subtitle.redirect": "Redirect failed", + "adyen.error.subtitle.payment": "Payment failed", + "adyen.error.subtitle.refused": "Payment refused", + "adyen.error.message.unknown": "An unknown error occurred", + "adyen.error.message.cannotConnectToInternet": "Failed to connect to the internet : please check your internet connection.", + "adyen.error.message.cannotConnectToHost": "Failed to connect to our payment server.", + "adyen.error.retryButton": "Try again", + "adyen.idealIssuer.selectField.title": "Bank", + "adyen.idealIssuer.selectField.placeholder": "Select your bank", + "adyen.creditCard.success": "Payment Successful", + "adyen.oneClick.confirmationAlert.title": "Confirm %@ payment", + "adyen.redirect.cannotOpenApp.title": "Cannot Open App", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "This app could not be opened because it is not installed on this device.", + "adyen.holderName": "Cardholder name", + "adyen.countryCode": "Country Code", + "adyen.telephone.number": "Telephone number", + "authorize.title": "授權付費版的設備", + "authorize.step1.have_pro_device": "I have another Lantern Pro device", + "authorize.step1.link": "Device Linking", + "authorize.step1.email_linking": "Email Linking", + "authorize.device_linking_explanation": "Use this method if you are signed into another device and have it with you", + "authorize.device_email_explanation": "Use this method if you want a Device linking pin sent to your email", + "authorize.link_device": "Link Device", + "authorize.step1.choose": "Please choose a method to Link your account", + "authorize.step1.or": "或", + "authorize.step1.recover": "I need to recover my Lantern Pro account", + "authorize.step1.start": "start recovery", + "authorize.step1.no_mail": "Don't remember your Email address?", + "authorize.step1.description": "Enter your email and if the account exists we will send an email with a device linking code", + "authorize.step2b.enter_code": "Enter your Account Recovery Code", + "authorize.step2b.code": "Account Recovery Code", + "authorize.step2b.instruction": "An Email with a recovery code has been sent to {{email}} if this account exists. This email may take several hours to arrive. Please check your spam folder if you do not find it.", + "authorize.step2b.no_mail": "Didn't receive email", + "authorize.step3.recovery": "Account Recovery", + "authorize.step3.no_email": "Oops! We're having trouble finding that email address. Please provide more information below to help us locate your account.", + "authorize.step3.no_code_received": "Having trouble receiving the recovery email? Enter the information below and we will contact you within 48 hours.", + "authorize.step3.your_email": "你的電子郵件", + "authorize.step3.payment_method": "Payment Method", + "authorize.step3.payment_method_hint": "Select the payment method you used to get Pro", + "authorize.step3.credit_card": "Credit Card", + "authorize.step3.alipay": "AliPay", + "authorize.step3.android_pay": "Android Pay", + "authorize.step3.by_referral": "Received Pro by Referring a friend", + "authorize.step3.payment_account": "Payment Account", + "authorize.step3.payment_account_hint": "Enter your Alipay account information", + "authorize.step3.referral_code": "你的邀請碼", + "authorize.step3.purchase_date": "Purchase Date", + "authorize.step3.note": "Please note any other information that may help us locate your account.", + "authorize.step4.title": "Account Recovery In-Progress", + "authorize.step4.text1": "Thank you! We've received your account recovery request.", + "authorize.step4.text2": "Please allow 48 hours to retrieve your Pro account information.", + "authorize.step4.text3": "We will send information to the email address entered on the previous screen.", + "authorized.continue": "繼續使用付費版", + "authorized.text": "這個設備已被授權使用專業付費版Lantern", + "authorized.title": "裝置已授權", + "button.renew": "Renew", + "button.upgrade": "㫒級 ", + "button.upgrade_now": "Upgrade Now", + "button.upgrade_to_lantern_pro": "昇級到付費版", + "button.copy_your_code": "複制代碼", + "button.try_again": "Try again", + "button.continue": "繼續", + "bullet.click_button": "點擊下方按鈕", + "bullet.paste_code": "貼上代碼並下載訊息中的連結網址", + "bullet.send_to_friends": "寄送給好友", + "cancel": "取消", + "confirm": "Confirm", + "norecoveryyinbi": "*Does not recover Yinbi Wallet", + "email.recovery.check.email": "Check your email for a message with a Recovery Code", + "email.recovery.code.label": "Enter or Paste Recovery Code", + "email.recovery.no.code": "Didnt get a Code?", + "email.recovery.text": "Enter your email, and we will send you a code to reset your password.\nIf you have a Yinbi Wallet, this will NOT recover your Yinbi wallet, to recover your Yinbi Wallet enter your Yinbi Recovery Phrase.", + "email.recovery.desc": "Use this method if you want a recovery code sent to your email", + "device.recovery.desc": "Use this method if you are signed in to another device and have it with you", + "google_search": "Google Search", + "giveaway.upgrade": "Upgrade to receive today's free distribution", + "giveaway.title_released_today": "%s YNB being released today", + "giveaway.what_is_it": "What is the Yinbi Giveaway?", + "giveaway.description1": "The Yinbi foundation is giving away 888 billion YNB cryptocurrency exclusively through Lantern to purchasers of Lantern Pro.", + "giveaway.description2": "YNB will be distributed at the end of every day, based on the quantity of Yinbi released that day, the number of people that upgrade/renew, and the number of years or accounts you purchase. YNB will be deposited directly into your Yinbi Wallet in Lantern.", + "giveaway.learn_more": "Learn More", + "link_device": "Already have a Pro account? Link device", + "email.recovery": "Email Recovery", + "email_taken": "Email already registered", + "username_taken": "Username already registered", + "err.unknown_error": "不明的錯誤", + "err.internal_error": "內部出錯", + "err.bad_input": "不正確的輸入", + "err.not_authorized": "未授權", + "err.user_exists": "帳號已存在", + "err.no_such_user": "本帳號不存在", + "err.user_already_verified": "用戶已認證", + "err.invalid_user_verification": "無效的用戶認證", + "err.user_unverified": "用戶未認證", + "err.operation_temporarily_unavailable": "服務暫時無法使用", + "err.wrong_or_inexistent_plan": "錯誤或不存在的計畫", + "err.user_has_active_subscription": "用戶有效訂閱", + "err.payment_error": "付款出錯", + "err.no_codes_left": "未有邀請碼", + "err.wrong_code": "錯誤的邀請碼", + "err.redeeming_own_code_not_allowed": "無法事後填補邀請碼", + "err.wrong_charge_id": "錯誤的支付代號", + "err.invalid_credentials": "The supplied user credentials were invalid", + "footer.reseller": "Make Money! Become a Lantern Pro reseller. Click Here", + "footer.reseller.email_subject": "Tell me about the Lantern Reseller Program!", + "footer.reseller.email_body": "When you become a Lantern Reseller you will have the opportunity to make up to 25% on every sale of a Lantern Pro subscription. Tell us a bit about why you want to become a reseller below.", + "feature.faster_speed": "更快速度", + "feature.faster": "Faster data centers", + "feature.unlimited": "無流量限制", + "feature.nologs": "No Logs", + "feature.devices": "Connect up to 3 devices", + "feature.noads": "No Ads", + "feature.antiblock": "Blocking Resistant", + "feature.data_center": "Better Data Centers", + "feature.free_yinbi": "Free Yinbi Cryptocurrency!", + "free.title": "Lantern 付費專業版", + "free.desc": "Faster. Stronger. Unlimited. Secure.", + "free.link_account": "Already have a Pro account? Link your account.", + "home.get_lantern_pro": "取得Lantern 付費專業版", + "input.email": "電子郵件", + "input.your_email": "Your Email Address", + "input.confirm_email": "Confirm Email Address", + "input.enter_email": "Enter your email", + "input.use_valid_email": "輸入一個有效的電子信箱位址", + "input.email_not_match": "Email fields do not match", + "issue.your_email": "你的電子郵件", + "issue.attach_image_failure": "Cannot attach image", + "issue.try_again": "請重試一次", + "issue.select_issue": "Please Select an Issue", + "issue.selected_issue": "Select Issue", + "issue.select_issue_hint": "Select an issue from the dropdown menu", + "issue.note": "Describe your Issue", + "issue.description": "Issue Description", + "issue.error": "Error reporting issue", + "issue.submit": "Send Report", + "issue.report_screenshot": "Drag image or click to upload screenshot", + "issue.reported": "Thank you for reporting your issue, we will get back to you via Email as soon as we are able", + "issue.report_sent": "Report Sent", + "issue.type.no_access": "Cannot access blocked sites", + "issue.type.payment_fail": "Cannot complete the payment", + "issue.type.cannot_login": "Cannot log in", + "issue.type.always_spinning": "Loading spinner spins endlessly", + "issue.type.slow": "Slow", + "issue.type.cannot_link_device": "Cannot link devices", + "issue.type.crashes": "Lantern crashes", + "issue.type.other": "Other", + "languages.title": "語言", + "lantern.email": "Lantern Email", + "mobile.link": "Use the link to download Lantern on your Android device:", + "mobile.title": "Get Android Version", + "nav.about": "關於", + "nav.account": "帳號管理", + "nav.authorize": "Add Device", + "nav.authorized": "裝置已授權", + "nav.unauthorized_link": "授權付費版的設備", + "nav.language": "語言", + "nav.lantern": "Lantern", + "nav.mobile": "取得行動版", + "nav.report_issue": "回報問題", + "nav.settings": "設定", + "nav.verify": "帳號認證", + "nav.yinbi": "Yinbi Redemption", + "nav.home": "Home", + "nav.discover": "Discover", + "nav.wallet": "Wallet", + "nav.yinbi_wallet": "Yinbi Wallet", + "notification.retry": "重是", + "password.change": "Change Password", + "password.changed": "Password Changed", + "continue.to.pro": "繼續使用付費版", + "username": "Username", + "password.new": "New Password", + "password.requirements": "
Password must contain the following:
  • 8 or more characters
  • 1 lowercase letter
  • 1 uppercase letter
  • At least 1 number
  • Not on a list of compromised passwords
", + "password.reset": "Reset Password", + "notifications.whatisnew": "What's New?", + "payment.close": "關閉", + "payment.wait_for_pro": "Thanks for your purchase of Lantern Pro! Please wait a moment for your Lantern to automatically become Pro.", + "payment_methods.select_name": "Select payment method", + "payment_methods.alipay": "Credit Card/Alipay", + "payment_methods.shetab": "Fast World Pay (Shetab)", + "payment_methods.shetab.details.header": "To purchase Lantern Pro", + "payment_methods.shetab.details.body": "When you click continue to purchase you will be redirected to an external site to complete payment and collect your activation code.", + "payment_methods.shetab.details.tutorial_header": "Farsi tutorial", + "payment_methods.shetab.details.purchase_voucher_button": "Continue To Purchase", + "payment_methods.shetab.details.input_code_button": "Input Activation Code", + "plan.step1": "Step 1", + "plan.apply": "Apply", + "plan.step2": "Step 2", + "plan.most_popular": "Most Popular!", + "plan.step3": "Step 3", + "plan.choose_plan": "Choose Plan", + "plan.enter_email": "Enter Email", + "plan.bestValue": "Best Deal!", + "plan.per_month": "per month", + "plan.yinbi_2x": "+ 2x Yinbi!", + "plan.oneYear": "1 year", + "plan.add_referral": "Add Referral Code", + "plan.years": "{{years}} year plan", + "plan.desc": "{{price}} billed one time", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(RMB)", + "plan.currency.usd": "(USD)", + "plan.time_unit": "/YR", + "plan.select": "選擇", + "plans.title": "Lantern 付費專業版方案", + "plans.lantern_pro": "Lantern 付費專業版", + "plans.platforms": "For Windows, Android, Mac, Ubuntu.", + "plans.from_reseller": "Have a Lantern Pro activation code? Click here", + "plans.with_voucher_code": "Have an activation code? Click here.", + "pro.apply": "你的優惠點數可以在下回帳單中使用", + "pro.title": "Invite friends, get more Pro for free", + "pro.subtitle": "When your friend purchases the two year plan you each get 3 additional months of Pro, the one year plan gets you each 1 month free.", + "pro.share": "分享你的邀請給好友以賺得更多優惠點數", + "promotion.title": "取得Lantern 付費專業版付款", + "promotion.title.activation": "Lantern Pro Activation", + "promotion.enter_and_confirm_email": "Please enter and confirm your email address", + "promotion.code.hint": "Enter your friend's Referral code (optional)", + "promotion.code.label": "邀請碼", + "promotion.payment": "Continue to Payment", + "promotion.loading": "Loading...", + "promotion.howto_1y": "If a friend shared their referral code with you, enter the code to receive one month of Lantern Pro for free after checkout.", + "promotion.howto_2y": "If a friend shared their referral code with you, enter the code to receive three months of Lantern Pro for free after checkout.", + "promotion.pay": "支付 {{amount}}", + "promotion.select": "選擇", + "promotion.promotion_applied_1y": "+1 bonus months", + "promotion.promotion_applied_2y": "+3 bonus months", + "promotion.too_many_referrals": "This referral code has already been added. Check out now to receive your extra months.", + "promotion.activation.enter_and_confirm_email": "Please enter and confirm your email address to register your Lantern Pro account.", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "Activation Code", + "promotion.activation.instructions": "Enter your email and the 25 digit activation code received from the reseller to register your account.", + "promotion.activation.howto": "Please enter your 25 character Lantern Pro activation code above. If you do not have a code, please purchase Pro on the previous screen or look for a Lantern Pro reseller online.", + "promotion.activation.continue": "Register for Pro", + "promotion.voucher.hint": "Activation Code", + "promotion.voucher.howto": "Please enter your 12 character Fast World Pay activation code above", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "Error redeeming your activation code. Please contact contact@fastworldpay.com for assistance.", + "promotion.voucher.error.invalid_code": "Invalid activation code", + "promotion.voucher.error.invalid_plan": "Activation code associated with an invalid plan", + "promotion.voucher.error.already_redeemed": "Activation code has already been redeemed", + "referral.code": "Referral code", + "referral.text": "使用邀請碼 %s 註冊後可以得到3個月免費專業版試用!", + "referral.description_free": "Share Your code with your friends, and get 1 month of Lantern Pro service for free when they Purchase Pro!", + "referral.description_pro": "Share Your code with your friends and get 1 month of Additional Lantern Pro service for free when they Purchase Pro!", + "register": "Register", + "renew.title_30_days": "Renew now for 3 months free!", + "renew.title_2_days": "Lantern Pro expires tomorrow.\nRenew now for 3 months free!", + "renew.title_last_day": "Lantern Pro expires today.\nDon't miss out on your Pro discount!", + "renew.title_expired": "Lantern Pro has expired", + "renew.details_30_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_2_days": "Your Lantern Pro membership is ending soon, renew now and enjoy up to three months free! This limited time offer is only valid for early renewals.", + "renew.details_last_day": "Renew now and enjoy up to three months free!\nThis is the last day to take advantage of this offer.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.details_expired": "Renew now for an extra 45 days free. Limited time only.\nLantern Pro users get faster speeds, unlimited data, better blocking resistance, three devices and no ads.", + "renew.plan_label": "Lantern Pro - %s", + "renew.plan_renewal_bonus_1_month": "$%d%s + 1 FREE MONTH", + "renew.plan_renewal_bonus_months": "$%d%s + %d FREE MONTHS", + "renew.plan_renewal_bonus_days": "$%d%s + %d FREE DAYS", + "renew.next": "next", + "renew.decline": "Decline Offer", + "renew.decline_question": "Are you sure you want to decline this offer?", + "renew.decline_yes": "Renew later", + "renew.decline_dismiss": "Renew now", + "renew.notification_title_30_days": "Renew Pro now for huge savings!", + "renew.notification_text_30_days": "Your Lantern Pro account expires in {{days}} days. Renew now and get up to 3 months free.", + "renew.notification_title_2_days": "Lantern Pro discount ends tomorrow!", + "renew.notification_text_2_days": "Your Pro account expires tomorrow. Don’t miss this opportunity for a huge discount.", + "renew.notification_title_last_day": "Last chance for a discount!", + "renew.notification_text_last_day": "Your Lantern pro account has expired. Renew today and get up to 3 months free.", + "replica.upload": "Upload", + "replica.relevance": "Relevance", + "replica.upload_date": "Upload Date", + "replica.gallery_view": "Gallery View", + "replica.list_view": "List View", + "replica.copy_lantern_link": "Copy Lantern Link", + "replica.docs": "文件", + "replica.other": "Other", + "replica.apps": "Apps", + "replica.images": "Images", + "replica.upload_alert.dont_show": "Don't show this again", + "replica.upload_alert.cancel": "Cancel Upload", + "replica.upload_alert.resume": "Resume Upload", + "replica.upload_alert.info": "Important Information!", + "replica.upload_alert.desc1": "Files uploaded to Lantern are distributed and decentralized. Once they are accessed by another user they cannot be deleted from the network by anyone, including Lantern, even if they are deleted from your 'My Files' list.", + "replica.upload_alert.desc2": "Please refrain from using personal identifying information in the file or filename when uploading sensitive content.", + "replica.videos": "Videos", + "replica.next": "Next", + "replica.previous": "Previous", + "replica.select_all": "Select All", + "replica.search_replica": "搜尋", + "replica.no_files_found": "No Files Found", + "replica.or_content": "your own content for other people to find!", + "replica.try_again": "Try a different keyword, or", + "replica.upload_success": "Upload Success!", + "replica.cannot_preview": "No preview for this filetype", + "replica.size": "Size", + "replica.uploaded": "Uploaded", + "replica.invalid_link": "Invalid Link", + "replica.close": "關閉", + "replica.my_files": "My Files", + "replica.filename": "File Name", + "replica.filename_required": "File Name (required)", + "replica.filetype": "Filetype", + "replica.sortby": "Sort By", + "replica.link": "Replica link", + "replica.collapse": "Collapse", + "replica.publish": "Publish", + "replica.cancel": "取消", + "replica.delete": "Delete", + "replica.delete_file": "Delete File", + "replica.failed_to_delete": "Failed to delete", + "replica.link_lookup_failure": "Failed to find link", + "replica.delete_file_confirmation_1": "Are you sure you want to delete", + "replica.delete_file_confirmation_2": "從您的上傳", + "replica.share_file": "Share File", + "replica.download_and_view": "Download/View", + "replica.download": "下載", + "replica.copy_link": "Copy Replica Link", + "replica.find_file": "Find file", + "replica.file_drop_prompt": "將文件拖到此處或瀏覽進行上傳", + "settings.general": "一般", + "settings.feedback": "意見回饋", + "settings.autoLaunch": "Run Lantern on system start", + "settings.autoReport": "安全地回報使用統計數據以改進藍燈", + "settings.proxyAll": "代理所有流量", + "settings.proxyAllHelpTitle": "WHAT DOES \"PROXY ALL TRAFFIC\" DO?", + "settings.proxyAllHelp1": "If enabled, all traffic will be sent through Lantern (most Secure option).", + "settings.proxyAllHelp2": "If disabled, only blocked traffic will be sent through Lantern (fastest option, most common).", + "settings.show_advanced": "顯示高級設置", + "settings.hide_advanced": "隱藏高級設置", + "settings.systemProxy": "管理系統代理", + "settings.title": "設定", + "settings.http_proxy": "HTTP(S) 代理:", + "settings.socks_proxy": "SOCKS 代理:", + "settings.caution": "Caution:", + "settings.caution_text": "When you uncheck \"Manage system proxy\" your browser and applications won't be able to use Lantern automatically. If you know how to manually configure these settings refer to the information above.", + "settings.select_language": "選擇語言", + "status.lantern": "Lantern is", + "status.click_reconnect": "Click here to reconnect", + "status.server_location": "伺服器位置", + "status.tooltip1": "Lantern uses smart server selection to connect you to our best data centers.", + "status.tooltip2": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers", + "status.protected_connection": "Your Connection is Protected", + "status.please_wait": "This may take a minute or two...", + "status.connecting": "連線中...", + "status.no_internet": "已斷線", + "status.no_internet_connection": "No Internet connection", + "status.connected": "已連線", + "status.disconnected": "已斷線", + "status.throttled": "Speed Throttled (Data Cap)", + "status.no_system_proxy": "{{status}}, not managing system proxy", + "status.fail_to_set_system_proxy": "Failed to set Lantern as system proxy", + "status.fail_to_open_browser": "Failed to open browser window to show the Lantern user interface", + "terms_of_service.acknowledgment": "By clicking {{buttonText}}, you agree to our Terms of Service", + "terms_of_service.replica": "By Searching, uploading or using our products in any way, you agree to our Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "Google", + "top_sites.twitter": "Twitter", + "top_sites.youtube": "Youtube", + "top_sites.facebook": "Facebook", + "top_sites.wikipedia": "Wikipedia", + "verify.header": "Enter or Paste Device Linking Pin", + "verify.code": "Device Linking Code", + "verify.howto_1": "If you have a Lantern Pro account on another device, please enter your e-mail address here to receive a code to authorize the device", + "verify.howto_1a": "You're currently an unauthorized Pro user. Please enter your e-mail address to authorize your Pro account. This will enable you to link multiple devices.", + "verify.howto_2": "To Link a Device to your Pro Account:", + "verify.howto_3": "1. Choose ‘Authorize Device for Pro from the Menu of your other device.", + "verify.howto_4": "2. Enter the linking pin obtained from step 1, and submit.", + "verify.reminder": "*Ensure both devices are running the most recent version of Lantern", + "verify.enter_pin": "Enter or Paste Device Linking Pin", + "verify.submit": "提交", + "verify.title": "帳號認證", + "welcomeToPro.continue": "繼續使用付費版", + "welcomeToPro.invite": "邀請朋友加入,當你介紹的朋友購買了二年份的方案,你將可免費取得 3個月的專業版使用優惠,若友人購買一年份方案你則取得 1個月專業版優惠。立馬邀請!", + "welcomeToPro.thanks": "感謝購買Lantern付費專業版", + "welcomeToPro.title": "歡迎來到 Lantern Pro!", + "welomeToPro.title_exclamation": "歡迎來到 Lantern Pro!", + "welcomeToPro.description": "You now have unrestricted access to blocked sites and services", + "messages.copied_to_clipboard": "Code Copied. Share it with your friends!", + "messages.datacap": "You have used your free high speed data. Upgrade to Pro for unlimited high speed data.", + "messages.fatal_error": "Sorry, we're having trouble contacting the Lantern servers. Please check your internet connection and try again.", + "messages.backend_gone": "Sorry, Lantern appears to no longer be running. Please restart Lantern and try again.", + "messages.get_help": "獲取幫助", + "freeProCredits.title": "邀請朋友加入", + "freeProCredits.shareWithFriends": "Share your code with friends to earn free months!", + "freeProCredits.shareWithFriendsDesc": "When your friend purchases the two year plan you will each get 3 months free, the one year plan gets you each 1 month free.", + "cards.serverLocation.unknown": "Unknown", + "cards.serverLocation.description": "優化的伺服器位置", + "cards.serverLocation.description-free": "伺服器位置", + "cards.serverLocation.description-upgrade": "Upgrade for Faster Servers", + "cards.serverLocation.title": "當前位置:", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "Lantern uses smart server selection to automatically find you the fastest connection possible from our data centers in Tokyo, Singapore, Hong Kong, San Francisco, New York, Amsterdam, Bangalore and more.", + "cards.serverLocation.text-free": "Lantern uses smart server selection to connect you to our best data centers.", + "cards.serverLocation.upgrade-link": "Upgrade to Lantern Pro for faster speed with optimized server selection from our exclusive Lantern Pro data centers.", + "cards.httpsUpgrades.description": "HTTPS Upgrades", + "cards.httpsUpgrades.title": "HTTPS Upgrades: %d", + "cards.httpsUpgrades.text": "Lantern automatically upgrades unsecure HTTP connections to encrypted HTTPS connections when possible to keep your information private while surfing the web.", + "cards.adsBlocked.description": "Ads Blocked", + "cards.adsBlocked.title": "Blocked Ads: %d", + "cards.adsBlocked.text": "Lantern blocks intrusive ads to speed up web page loading time, save bandwidth, and to give you a smoother browsing experience.", + "cards.dataUsage.description": "Data Usage", + "cards.dataUsage.upgrade": "Upgrade now", + "cards.dataUsage.mb-used": "You have used %d/%dMB of your monthly high speed data.", + "cards.dataUsage.upgrade-link": "Upgrade now for unlimited high speed service!", + "cards.subscription.description": "Pro Subscription", + "cards.subscription.renew": "Renew", + "cards.subscription.months": "You have %d months of Lantern Pro left in your subscription.", + "cards.subscription.days": "You have %d days of Lantern Pro left in your subscription.", + "cards.subscription.unit.months": "MO", + "cards.subscription.unit.days": "DAYS", + "cards.subscription.renew-link": "Renew your subscription to add more time.", + "auth.username.or.email": "Username or Email", + "auth.signin": "登入", + "current.password": "Current Password", + "new.password": "New Password", + "auth.change.password": "Change Password", + "confirm.new.password": "Confirm New Password", + "auth.password": "Password", + "auth.forgot.password": "Forgot or do not have password?", + "auth.create.account": "Create Account", + "auth.missing.username": "Missing username", + "auth.missing.current.password": "Missing current password", + "auth.missing.new.password": "Missing new password", + "auth.missing.confirm.password": "Missing confirm password", + "invalid_credentials": "Invalid Credentials", + "yinbi.wallet": "Yinbi Wallet", + "create.wallet": "Create Wallet", + "new.to.yinbi": "New to Yinbi?", + "setup.wallet": "Yes, lets set up a new wallet!", + "web.wallet": "No, I have a Wallet on the Yin.bi Website", + "yinbi.next": "Next", + "yinbi.amount": "Amount", + "yinbi.missing.address": "No destination address provided", + "yinbi.missing.amount": "No amount specified", + "yinbi.missing.email": "No email address specified", + "yinbi.missing.username": "No username specified", + "yinbi.missing.password": "No password specified", + "yinbi.invalid.address": "{{destination}} is not a valid Stellar address", + "yinbi.send": "傳送", + "yinbi.to": "To:", + "yinbi.try_again": "Try again?", + "yinbi.success.transaction": "Transaction Successful!", + "yinbi.failure.transaction": "Transaction Failed", + "yinbi.confirm.transaction": "Confirm Transaction", + "yinbi.sent.details": "You sent {{amount}} YNB to {{destination}}", + "yinbi.sent.failure.details": "Your Transaction failed for the following reasons:", + "yinbi.recipient": "Recipient", + "yinbi.available.send": "You have {{balance}} YNB available to send", + "yinbi.wallet.header": "Wallet", + "yinbi.send.header": "Send Yinbi", + "yinbi.recovery.phrase": "Yinbi Recovery Phrase", + "yinbi.recover.account": "Enter or Paste your Yinbi Recovery Phrase to recover your Yinbi Wallet, and Lantern account", + "yinbi.recovery.desc": "Use this method if you want to sign in to a Yinbi Wallet in addition to your Lantern account", + "yinbi.redeem.codes": "Redeem Bulk Yinbi Codes", + "yinbi.obtain.codes": "Bulk Yinbi Redemption codes can be obtained from reseller.lantern.io", + "yinbi.receive.header": "Receive Yinbi", + "yinbi.this.is.your.wallet": "This is your Yinbi wallet address where people can send you YNB.", + "yinbi.your.address": "Your Address", + "yinbi.no.activity.header": "No Activity", + "yinbi.upgrade.pro.button": "Upgrade to Pro and Get Free Yinbi", + "yinbi.renew.pro.button": "Renew Pro and Get Free Yinbi", + "yinbi.wallet.activity_header": "Activity", + "yinbi.wallet.send": "傳送", + "yinbi.wallet.receive": "Receive", + "yinbi.wallet.balance": "Balance", + "yinbi.wallet.getlantern.pro": "Get Lantern Pro + Free Yinbi", + "yinbi.redemption.codes": "Yinbi Redemption Codes", + "redeem_codes.title": "Redeem Yinbi Codes", + "redeem_codes.redeem_button_text": "Redeem", + "redeem_codes.cancel_button_text": "取消", + "redeem_codes.success": "Success", + "redeem_codes.errors.missing_codes": "No valid codes entered", + "redeem_codes.errors.invalid_codes": "Error, please check the highlighted codes. Crossed out codes are expired and can no longer be redeemed.", + "yinbi.new.account.text": "Once you send or receive Yinbi your transactions will appear here.", + "yinbi.createAccount": "Create Account", + "yinbi.confirm.account.text": "To make sure that you wrote the phrase down correctly, please enter the following words from your recovery phrase", + "create_account.invalid_words.error": "The words entered didn't match those of the recovery passphrase", + "yinbi.recovery_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet\nin case of a forgotten password. Use a password manager or make a hard copy when\nstoring this phrase.", + "yinbi.recovery_confirm_text": "This is your Yinbi Wallet Recovery Phrase. It is the ONLY way to recover your Yinbi Wallet in case of a forgotten password. Use a password manager or make a hard copy when storing this phrase.", + "yinbi.importWallet": "Import Yin.bi Wallet", + "yinbi.wallet.text": "To access the Yinbi Wallet, you can Create an Account, Sign In or\nImport your wallet from Yin.bi if you have signed up on the Yin.bi\nwebsite before.", + "yinbi.wallet.pro.text": "To access the Yinbi Wallet, you can Create an Account, Import your wallet from Yin.bi if you have signed up before.", + "yinbi.recovery_subheader": "Yinbi Wallet Recovery Phrase", + "yinbi.import_wallet.subheader": "Import Yinbi Wallet", + "yinbi.import_wallet.text": "Sign in using your Yin.bi credentials to transfer your wallet to Lantern", + "yinbi.import_wallet.success": "Your Wallet has been imported successfully please add your email to complete account registration.", + "yinbi.import_wallet.success_subheader": "Import Success!", + "yinbi.import_wallet.button": "Import Yin.bi Wallet", + "yinbi.import_wallet.success_button": "Complete Registration", + "yinbi.recovery_passphrase.label_text": "Recovery Phrase", + "yinbi.recovery_passphrase.copy_button_text": "Copy", + "replica.my_uploads": "我的上載", + "replica.mime_type": "Filetype: {{mime}}", + "replica.image_loading_error": "Error loading image", + "replica.trending_videos": "Trending Videos", + "replica.file_uploaded": "Uploaded: %d days ago", + "replica.file_size": "Size: %s", + "replica.finishing": "Finishing up", + "terms_of_service.notice": "Notice", + "terms_of_service.i_agree": "I agree", + "top_sites.top_sites": "Top Sites" +} \ No newline at end of file diff --git a/locale/translation/zh.json b/locale/translation/zh.json new file mode 100644 index 000000000..bffca440d --- /dev/null +++ b/locale/translation/zh.json @@ -0,0 +1,797 @@ +{ + "LANTERN": "蓝灯", + "pro": "Pro", + "BEAM": "小手电", + "TRAY_STATUS": "状态: %v", + "TRAY_CONNECT": "连接", + "TRAY_DISCONNECT": "断开", + "TRAY_SHOW": "显示%s", + "TRAY_UPGRADE_TO_PRO": "升级到专业版", + "TRAY_QUIT": "退出%s", + "BACKEND_DATA_TITLE": "高速流量仅剩%s", + "BACKEND_DATA_MESSAGE": "请升级到%s专业版继续使用高速流量!", + "BACKEND_DATA_PERCENT_TITLE": "高速流量已使用 %s %s", + "BACKEND_DATA_PERCENT_MESSAGE": "您已经使用本月高速流量 %s %s。立刻升级!", + "BACKEND_CLICK_LABEL": "打开", + "BACKEND_CLICK_LABEL_OPEN": "打开", + "BACKEND_CLICK_LABEL_HELP": "帮助", + "BACKEND_CLICK_LABEL_GOT_IT": "明白了", + "BACKEND_AUTOUPDATED_TITLE": "更新 %s到版本 %s", + "BACKEND_AUTOUPDATED_MESSAGE": "%s %s 已经下载完成. 请重启 %s 即可使用.", + "BACKEND_MITM_INSTALL_CERT": "%s 希望安装定制证书以改善性能", + "BACKEND_MITM_INSTALL_CERT_WINDOWS_BODY": "请允许 %v对您的系统进行更改", + "BACKEND_ALERT_TITLE": "严重告警提请您关注", + "BACKEND_INSTALL_DIAGNOSTIC_TOOLS": "%s 请求你授权安装诊断工具,以改进%s的使用体验。", + "BACKEND_CONFIG_SAVE_ERROR_TITLE": "Unable to save configuration", + "BACKEND_CONFIG_SAVE_ERROR_MESSAGE": "Unable to save application configuration. %s cannot guarantee that traffic will be correctly proxied.", + "about.content": "蓝灯能帮助你快速、可靠、安全地访问互联网。", + "app.error": "啊呀,出现一些问题!", + "about.faq": "阅读蓝灯常见问题", + "about.open": "人人可享的真互联网", + "about.questions": "有疑问?", + "about.title": "关于", + "account.add.password": "添加账户密码", + "account.agree.terms": "I understand that losing my password means losing\naccount access. Lantern cannot help you recover\nyour password.", + "account.agree.terms.error": "Must first agree to terms", + "account.cancel": "取消专业版账户", + "account.created": "账号建立成功", + "account.create.pro.account.header": "Create Pro Account", + "account.create.pro.account.text": "Lantern is changing the way user accounts are handled. From now on Pro users will need to create a username and password. These credentials will be used to sign in to other devices, and provide access to new features.", + "account.have.a.account": "Have an Account?", + "account.link.username.pro": "Link username to Pro Account", + "account.recovery": "邮箱登陆", + "account.recovery.link.device": "授权设备", + "account.recovery.device.code": "动态授权码", + "account.recovery.device.enter.code": "输入或粘贴验证码", + "account.recovery.device.instructions.header": "授权这台设备使用您的专业版帐户", + "account.recovery.device.instructions.step.one": "请到电脑专业版账户管理界面或手机专业版菜单选择“授权设备”", + "account.recovery.device.instructions.step.two": "2. 输入设备的授权码,并提交。", + "account.recovery.device.instructions.part.three": "*请确保两台设备都使用最新版本", + "account.recovery.method": "请选择授权设备的方式", + "account.recovery.send.email": "发送电子邮件", + "account.recovery.submit": "提交", + "account.recovery.success": "授权成功!", + "account.pro_management": "专业版账户管理", + "account.free_management": "账号管理", + "account.free.cap": "本月高速流量只剩下{{mb}},高速流量将在{{reset}}重置。", + "account.free.cap.upgrade": "升级到专业版来享受无限的高速流量", + "account.freelink.validFor": "%s 内有效", + "account.freelink.desc": "授权这台设备使用您的专业版帐户", + "account.freelink.step1": "在已登陆专业版的设备上点击“授权其他设备使用专业版”", + "account.freelink.step2": "2. 输入设备的授权码,并提交。", + "account.freelink.reminder": "*请确保两台设备都使用最新版本", + "account.freelink.errorTitle": "授权失败", + "account.freelink.errorText": "您在专业版设备上输入正确的授权码了吗?", + "account.freelink.headerDesc": "授权这台设备使用您的专业版帐户", + "account.freelink.title": "动态授权码", + "account.pro.charge": "您的账户将自动在您的结算周期结束时为下一年的蓝灯专业版付费。", + "account.upgrade_pro": "升级到专业版", + "account.upgrade": "升级", + "account.upgrade_platinum": "升级为白金版", + "account.create": "创建账号", + "account.email": "电子邮件", + "account.confirm.password": "确认密码", + "account.password": "密码", + "account.pro.email": "电子邮件", + "account.pro.expiration": "专业版到期日", + "account.platinum.expiration": "白金账户到期时间", + "account.pro.expired": "你的蓝灯专业版账号已过期。现在就续期,享受无限制的高速流量。", + "account.pro.expiry": "您的专业版账户将在 %s 天后,即 %s 过期。", + "account.pro.bonusMonths": "这包括您的 {{bonusMonths}} 奖金月!", + "account.pro.thisdevice": "(此设备)", + "account.pro.logout": "退出登录", + "account.pro.removedevice": "解绑", + "account.pro.devices": "蓝灯专业版(最多3台设备)", + "account.pro.device.confirm.title": "取消设备绑定", + "account.pro.device.confirm": "您确定不再需要让此设备使用专业版帐户吗?", + "account.pro.device.one.title": "最后一台设备", + "account.pro.device.one": "这是你的专业版帐户绑定的惟一一台设备,不能解绑", + "account.pro.linkingcode": "动态授权码", + "account.pro.renew": "续订专业版账户", + "account.platinum.renew": "更新白金版账户", + "account.pro.renew_CN": "Renew", + "account.prolink.errorTitle": "授权失败", + "account.prolink.errorText": "您的授权码是否正确?", + "account.prolink.successTitle": "设备已授权", + "account.prolink.successText": "授权成功。请等待您的设备自动成为专业版。", + "account.signin": "登录", + "account.signout": "退出登录", + "account.submit": "提交", + "account.username": "用户名", + "account.switch.to.register": "Switch to Create Account", + "account.switch.to.signin": "Switch to Sign In", + "account.invalid.username": "用户名错误", + "account.invalid.email": "Email错误", + "account.password.mismatch": "确认密码和密码不对应。", + "account.password.short": "密码太短。", + "account.password.lowercase": "密码必须有小写字母。", + "account.password.uppercase": "密码必须有大写字母。", + "account.password.number": "密码必须有数字", + "account.password.compromised": "密码不能在已经被泄漏的密码中", + "modal.register.free.header": "注册或登录以访问隐币钱包", + "modal.register.pro.header": "添加账号密码以访问隐币钱包", + "modal.register.pro.signin.header": "Sign in to access Yinbi Wallet", + "modal.register.free.text": "您须通过蓝灯账户使用隐币钱包, 请点击注册或\n登录继续使用。", + "modal.register.pro.text": "请为您的蓝灯账户添加密码以继续使用隐币钱包。", + "modal.register.pro.signin.text": "To use the Yinbi wallet you must sign in to your Lantern account", + "adyen.paymentMethods.title": "支付方式", + "adyen.paymentMethods.storedMethods": "您的支付方式", + "adyen.paymentMethods.otherMethods": "选择其他方式", + "adyen.paymentMethods.moreMethodsButton": "更多支付方式", + "adyen.payButton": "支付", + "adyen.payButton.formatted": "支付 %@", + "adyen.cancelButton": "取消", + "adyen.dismissButton": "OK", + "adyen.storeDetails": "下次继续使用这些信息", + "adyen.payment.redirecting": "你将会被重定向", + "adyen.payment.processing": "支付处理中", + "adyen.creditCard.title": "信用卡详情", + "adyen.creditCard.holderName": "持卡人姓名", + "adyen.creditCard.holderName.placeholder": "J. Smith", + "adyen.creditCard.numberField.title": "卡号", + "adyen.creditCard.numberField.placeholder": "1234 5678 9012 3456", + "adyen.creditCard.numberField.invalid": "卡号无效", + "adyen.creditCard.expiryDateField.title": "到期时间", + "adyen.creditCard.expiryDateField.placeholder": "MM/YY", + "adyen.creditCard.expiryDateField.invalid": "到期时间无效", + "adyen.creditCard.expiryDateField.month": "月", + "adyen.creditCard.expiryDateField.month.placeholder": "MM", + "adyen.creditCard.expiryDateField.year.placeholder": "YY", + "adyen.creditCard.expiryDateField.year": "年", + "adyen.creditCard.cvcField.title": "CVC / CVV", + "adyen.creditCard.cvcField.placeholder": "123", + "adyen.creditCard.installmentsField": "计划分期数", + "adyen.creditCard.storeDetailsButton": "下次付款时自动选择这张卡", + "adyen.creditCard.oneClickVerification.title": "验证信用卡", + "adyen.creditCard.oneClickVerification.message": "请输入%@的CVC码", + "adyen.creditCard.oneClickVerification.invalidInput.title": "CVC码无效", + "adyen.creditCard.oneClickVerification.invalidInput.message": "请输入有效的CVC码", + "adyen.sepaDirectDebit.ibanField.title": "帐号 (IBAN)", + "adyen.sepaDirectDebit.ibanField.placeholder": "NL53 ABNA 1925 1294 122", + "adyen.sepaDirectDebit.ibanField.invalid": "帐号无效", + "adyen.sepaDirectDebit.nameField.title": "持有人名称", + "adyen.sepaDirectDebit.nameField.placeholder": "J. Smith", + "adyen.sepaDirectDebit.consentButton": "我同意以下金额将从我的银行帐户中扣除。", + "adyen.sepa.ownerName": "持有人名称", + "adyen.sepa.ibanNumber": "帐号 (IBAN)", + "adyen.giropay.searchField.placeholder": "银行名称 / BIC代码", + "adyen.giropay.minimumLength": "最少需要3个字符", + "adyen.giropay.noResults": "没有搜索结果", + "adyen.error.title": "错误", + "adyen.error.subtitle.redirect": "重定向失败", + "adyen.error.subtitle.payment": "支付失败", + "adyen.error.subtitle.refused": "支付被拒绝", + "adyen.error.message.unknown": "未知错误", + "adyen.error.message.cannotConnectToInternet": "无法连接互联网,请检查网络。", + "adyen.error.message.cannotConnectToHost": "无法连接支付服务器", + "adyen.error.retryButton": "重试", + "adyen.idealIssuer.selectField.title": "银行", + "adyen.idealIssuer.selectField.placeholder": "选择银行", + "adyen.creditCard.success": "支付成功", + "adyen.oneClick.confirmationAlert.title": "确认 %@ 支付", + "adyen.redirect.cannotOpenApp.title": "无法打开应用", + "adyen.redirect.cannotOpenApp.appNotInstalledMessage": "该应用在这台设备上没有安装,所以无法打开", + "adyen.holderName": "持卡人姓名", + "adyen.countryCode": "国家代码", + "adyen.telephone.number": "电话号码", + "android.download": "蓝灯安卓版", + "android.download.title": "Download Lantern Android", + "authorize.title": "授权设备使用专业版", + "authorize.step1.have_pro_device": "已有其他专业版的设备", + "authorize.step1.link": "通过设备授权登录", + "authorize.step1.email_linking": "通过邮箱授权登录", + "authorize.device_linking_explanation": "如果您身边已经有一台专业版设备,请选用“设备授权”登录", + "authorize.device_email_explanation": "如果您有邮箱验证码,请选用“邮箱授权”登录", + "authorize.link_device": "授权设备", + "authorize.step1.choose": "选择授权设备登录的方式", + "authorize.step1.or": "或", + "authorize.step1.recover": "邮箱登陆", + "authorize.step1.start": "登陆", + "authorize.step1.no_mail": "不记得您的电子邮件地址吗?", + "authorize.step1.description": "请输入您正确的注册邮箱,验证码就会发到你的邮箱", + "authorize.step2b.enter_code": "输入邮箱登陆码", + "authorize.step2b.code": "邮箱登陆码", + "authorize.step2b.instruction": "如果此蓝灯账号存在,蓝灯恢复码已发送到{{email}}。Email送达可能需要几小时,请检查您的垃圾邮件。", + "authorize.step2b.no_mail": "没有收到email", + "authorize.step3.recovery": "帐号登陆", + "authorize.step3.no_email": "出错了!我们找不到对应的邮箱地址。请提供更多信息来找回帐号。", + "authorize.step3.no_code_received": "收不到邮箱登陆码? 请输入以下信息来人工找回帐号,我们会在48小时内联系你。", + "authorize.step3.your_email": "您的邮箱", + "authorize.step3.payment_method": "付款方式", + "authorize.step3.payment_method_hint": "请选择你购买专业版的方式", + "authorize.step3.credit_card": "信用卡", + "authorize.step3.alipay": "支付宝", + "authorize.step3.android_pay": "安卓Pay", + "authorize.step3.by_referral": "因为邀请朋友而免费获得了专业版", + "authorize.step3.payment_account": "付款帐号", + "authorize.step3.payment_account_hint": "请输入支付宝帐号信息", + "authorize.step3.referral_code": "您的邀请码", + "authorize.step3.purchase_date": "付款日期", + "authorize.step3.note": "请输入其他相关信息,方便我们寻找你的帐号。", + "authorize.step4.title": "正在进行帐号恢复", + "authorize.step4.text1": "感谢!我们已收到你的帐号恢复请求。", + "authorize.step4.text2": "请等待48小时让我们寻找你的专业版帐号。", + "authorize.step4.text3": "我们会反馈结果给上面填写的邮箱地址。", + "authorized.continue": "下一步", + "authorized.continue.lantern": "进入蓝灯专业版", + "authorized.text": "当前设备被授权使用您蓝灯专业版账户了!", + "authorized.title": "设备已授权", + "button.account": "帐号", + "button.renew": "续期", + "button.upgrade": "升级", + "button.upgrade_now": "现在升级", + "button.upgrade_to_lantern_pro": "升级到蓝灯专业版", + "button.copy_your_code": "复制您的邀请码", + "button.try_again": "重试", + "button.continue": "继续", + "button.continue_to": "继续使用 {{planType}}", + "bullet.click_button": "点击下面的按钮", + "bullet.paste_code": "复制邀请码和下载链接", + "bullet.send_to_friends": "发送给你的朋友", + "cancel": "取消", + "confirm": "确认", + "norecoveryyinbi": "无法恢复隐币钱包", + "email.recovery.check.email": "请到邮箱查看授权码", + "email.recovery.code.label": "输入或粘贴授权码", + "email.recovery.no.code": "没有收到授权码?", + "email.recovery.text": "请输入您的邮箱,我们将发送验证码协助您重设密码。\n如果您有隐币钱包,上述方法无法恢复您的隐币钱包。如需恢复隐币钱包,请输入隐币助记词", + "email.recovery.desc": "如果您希望通过邮箱收到授权码,请选此方式", + "device.recovery.desc": "如果您已经有专业版设备在身边,请选此方法", + "google_search": "谷歌搜索", + "giveaway.upgrade": "升级蓝灯免费领取当日的隐币分配!", + "giveaway.title_released_today": "当日YNB额度", + "giveaway.what_is_it": "什么是Yinbi赠送?", + "giveaway.description1": "YNB会根据购买当天发放隐币总量,当天购买/续费蓝灯专业版的数量和和时长,您购买/续费蓝灯专业版的数量和时长当日日终直接发放到您的隐币钱包。", + "giveaway.description2": "YNB会根据购买当天发放隐币总量,当天购买/续费蓝灯专业版的数量和和时长,您购买/续费蓝灯专业版的数量和时长当日日终直接发放到您的隐币钱包。", + "giveaway.learn_more": "了解更多", + "link_device": "已经有专业版帐户?请登录", + "email.recovery": "通过邮箱恢复", + "email_taken": "邮箱已使用", + "username_taken": "用户名已使用", + "err.unknown_error": "未知错误", + "err.internal_error": "内部错误", + "err.bad_input": "错误输入", + "err.not_authorized": "登录失败", + "err.user_exists": "用户存在", + "err.no_such_user": "无此用户", + "err.user_already_verified": "用户已验证", + "err.invalid_user_verification": "无效用户验证", + "err.user_unverified": "用户未验证", + "err.operation_temporarily_unavailable": "操作暂时不可用", + "err.wrong_or_inexistent_plan": "错误或不存在的套餐", + "err.user_has_active_subscription": "用户已激活订阅", + "err.payment_error": "支付错误", + "err.no_codes_left": "无邀请码", + "err.wrong_code": "邀请码错误", + "err.redeeming_own_code_not_allowed": "不允许兑换自己的邀请码", + "err.wrong_charge_id": "充值 ID 不正确", + "err.wrong_link_code": "设备授权码错误", + "err.invalid_credentials": "提供的用户凭证无效", + "footer.reseller": "想赚钱吗?成为蓝灯代理商吧。请点击这里。", + "footer.reseller.email_subject": "关于蓝灯代理商的详情", + "footer.reseller.email_body": "当你成为蓝灯代理商,你可以对销售蓝灯专业版销售额进行最多25% 的提成。请联络我们并知之为何想要成为蓝灯代理商。", + "feature.faster_speed": "速度更快", + "feature.faster": "速度更快", + "feature.unlimited": "无限流量", + "feature.nologs": "无服务器记录", + "feature.devices": "支持3个设备", + "feature.noads": "无广告", + "feature.yinbi.tooltip": "隐币基金会将通过蓝灯向购买蓝灯专业版的用户独家赠送 8880 亿个隐币。在每天结束时,基金会会根据当天发布的隐币数量、升级/续费人数以及购买年限或账户数量来发放隐币。隐币将直接存入您在蓝灯的隐币钱包!", + "feature.antiblock": "更抗封锁", + "feature.data_center": "更好的服务器", + "feature.free_yinbi": "免费加密货币!", + "free.title": "蓝灯专业版", + "free.desc": "更快速,更强大,无限流量,安全", + "free.link_account": "已经有专业版帐户?请登录", + "home.get_lantern_pro": "购买蓝灯专业版", + "home.get_lantern_platinum": "升级您的计划", + "home.welcome_popup_subheader": "欢迎用Lantern!", + "home.welcome_popup_content_1": "我们正在努力更新蓝灯,增加新功能。", + "home.welcome_popup_content_2": "在新界面中,您可以在蓝灯网络中搜索文件,您也可以上传文件。这是一个测试功能,欢迎大家测试反馈。", + "home.welcome_popup_button": "试试", + "input.email": "电子邮件", + "input.your_email": "你的Email", + "input.confirm_email": "确认你的Email", + "input.enter_email": "请输入你的Email", + "input.use_valid_email": "请输入有效的电子邮件地址", + "input.email_not_match": "电子邮件地址不相符", + "input.existing_email": "Existing email", + "issue.your_email": "您的邮件", + "issue.attach_image_failure": "无法上传图片", + "issue.try_again": "请重试", + "issue.select_issue": "请选择问题类型", + "issue.selected_issue": "选择问题", + "issue.select_issue_hint": "请用下拉框选择问题类型", + "issue.note": "描述你的问题", + "issue.description": "问题描述", + "issue.error": "报告问题出错", + "issue.submit": "发送报告", + "issue.report_screenshot": "拖拽或点击上传图片", + "issue.reported": "感谢报告问题,我们会尽快通过邮件反馈。", + "issue.report_sent": "报告已发送", + "issue.type.no_access": "无法访问被屏蔽网站", + "issue.type.payment_fail": "无法完成支付", + "issue.type.cannot_login": "无法登录", + "issue.type.always_spinning": "始终显示载入中", + "issue.type.slow": "很慢", + "issue.type.cannot_link_device": "无法链接设备", + "issue.type.crashes": "Lantern 崩溃了", + "issue.type.other": "其他", + "languages.title": "语言", + "lantern.email": "蓝灯邮箱", + "mobile.link": "使用这个链接在您的安卓设备上下载蓝灯", + "mobile.title": "获取安卓版", + "nav.about": "关于", + "nav.account": "账号管理", + "nav.authorize": "授权其他设备使用专业版", + "nav.authorized": "在当前设备登录成功", + "nav.unauthorized_link": "授权设备使用专业版", + "nav.language": "语言", + "nav.lantern": "蓝灯", + "nav.mobile": "获取移动版本", + "nav.report_issue": "报告问题", + "nav.settings": "设置", + "nav.support": "支持", + "nav.verify": "账号验证", + "nav.yinbi": "兑换隐币", + "nav.home": "主页", + "nav.discover": "发现", + "nav.wallet": "钱包", + "nav.yinbi_wallet": "隐币钱包", + "notification.retry": "重试", + "notifications": "通知", + "notifications.whatisnew": "新功能", + "password.change": "修改密码", + "password.changed": "密码修改成功", + "continue.to.pro": "下一步", + "username": "用户名", + "password.new": "新密码", + "password.requirements": "
密码必须包含如下:
  • 8个及以上的字符
  • 1 个小写字母
  • 1 大写字母
  • 至少1个数字
  • 不是已经泄露的密码
", + "password.reset": "重设密码", + "paxful.buy": "购买", + "paxful.payment": "支付方式", + "paxful.bitcoin": "比特币 (BTC)", + "paxful.tether": "泰达币(USDT)", + "paxful.wallet": "电子钱包", + "paxful.bank": "银行转账", + "paxful.gamer_card": "游戏卡", + "paxful.gift_card": "礼品卡", + "paxful.cash": "现金", + "paxful.digital_currency": "数字货币", + "paxful.button": "显示优惠的交易", + "payment.close": "关闭", + "payment.redirectErrorTitle": "Error connecting to payment server", + "payment.redirectErrorText": "We are currently working on resolving this issue. Please check back later.", + "payment.wait_for_pro": "感谢你购买蓝灯专业版。请稍等片刻,蓝灯会自动会变成专业版。", + "payment.moreOptions": "更多选项", + "payment.fewerOptions": "更少选项", + "payment_methods.select_name": "选择付款方式", + "payment_methods.alipay": "信用卡/支付宝", + "payment_methods.shetab": "快速全球支付(Shetab)", + "payment_methods.shetab.details.header": "购买蓝灯专业版", + "payment_methods.shetab.details.body": "当您单击继续购买时,您将被重定向到外部站点以完成支付并收集激活码。", + "payment_methods.shetab.details.tutorial_header": "获取教程", + "payment_methods.shetab.details.purchase_voucher_button": "继续购买", + "payment_methods.shetab.details.input_code_button": "输入激活码", + "plan.step1": "步骤1", + "plan.apply": "应用", + "plan.step2": "步骤2", + "plan.most_popular": "最受欢迎", + "plan.step3": "步骤3", + "plan.choose_plan": "选择套餐", + "plan.enter_email": "输入邮箱", + "plan.choose_method": "选择付款方式", + "plan.bestValue": "最实惠!", + "plan.per_month": "每月", + "plan.yinbi_2x": "两倍隐币", + "plan.oneYear": "1 年", + "plan.add_referral": "输入邀请码", + "plan.years": "{{years}}年版", + "plan.desc": "收取{{price}}", + "plan.bonus_months": "+ {{bonusMonths}} 月", + "plan.price.cny": "¥%.02f", + "plan.price.usd": "$%.02f", + "plan.currency.cny": "(人民币)", + "plan.currency.usd": "(美元)", + "plan.time_unit": "年", + "plan.select": "选择", + "plan.two_year": "两年", + "plan.one_year": "一年", + "plan.savings": "节省 {{formattedDiscount}} %", + "plans.title": "蓝灯专业版套餐", + "plans.lantern_pro": "蓝灯专业版", + "plans.platforms": "支持Windows、安卓、Mac 和 Ubuntu。", + "plans.from_reseller": "有蓝灯专业版激活码吗?请点击这里。", + "plans.with_voucher_code": "网上打折购买了专业版激活码?点此升级", + "pro.apply": "您的积分将在下一个结算周期加入到您的账号。", + "pro.title": "邀请好友来获得更多的专业版使用时间。", + "pro.subtitle": "好友购买两年套餐后,双方都赠送三个月的专业版使用时间;好友购买一年套餐后,双方都会赠送一个月的使用时间。", + "pro.share": "与好友分享您的代码,开始赚取更多积分!", + "promotion.title": "蓝灯专业版购买", + "promotion.title.activation": "蓝灯专业版激活", + "promotion.enter_and_confirm_email": "请输入并确认的你的email地址", + "promotion.code.hint": "请输入邀请码(可选)", + "promotion.code.label": "邀请码", + "promotion.payment": "继续支付", + "promotion.payment.btc": "Pay with ₿", + "promotion.loading": "加载中…", + "promotion.howto_1y": "朋友给您分享了邀请码?输入邀请码,购买一年套餐后自动赠送一个月。", + "promotion.howto_2y": "朋友给您分享了邀请码?输入邀请码,购买两年套餐后自动赠送3个月。", + "promotion.pay": "支付 {{amount}}", + "promotion.select": "选择", + "promotion.promotion_applied_1y": "赠送一个月", + "promotion.promotion_applied_2y": "赠送3个月", + "promotion.too_many_referrals": "此邀请码已经添加。您获赠的时间付款后就能使用了。", + "promotion.activation.enter_and_confirm_email": "请输入并确认你的Email地址来注册蓝灯专业版账号。", + "promotion.activation.label": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", + "promotion.activation.hint": "激活码", + "promotion.activation.instructions": "注册专业版账户,请输入邮箱和代理商处购买的25位激活码", + "promotion.activation.howto": "请输入25位蓝灯专业版激活码。如果你没有激活码,请退回选择套餐界面直接购买,或者在网上寻找蓝灯代理商。", + "promotion.activation.continue": "注册专业版账户", + "promotion.voucher.hint": "激活码", + "promotion.voucher.howto": "请在上面输入您的12个字符的快速全球支付激活码", + "promotion.voucher.label": "XXXXXXXXXXXX", + "promotion.voucher.error.default": "兑换激活码时出错。", + "promotion.voucher.error.invalid_code": "激活码无效", + "promotion.voucher.error.invalid_plan": "与无效预付关联的激活码", + "promotion.voucher.error.already_redeemed": "激活码已被兑换", + "referral.code": "邀请码", + "referral.text": "输入我的邀请码 %s 来获得三个月的蓝灯专业版!立即下载 https://github.com/getlantern/forum", + "referral.description_free": "与朋友分享你的邀请码,双方各获赠1个月时间。", + "referral.description_pro": "与朋友分享你的邀请码,双方各获赠1个月时间。", + "register": "注册", + "renew.subtitle_early": "现在续期立即获赠3个月!", + "renew.subtitle_last_day": "现在续期立即获赠3个月!", + "renew.subtitle_expired": "现在续期立即获赠45天!", + "renew.details_early": "你的蓝灯专业版快要过期了。现在续期可获赠最多3个月!", + "renew.details_last_day": "你的蓝灯专业版今天过期。现在续期可获赠最多3个月!", + "renew.details_expired": "你的蓝灯专业版账号过期了。今天续期可以获赠最多45天!", + "renew.asterisk_early": "* 只有提前续期的用户才能享受这项优惠。", + "renew.asterisk_last_day": "* 这是你获得这项特别优惠的最后机会!", + "renew.asterisk_expired": "* 这是一项限期优惠!", + "renew.plan_label": "蓝灯专业版 - %s", + "renew.plan_renewal_bonus_1_month": "¥%d%s + 免费 1 个月", + "renew.plan_renewal_bonus_months": "¥%d%s + 免费 %d 个月", + "renew.plan_renewal_bonus_days": "¥%d%s + 免费 %d 天", + "renew.next": "下一步", + "renew.decline": "拒接优惠", + "renew.decline_question": "你确认拒绝这个优惠么?", + "renew.decline_yes": "稍后续期", + "renew.decline_dismiss": "现在就续期", + "renew.notification_title_30_days": "现在续期可以获得限量折扣!", + "renew.notification_title_30_days_platinum": "现在续订白金版,可节省大量资金", + "renew.notification_text_30_days": "您的 {{planName}} 账户在 {{remainingDays}} 天后到期。现在续约,可获得长达 3 个月的免费使用期。", + "renew.notification_title_2_days": "{{planName}} 优惠明天结束!", + "renew.notification_text_2_days": "您的 {{planName}} 账户将于明天到期。不要错过享受超值优惠的机会。", + "renew.notification_title_last_day": "最后一次获得优惠的机会!", + "renew.notification_text_last_day": "您的 {{planName}} 账户已过期。今天续订,可获得长达 3 个月的免费服务。", + "replica.upload": "上传", + "replica.favorite": "收藏", + "replica.added_to_favorites": "Added to Favorites", + "replica.filedrop_error": "上传文件错误", + "replica.filedrop_error.file-too-large": "Maximum allowed file size is {{fileSize}}", + "replica.filedrop_error.file-too-small": "File is too small", + "replica.filedrop_error.too-many-files": "Too many files", + "replica.filedrop_error.file-invalid-type": "This file type is not currently supported", + "replica.filedrop_remove_file": "停止上传图片", + "replica.post": "上传文件", + "replica.relevance": "相关度", + "replica.upload_date": "上传日期", + "replica.gallery_view": "预览图展示", + "replica.list_view": "列表展示", + "replica.copy_lantern_link": "复制蓝灯链接", + "replica.documents": "文件", + "replica.audio": "音频", + "replica.application": "应用", + "replica.image": "图片", + "replica.video": "视频", + "replica.web": "网页", + "replica.news": "News", + "replica.upload_alert.dont_show": "不再显示", + "replica.upload_alert.cancel": "取消上传", + "replica.upload_alert.resume": "继续上传", + "replica.upload_alert.info": "重要信息!", + "replica.upload_alert.desc1": "文件上传到蓝灯网络后将去中心化分布式存储。一旦其他用户访问了这些文件,任何人 (包括蓝灯) 都无法将它们从网络中删除。 即使你已经删除该文件,也可能继续存在网络中。", + "replica.upload_alert.desc2": "因此上传敏感内容时请注意不要包含个人信息。", + "replica.add_details": "Add details", + "replica.cannot_edit": "Filenames cannot be edited once published.", + "replica.next": "下一步", + "replica.previous": "上一页", + "replica.selectAll": "全选", + "replica.search_replica": "搜索", + "replica.search_results_info": "此界面i显示蓝灯网络的结果", + "replica.search_results_info_message": "蓝灯网络的结果包含了用户上传的文件", + "replica.no_files_found": "无结果", + "replica.or_content": "你想让其他人看到的内容", + "replica.try_again": "尝试搜索其他关键词,或", + "replica.upload_success": "上传成功", + "replica.cannot_preview": "此文件无法预览", + "replica.no_description": "No description provided", + "replica.size": "dax", + "replica.uploaded": "已上传", + "replica.invalid_link": "无效链接", + "replica.close": "关闭", + "replica.files": "Files", + "replica.upload_history": "Upload history", + "replica.my_favorites": "收藏", + "replica.no_uploads": "还未上传", + "replica.no_favorites": "No Favorites Yet", + "replica.mime_type": "File type: {{mime}}", + "replica.image_loading_error": "加载图片错误", + "replica.play": "Play", + "replica.pause": "Pause", + "replica.scrub": "Scrub", + "replica.skip_forward": "Skip forward", + "replica.skip_backwards": "Skip backwards", + "replica.trending_videos": "热门视频", + "replica.file_uploaded": "Uploaded: {{days}} days ago", + "replica.file_size": "文件大小: %s", + "replica.duration": "Duration", + "replica.filename": "文件名", + "replica.filename_required": "命名文件", + "replica.description_optional": "Add Description", + "replica.expand": "Expand details", + "replica.filetype": "文件类型", + "replica.sortby": "排序", + "replica.link": "链接", + "replica.collapse": "折叠", + "replica.publish": "发布", + "replica.cancel": "取消", + "replica.progress_current_upload": "上传", + "replica.progress_files": "文件", + "replica.progress_of": "of", + "replica.progress_upload_complete": "完成", + "replica.progress_upload_failure": "上传文件失败,请重试", + "replica.upload_in_progress": "上传文件中", + "replica.upload_pending": "正在上传", + "replica.upload_error": "上传失败", + "replica.upload_cancel": "取消上传", + "replica.upload_confirm": "您确认取消上传吗?", + "replica.progress_view": "View", + "replica.delete": "删除", + "replica.remove": "移除", + "replica.delete_file": "删除文件", + "replica.remove_favorite": "Remove from Favorites", + "replica.failed_to_delete": "无法删除", + "replica.failed_to_remove": "Failed to remove", + "replica.link_lookup_failure": "无法找到链接", + "replica.delete_file_confirmation_1": "确定删除?", + "replica.delete_file_confirmation_2": "你的上传", + "replica.remove_favorite_confirmation_1": "Are you sure you want to remove", + "replica.remove_favorite_confirmation_2": "from your favorites", + "replica.share_file": "分享内容", + "replica.download_and_view": "下载/查看", + "replica.download": "下载", + "replica.copy_link": "复制Replica链接", + "replica.find_file": "查找内容", + "replica.file_drop_prompt": "Drop file to begin upload!", + "replica.empty_uploads_text1": "点击", + "replica.empty_uploads_text2": "这里", + "replica.empty_uploads_text3": "来发表您的第一篇文章。", + "replica.error_header": "Oops", + "replica.error": "There was an error processing your request. Please try again.", + "replica.serp_empty": "谷歌对此没有任何搜索结果。", + "replica.disclaimer": "Lantern anonymizes your searches and protects them from third parties", + "settings.general": "通用", + "settings.feedback": "反馈", + "settings.autoLaunch": "系统启动时运行 Lantern", + "settings.autoReport": "安全报告使用统计以帮助改进蓝灯", + "settings.lantern_ads": "Show Lantern Ads", + "settings.lantern_ads_tooltip": "Lantern shows you ads on some websites to help support our service. No user information is collected or passed to our servers. If you turn this option off, you may still see ads, but they will not be from the Lantern network.", + "settings.proxyAll": "代理全部流量", + "settings.proxyAllHelpTitle": "什么叫“代理全部流量”", + "settings.proxyAllHelp1": "如果开启,所有流量将通过蓝灯传输(最安全)", + "settings.proxyAllHelp2": "如果关闭,仅被封锁的流量通过蓝灯传输(最快且常用)", + "settings.show_advanced": "显示高级设置", + "settings.hide_advanced": "隐藏高级设置", + "settings.systemProxy": "管理系统代理", + "settings.title": "设置", + "settings.http_proxy": "HTTP(S)代理服务器:", + "settings.socks_proxy": "SOCKS代理服务器:", + "settings.caution": "请注意:", + "settings.caution_text": "在您取消“管理系统代理”后,您的浏览器和应用程序将不会自动使用蓝灯。手动配置相关设置的方法见上文。", + "settings.select_language": "选择语言", + "settings.diagnostics": "Attach Diagnostic Information", + "settings.diagnostics_tooltip": "Attaching diagnostic information will send the Lantern team data captured from your connection. This will increase our ability to identify and solve your issue.", + "status.lantern": "蓝灯状态", + "status.click_reconnect": "点击重新联网", + "status.server_location": "服务器位置", + "status.tooltip1": "蓝灯智能选择服务器,使您连接至我们最好的数据中心", + "status.tooltip2": "升级蓝灯专业版,使用高速流量,尊享专业版数据中心和优化的服务器", + "status.protected_connection": "已保护您的链接", + "status.please_wait": "这可能需要1-2分钟...", + "status.connecting": "连接中…", + "status.no_internet": "没有联网", + "status.no_internet_connection": "没有互联网连接", + "status.connected": "已连接", + "status.disconnected": "已断开", + "status.throttled": "限速中(高速流量已用尽)", + "status.no_system_proxy": "{{status}},没有管理系统代理", + "status.fail_to_set_system_proxy": "无法将蓝灯设置为系统代理", + "status.fail_to_open_browser": "无法打开浏览器显示蓝灯界面", + "support.forum": "蓝灯用户论坛", + "support.faq": "蓝灯论坛", + "terms_of_service.acknowledgment": "点击 {{buttonText}},即表示您同意接受我们的条款", + "terms_of_service.replica": "点击搜索 ,上传或通过任何方式使用我们的产品 ,即表示您同意我们的 Terms of Service, Privacy Policy and DMCA Policy", + "top_sites.google": "谷歌", + "top_sites.twitter": "推特", + "top_sites.youtube": "油管", + "top_sites.facebook": "脸书", + "top_sites.wikipedia": "维基百科", + "verify.header": "输入或粘贴验证码", + "verify.code": "动态授权码或支持码", + "verify.howto_1": "如果您已经有蓝灯专业版帐户,请输入您的电子邮件地址,以接收验证码,来绑定当前设备。", + "verify.howto_1a": "请输入您的电子邮件地址来验证您的专业版账户。验证通过后您就能绑定多台设备。", + "verify.howto_2": "授权设备使用你的专业版账户", + "verify.howto_3": "在已登陆专业版的设备上点击“授权其他设备使用专业版”", + "verify.howto_4": "在现在这个界面输入上一步获得的动态授权码或支持码", + "verify.reminder": "*请确保两台设备都使用最新版本", + "verify.enter_pin": "输入或粘贴验证码", + "verify.submit": "提交", + "verify.title": "账号验证", + "welcomeToPro.continue": "下一步", + "welcomeToPro.invite": "邀请好友购买,如果对方购买两年套餐,双方都会免费得到三个月的专业版使用时间;如果购买一年套餐,双方都会免费得到一个月的使用时间。现在就邀请!", + "welcomeToPro.thanks": "现在起,蓝灯最高速的数据中心和专线将开始为您提供无限量上网服务。您最多可同时接入三台设备。", + "welcomeToPro.title": "欢迎使用蓝灯专业版", + "welomeToPro.title_exclamation": "欢迎使用蓝灯专业版!", + "purchase.failed": "购买失败,请稍后重试。", + "purchase.success": "购买成功", + "purchase.success_title": "欢迎使用蓝灯 {{planType}}!", + "purchase.success_content_pro": "现在起,蓝灯最高速的数据中心和专线将开始为您提供无限量上网服务。您最多可同时接入三台设备。", + "purchase.success_content_platinum": "现在您可以使用我们的专线和最快的数据中心进行无限量访问。您最多可同时接入三台设备。", + "welcomeToPro.description": "现在您可以访问被封锁网站和服务了。", + "messages.copied_to_clipboard": "代码已复制。与您的朋友分享吧!", + "messages.datacap": "您已经用完了免费的高速流量,将被限速。请升级到专业版来享受无限高速流量。", + "messages.fatal_error": "很抱歉,我们无法连接到蓝灯的服务器。请检查您的网络连接并重试。", + "messages.backend_gone": "很抱歉,蓝灯似乎未在运行。请重启蓝灯并重试。", + "messages.get_help": "获取帮助", + "freeProCredits.title": "邀请好友", + "freeProCredits.shareWithFriends": "和朋友分享邀请码免费获赠专业版", + "freeProCredits.shareWithFriendsDesc": "好友购买两年套餐后,会赠送双方3个月专业版;好友购买一年套餐后,则赠送双方1个月。", + "cards.serverLocation.unknown": "未知", + "cards.serverLocation.description": "最快的服务器位置", + "cards.serverLocation.description-free": "服务器位置", + "cards.serverLocation.description-upgrade": "升级至更快的服务器", + "cards.serverLocation.title": "当前位置", + "cards.serverLocation.location": "%s, %s", + "cards.serverLocation.text": "蓝灯专业版会根据独创的算法和你的本地网络状况智能在日本, 新加坡, 香港, 旧金山, 纽约, 阿姆斯特丹, 班加罗尔等地自动选择最快的服务器。", + "cards.serverLocation.text-free": "蓝灯智能选择服务器,使您连接至我们最好的数据中心", + "cards.serverLocation.upgrade-link": "升级到蓝灯专业版可以获得更快的上网速度,因为专业版有专供的服务器和优化的访问线路。", + "cards.httpsUpgrades.description": "增加网站安全性", + "cards.httpsUpgrades.title": "增加了 %d 个网站的安全性", + "cards.httpsUpgrades.text": "蓝灯会自动将不安全的HTTP链接升级成为加密的HTTPS链接以保证您在访问网站时的信息安全。蓝灯的服务器也无法知道HTTPS链接的内容。", + "cards.adsBlocked.description": "广告拦截", + "cards.adsBlocked.title": "已拦截 %d 个广告", + "cards.adsBlocked.text": "蓝灯会阻止侵入式广告,加快网页加载速度,节省带宽,为您提供更为流畅的浏览体验。", + "cards.dataUsage.description": "数据用量", + "cards.dataUsage.upgrade": "现在升级", + "cards.dataUsage.mb-used": "您已使用本月%d/%dMB高速流量", + "cards.dataUsage.upgrade-link": "升级到专业版可无限量的高速浏览!", + "cards.subscription.description": "专业版购买", + "cards.subscription.renew": "续期", + "cards.subscription.months": "您的蓝灯专业版订阅还有%d个月剩余", + "cards.subscription.days": "您的蓝灯专业版订阅还有%d天剩余", + "cards.subscription.unit.months": "个月", + "cards.subscription.unit.days": "天", + "cards.subscription.renew-link": "续期您的订阅来增加更多使用时间", + "auth.email": "电子邮件", + "auth.username": "用户名", + "auth.username.or.email": "用户名或邮箱", + "auth.signin": "登录", + "current.password": "当前密码", + "new.password": "新密码", + "auth.change.password": "修改密码", + "confirm.new.password": "确认新密码", + "auth.password": "密码", + "auth.have.recovery.phrase": "Have a Recovery Phrase?", + "auth.forgot.password": "忘记或没有密码?", + "auth.create.account": "创建账号", + "auth.missing.username": "缺失用户名", + "auth.missing.current.password": "缺失当前密码", + "auth.missing.new.password": "缺失新密码", + "auth.missing.confirm.password": "缺失再次确认密码", + "invalid_credentials": "无效凭证", + "yinbi.wallet": "隐币钱包", + "create.wallet": "开通钱包", + "new.to.yinbi": "第一次来到隐币?", + "setup.wallet": "是,开通隐币钱包", + "web.wallet": "否,我已经通过网站Yin.bi注册了钱包", + "yinbi.next": "下一步", + "yinbi.amount": "金额", + "yinbi.missing.address": "未提供接收钱包地址", + "yinbi.missing.amount": "未填写具体金额", + "yinbi.missing.email": "未填写具体邮箱", + "yinbi.missing.username": "未填写用户名", + "yinbi.missing.password": "未填写密码", + "yinbi.invalid.address": "{{destination}} 不是一个有效的恒星币地址", + "yinbi.send": "发送", + "yinbi.to": "支付到:", + "yinbi.try_again": "重新尝试?", + "yinbi.success.transaction": "交易成功!", + "yinbi.failure.transaction": "交易失败", + "yinbi.confirm.transaction": "确认交易", + "yinbi.sent.details": "您将支付{{amount}} YNB到 {{destination}}", + "yinbi.sent.failure.details": "您的交易因如下原因失败:", + "yinbi.recipient": "接收方", + "yinbi.available.send": "您有 {{balance}} YNB 可供支付", + "yinbi.wallet.header": "钱包", + "yinbi.send.header": "支付隐币", + "yinbi.recovery.phrase": "隐币恢复助记词", + "yinbi.recover.account": "输入或复制您的隐币助记词以恢复您的隐币钱包及蓝灯账户", + "yinbi.recovery.desc": "如果您希望同时登入隐币钱包和蓝灯账户,请使用此方法", + "yinbi.redeem.codes": "批量兑换隐币", + "yinbi.obtain.codes": "批量获取隐币兑换码请到 reseller.lantern.io", + "yinbi.receive.header": "接收隐币", + "yinbi.this.is.your.wallet": "这是您的隐币钱包地址,他人可通过这个地址向您支付隐币", + "yinbi.your.address": "您的地址", + "yinbi.no.activity.header": "无交易记录", + "yinbi.upgrade.pro.button": "升级到专业版即可免费获取隐币", + "yinbi.renew.pro.button": "专业版续费可免费获赠隐币", + "yinbi.wallet.activity_header": "交易", + "yinbi.wallet.send": "发送", + "yinbi.wallet.receive": "接收", + "yinbi.wallet.balance": "余额", + "yinbi.wallet.getlantern.pro": "获取蓝灯专业版+赠送隐币", + "yinbi.redemption.codes": "隐币兑换码", + "redeem_codes.title": "兑换隐币", + "redeem_codes.redeem_button_text": "兑换", + "redeem_codes.cancel_button_text": "取消", + "redeem_codes.success": "成功", + "redeem_codes.errors.missing_codes": "无效的兑换码", + "redeem_codes.errors.invalid_codes": "错误,请检查标记的兑换码是否正确。\n划掉的兑换码已经过期且不能用于兑换隐币。", + "yinbi.new.account.text": "您的交易收支记录将会显示在这里。", + "yinbi.createAccount": "创建账号", + "yinbi.confirm.account.text": "请确保您正确记下了助记词,并输入如下单词", + "create_account.invalid_words.error": "这个单词与提供的助记词不符", + "yinbi.recovery_text": "这是您的隐币钱包恢复助记词。如果您忘记了密码,这是恢复您的隐币钱包的唯一方式\n建议使用密码管理器或打印存储这些助记词。", + "yinbi.recovery_confirm_text": "这是您的隐币钱包恢复助记词。如果您忘记了密码,这是恢复您的隐币钱包的唯一方式\n建议使用密码管理器或打印存储这些助记词。", + "yinbi.import.wallet": "Import Wallet", + "yinbi.setup.wallet": "Set up Wallet", + "yinbi.importWallet": "导入Yin.bi 钱包", + "yinbi.import.wallet.continue": "Continue to Your Wallet", + "yinbi.import.wallet.success": "Import Wallet Success!", + "yinbi.wallet.text": "使用隐币钱包,您可以创建或登录账户,或导入通过Yin.bi注册的隐币钱包。", + "yinbi.wallet.pro.text": "使用隐币钱包,您可以创建新账户,或导入通过Yin.bi注册的隐币钱包。", + "yinbi.recovery_subheader": "隐币钱包恢复助记词", + "yinbi.import_wallet.subheader": "导入隐币钱包", + "yinbi.import_wallet.text": "将隐币钱包整合到蓝灯,请输入您的隐币密码", + "yinbi.import_wallet.success": "已经成功导入您的隐币钱包,请输入邮箱完成注册", + "yinbi.import_wallet.success_subheader": "钱包导入成功!", + "yinbi.import_wallet.button": "导入Yin.bi 钱包", + "yinbi.import_wallet.success_button": "完成注册", + "yinbi.recovery_passphrase.label_text": "恢复助记词", + "yinbi.recovery_passphrase.copy_button_text": "复制", + "terms_of_service.notice": "提醒", + "terms_of_service.i_agree": "我同意", + "platinum": "白金版", + "platinum.one_year": "1 年价格", + "platinum.two_years": "2 年价格", + "platinum.save": "节省高达 {{savings}}%!", + "platinum.unlimited": "无限流量", + "platinum.logs": "无服务器记录", + "platinum.devices": "支持3个设备", + "platinum.everything_in_pro": "专业版中包含所有内容", + "platinum.faster_data": "速度更快", + "platinum.dedicated": "专线", + "platinum.reliability": "更可靠", + "platinum.platinum_one_year": "蓝灯白金版 1 年", + "platinum.platinum_two_years": "蓝灯白金版 2 年", + "platinum.pro_one_year": "蓝灯专业版 1 年", + "platinum.pro_two_years": "蓝灯专业版 2 年", + "platinum.total": "总计", + "platinum.free": "免费", + "platinum.credit.days": "+ {{ days }} 天", + "platinum.credit.months": "{{ months }} 月", + "platinum.upgrade": "升级为白金版", + "platinum.upgrade_details": "专线 + 更快的数据中心!", + "platinum.unused_time_disclaimer": "专业版用户升级到白金版后,将看到他们转换后的专业版订阅被列为上面的新增时间。", + "p2p.opt_in_description": "Use your internet to help people access the internet uncensored", + "p2p.active_sharing_description": "Your internet sharing is on", + "p2p.dialog.title": "Share internet access", + "p2p.dialog.text.1": "Help others with restricted access to the internet by sharing your connection. By allowing access to your internet, you will be part of a network of volunteers that makes the internet more open.", + "p2p.dialog.text.2": "Sharing will not compromise your identity or safety. You can stop sharing your internet whenever you want.", + "p2p.dialog.yes_button": "YES, START SHARING", + "p2p.dialog.no_button": "CANCEL", + "p2p.banner.introducing": "INTRODUCING", + "top_sites.top_sites": "热门网站" +} \ No newline at end of file diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index d3a76df8c..67484cc71 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,7 +8,7 @@ import Foundation import audioplayers_darwin import device_info_plus import emoji_picker_flutter -import flutter_inappwebview +import flutter_inappwebview_macos import flutter_local_notifications import package_info_plus import path_provider_foundation @@ -16,8 +16,8 @@ import sentry_flutter import share_plus import shared_preferences_foundation import sqflite +import tray_manager import url_launcher_macos -import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) @@ -31,6 +31,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) - WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/macos/Podfile.lock b/macos/Podfile.lock new file mode 100644 index 000000000..e7c9a775e --- /dev/null +++ b/macos/Podfile.lock @@ -0,0 +1,118 @@ +PODS: + - audioplayers_darwin (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - emoji_picker_flutter (0.0.1): + - FlutterMacOS + - flutter_inappwebview_macos (0.0.1): + - FlutterMacOS + - OrderedSet (~> 5.0) + - flutter_local_notifications (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - OrderedSet (5.0.0) + - package_info_plus (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - Sentry/HybridSDK (8.11.0): + - SentryPrivate (= 8.11.0) + - sentry_flutter (0.0.1): + - Flutter + - FlutterMacOS + - Sentry/HybridSDK (= 8.11.0) + - SentryPrivate (8.11.0) + - share_plus (0.0.1): + - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite (0.0.2): + - FlutterMacOS + - FMDB (>= 2.7.5) + - tray_manager (0.0.1): + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) + - flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) + - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + +SPEC REPOS: + trunk: + - FMDB + - OrderedSet + - Sentry + - SentryPrivate + +EXTERNAL SOURCES: + audioplayers_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + emoji_picker_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos + flutter_inappwebview_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos + FlutterMacOS: + :path: Flutter/ephemeral + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + sentry_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqflite: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + tray_manager: + :path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + +SPEC CHECKSUMS: + audioplayers_darwin: dcad41de4fbd0099cb3749f7ab3b0cb8f70b810c + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + emoji_picker_flutter: 533634326b1c5de9a181ba14b9758e6dfe967a20 + flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c + package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + Sentry: 39d57e691e311bdb73bc1ab5bbebbd6bc890050d + sentry_flutter: b2feefdad5b0f06602347172bc7257e8e9da5562 + SentryPrivate: 48712023cdfd523735c2edb6b06bedf26c4730a3 + share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 + shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c + sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea + tray_manager: 9064e219c56d75c476e46b9a21182087930baf90 + url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451 + +PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 + +COCOAPODS: 1.14.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 3dd894737..a657ec999 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -27,6 +27,11 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 5FCF3F922AFC7D4C009D6A84 /* liblantern.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FCF3F912AFC7D4C009D6A84 /* liblantern.dylib */; }; + 5FCF3F942AFC7D54009D6A84 /* liblantern.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 5FCF3F932AFC7D54009D6A84 /* liblantern.dylib */; }; + 5FCF3F972AFC7E30009D6A84 /* liblantern.dylib in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 5FCF3F912AFC7D4C009D6A84 /* liblantern.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 9DD832B42514BE06F2A57F8F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052699D6465AD8C9FB260E23 /* Pods_Runner.framework */; }; + B3ED98C3EAD7718A05708BFE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 335B76D179FE1547C0436C96 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -53,6 +58,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 5FCF3F972AFC7E30009D6A84 /* liblantern.dylib in Bundle Framework */, ); name = "Bundle Framework"; runOnlyForDeploymentPostprocessing = 0; @@ -60,11 +66,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 052699D6465AD8C9FB260E23 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335B76D179FE1547C0436C96 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* androidlantern.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "androidlantern.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* Lantern.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Lantern.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -76,8 +84,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 5EFCF11B904D986D4A21D577 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5FCF3F912AFC7D4C009D6A84 /* liblantern.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = liblantern.dylib; path = ../desktop/liblantern.dylib; sourceTree = ""; }; + 5FCF3F932AFC7D54009D6A84 /* liblantern.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = liblantern.dylib; path = ../desktop/liblantern.dylib; sourceTree = ""; }; + 62A0CE728A7650DA48C7A079 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8C9C86E67EAFCD07D44BC397 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + AC879F58DE513B64977975EB /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + AFBBFEDE105BFCE672710F65 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E4B1E3AE5C56618EE11CED81 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,6 +101,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + B3ED98C3EAD7718A05708BFE /* Pods_RunnerTests.framework in Frameworks */, + 5FCF3F922AFC7D4C009D6A84 /* liblantern.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,12 +110,26 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9DD832B42514BE06F2A57F8F /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 11BD752D62D8AC9522BE0AFD /* Pods */ = { + isa = PBXGroup; + children = ( + AFBBFEDE105BFCE672710F65 /* Pods-Runner.debug.xcconfig */, + E4B1E3AE5C56618EE11CED81 /* Pods-Runner.release.xcconfig */, + 5EFCF11B904D986D4A21D577 /* Pods-Runner.profile.xcconfig */, + 8C9C86E67EAFCD07D44BC397 /* Pods-RunnerTests.debug.xcconfig */, + 62A0CE728A7650DA48C7A079 /* Pods-RunnerTests.release.xcconfig */, + AC879F58DE513B64977975EB /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -120,18 +152,20 @@ 33CC10E42044A3C60003C045 = { isa = PBXGroup; children = ( + 5FCF3F932AFC7D54009D6A84 /* liblantern.dylib */, 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 11BD752D62D8AC9522BE0AFD /* Pods */, ); sourceTree = ""; }; 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* androidlantern.app */, + 33CC10ED2044A3C60003C045 /* Lantern.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -175,6 +209,9 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + 5FCF3F912AFC7D4C009D6A84 /* liblantern.dylib */, + 052699D6465AD8C9FB260E23 /* Pods_Runner.framework */, + 335B76D179FE1547C0436C96 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -186,6 +223,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + A56A104CF890B2C6CDA2E54C /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +242,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + DB5F081946CFFAFA62E68FED /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 3688E6FA6D2AD954539668A3 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -217,7 +257,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* androidlantern.app */; + productReference = 33CC10ED2044A3C60003C045 /* Lantern.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -227,7 +267,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -284,6 +324,7 @@ files = ( 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 5FCF3F942AFC7D54009D6A84 /* liblantern.dylib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -328,6 +369,67 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 3688E6FA6D2AD954539668A3 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + A56A104CF890B2C6CDA2E54C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + DB5F081946CFFAFA62E68FED /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,6 +481,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 8C9C86E67EAFCD07D44BC397 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -387,12 +490,13 @@ PRODUCT_BUNDLE_IDENTIFIER = org.getlantern.androidlantern.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidlantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Lantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; }; name = Debug; }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 62A0CE728A7650DA48C7A079 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -401,12 +505,13 @@ PRODUCT_BUNDLE_IDENTIFIER = org.getlantern.androidlantern.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidlantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Lantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; }; name = Release; }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = AC879F58DE513B64977975EB /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -415,7 +520,7 @@ PRODUCT_BUNDLE_IDENTIFIER = org.getlantern.androidlantern.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidlantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Lantern.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/androidlantern"; }; name = Profile; }; @@ -472,13 +577,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Lantern; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MARKETING_VERSION = 7.7.1; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -598,13 +707,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Lantern; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MARKETING_VERSION = 7.7.1; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -618,13 +731,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Lantern; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MARKETING_VERSION = 7.7.1; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e6bb8e166..78c53b056 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -31,7 +31,7 @@ @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16e..21a3cc14c 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f19..936dcaa41 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,177 @@ { "images" : [ { - "size" : "16x16", + "filename" : "Icon-App-20x20@2x-1.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-60x60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-60x60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-20x20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x-1.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x-1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@2x-1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-76x76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-83.5x83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "iTunesArtwork@2x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + }, + { "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" + "scale" : "1x", + "size" : "16x16" }, { - "size" : "16x16", "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" + "scale" : "2x", + "size" : "16x16" }, { - "size" : "32x32", "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" + "scale" : "1x", + "size" : "32x32" }, { - "size" : "32x32", "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" + "scale" : "2x", + "size" : "32x32" }, { - "size" : "128x128", "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" + "scale" : "1x", + "size" : "128x128" }, { - "size" : "128x128", + "filename" : "iTunesArtwork@2x 5.png", "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" + "scale" : "2x", + "size" : "128x128" }, { - "size" : "256x256", + "filename" : "iTunesArtwork@2x 4.png", "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" + "scale" : "1x", + "size" : "256x256" }, { - "size" : "256x256", + "filename" : "iTunesArtwork@2x 3.png", "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" + "scale" : "2x", + "size" : "256x256" }, { - "size" : "512x512", + "filename" : "iTunesArtwork@2x 2.png", "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" + "scale" : "1x", + "size" : "512x512" }, { - "size" : "512x512", + "filename" : "iTunesArtwork@2x 1.png", "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" + "scale" : "2x", + "size" : "512x512" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 000000000..3bd50f166 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png new file mode 100644 index 000000000..736a76b42 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 000000000..736a76b42 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 000000000..c9d43ed7a Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x-1.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x-1.png new file mode 100644 index 000000000..8d29e5d45 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x-1.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 000000000..8d29e5d45 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png new file mode 100644 index 000000000..438bd1a04 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 000000000..438bd1a04 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 000000000..a30532fd2 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 000000000..736a76b42 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png new file mode 100644 index 000000000..2135f42bf Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 000000000..2135f42bf Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 000000000..1224006a8 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 000000000..1224006a8 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 000000000..24f805da3 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 000000000..5915ab68e Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 000000000..90c2bc455 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 000000000..f25a96e84 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 82b6f9d9a..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 13b35eba5..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index 0a3f5fa40..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index bdb57226d..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index f083318e0..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index 326c0e72c..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 2f1632cfd..000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 1.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 1.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 1.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 2.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 2.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 2.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 3.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 3.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 3.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 4.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 4.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 4.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 5.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 5.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 5.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png new file mode 100644 index 000000000..d29f7e500 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png differ diff --git a/macos/Runner/Assets.xcassets/Contents.json b/macos/Runner/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/macos/Runner/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index cfbb497e2..77dc79c43 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = androidlantern +PRODUCT_NAME = Lantern // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = org.getlantern.androidlantern +PRODUCT_BUNDLE_IDENTIFIER = org.getlantern.lantern // The copyright displayed in application information PRODUCT_COPYRIGHT = Copyright © 2023 org.getlantern. All rights reserved. diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index dddb8a30c..9f56413f3 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -3,7 +3,7 @@ com.apple.security.app-sandbox - + com.apple.security.cs.allow-jit com.apple.security.network.server diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 852fa1a47..b64cdc5b1 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -2,7 +2,13 @@ - com.apple.security.app-sandbox + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server diff --git a/pubspec.lock b/pubspec.lock index 1ee8ef8f6..0c941b617 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -93,18 +93,18 @@ packages: dependency: "direct main" description: name: auto_route - sha256: afa2e3a038efdd9b70478c597161e4c6549a73cd2f5957077d4b311f71104671 + sha256: "82f8df1d177416bc6b7a449127d0270ff1f0f633a91f2ceb7a85d4f07c3affa1" url: "https://pub.dev" source: hosted - version: "7.8.0" + version: "7.8.4" auto_route_generator: dependency: "direct dev" description: name: auto_route_generator - sha256: e7aa9ab44b77cd31a4619d94db645ab5736e543fd0b4c6058c281249e479dfb8 + sha256: "11067a3bcd643812518fe26c0c9ec073990286cabfd9d74b6da9ef9b913c4d22" url: "https://pub.dev" source: hosted - version: "7.3.1" + version: "7.3.2" back_button_interceptor: dependency: transitive description: @@ -197,26 +197,26 @@ packages: dependency: "direct main" description: name: cached_network_image - sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.3.0" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" catcher_2: dependency: "direct main" description: @@ -261,10 +261,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.18.0" convert: dependency: transitive description: @@ -277,10 +277,10 @@ packages: dependency: transitive description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.6.4" credit_card_type_detector: dependency: transitive description: @@ -462,22 +462,14 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.dev" - source: hosted - version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" flutter_driver: dependency: "direct dev" description: flutter @@ -487,18 +479,58 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - sha256: "786b124c944f4914670868c9775c90600a4d4674497f617190c0d676019e337b" + sha256: bd62be6aef0662a4bb55a10fd4dc0a5f0070ad92e2c4879f903a355468ca7643 + url: "https://pub.dev" + source: hosted + version: "6.0.0-beta.30" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: e74d15bf6a62ae399427f00c75e4bb44b349a1ad39df6690ec5268f65fb19918 url: "https://pub.dev" source: hosted - version: "6.0.0-beta.25" + version: "1.0.4" flutter_inappwebview_internal_annotations: dependency: transitive description: name: flutter_inappwebview_internal_annotations - sha256: "064a8ccbc76217dcd3b0fd6c6ea6f549e69b2849a0233b5bb46af9632c3ce2ff" + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: "23228676302a6931ab5b149f5d356cddba72eccfdb4b1f0555bd7d63fe3b0037" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: "0d0b96e51d172b298e5242794778665ff86b56a5d606ee86aab14fed56245f86" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: d614f7d4cfee774094e136b9a7c3b3596c971fcaee99706fa6c8e133082a49c7 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: e276e5417c286d5ba66b833151edb3ec6706fa46b0d1cee04cdfa046595ea797 + url: "https://pub.dev" + source: hosted + version: "1.0.1" flutter_keyboard_visibility: dependency: "direct main" description: @@ -776,10 +808,10 @@ packages: dependency: "direct main" description: name: intl - sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.18.0" + version: "0.18.1" io: dependency: transitive description: @@ -856,26 +888,34 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" + menu_base: + dependency: transitive + description: + name: menu_base + sha256: "820368014a171bd1241030278e6c2617354f492f5c703d7b7d4570a6b8b84405" + url: "https://pub.dev" + source: hosted + version: "0.1.1" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" mime: dependency: "direct main" description: @@ -912,10 +952,10 @@ packages: dependency: transitive description: name: octo_image - sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" package_config: dependency: transitive description: @@ -1012,14 +1052,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" - pedantic: - dependency: transitive - description: - name: pedantic - sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" - url: "https://pub.dev" - source: hosted - version: "1.11.1" permission_handler: dependency: "direct main" description: @@ -1080,18 +1112,18 @@ packages: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.7" pool: dependency: transitive description: @@ -1240,18 +1272,18 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" shared_preferences_web: dependency: transitive description: @@ -1264,10 +1296,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" shelf: dependency: transitive description: @@ -1300,6 +1332,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + shortid: + dependency: transitive + description: + name: shortid + sha256: d0b40e3dbb50497dad107e19c54ca7de0d1a274eb9b4404991e443dadb9ebedb + url: "https://pub.dev" + source: hosted + version: "0.1.2" sky_engine: dependency: transitive description: flutter @@ -1341,10 +1381,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" sprintf: dependency: transitive description: @@ -1373,10 +1413,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stop_watch_timer: dependency: "direct main" description: @@ -1389,10 +1429,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1445,26 +1485,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.1" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.5.9" timezone: dependency: transitive description: @@ -1481,6 +1521,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + tray_manager: + dependency: "direct main" + description: + name: tray_manager + sha256: "4ab709d70a4374af172f8c39e018db33a4271265549c6fc9d269a65e5f4b0225" + url: "https://pub.dev" + source: hosted + version: "0.2.1" typed_data: dependency: transitive description: @@ -1661,58 +1709,26 @@ packages: dependency: transitive description: name: vm_service - sha256: f6deed8ed625c52864792459709183da231ebf66ff0cf09e69b573227c377efe + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 url: "https://pub.dev" source: hosted - version: "11.3.0" - wakelock: - dependency: "direct main" - description: - name: wakelock - sha256: "769ecf42eb2d07128407b50cb93d7c10bd2ee48f0276ef0119db1d25cc2f87db" - url: "https://pub.dev" - source: hosted - version: "0.6.2" - wakelock_macos: + version: "11.10.0" + watcher: dependency: transitive description: - name: wakelock_macos - sha256: "047c6be2f88cb6b76d02553bca5a3a3b95323b15d30867eca53a19a0a319d4cd" + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_platform_interface: + version: "1.1.0" + web: dependency: transitive description: - name: wakelock_platform_interface - sha256: "1f4aeb81fb592b863da83d2d0f7b8196067451e4df91046c26b54a403f9de621" + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted version: "0.3.0" - wakelock_web: - dependency: transitive - description: - name: wakelock_web - sha256: "1b256b811ee3f0834888efddfe03da8d18d0819317f20f6193e2922b41a501b5" - url: "https://pub.dev" - source: hosted - version: "0.4.0" - wakelock_windows: - dependency: transitive - description: - name: wakelock_windows - sha256: "857f77b3fe6ae82dd045455baa626bc4b93cb9bb6c86bf3f27c182167c3a5567" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" web_socket_channel: dependency: transitive description: @@ -1770,13 +1786,13 @@ packages: source: hosted version: "3.9.1" win32: - dependency: "direct overridden" + dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 + sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "5.0.6" win32_registry: dependency: transitive description: @@ -1789,10 +1805,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.3" xml: dependency: transitive description: @@ -1818,5 +1834,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.3 <4.0.0" - flutter: ">=3.10.0" + dart: ">=3.2.0-194.0.dev <4.0.0" + flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index d6074d8d7..7c865fe3d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: flutter_switch: ^0.3.2 flag: ^7.0.0 - #Loogs and crash reporting + # Loogs and crash reporting catcher_2: ^1.0.0 sentry_flutter: ^7.10.1 @@ -51,7 +51,6 @@ dependencies: pin_code_text_field: ^1.8.0 scrollable_positioned_list: ^0.3.8 infinite_scroll_pagination: ^3.2.0 - wakelock: ^0.6.2 email_validator: ^2.1.17 credit_card_validator: ^2.1.0 @@ -63,7 +62,7 @@ dependencies: filesize: ^2.0.1 # Networking - cached_network_image: ^3.2.3 + cached_network_image: ^3.3.0 dio: ^5.3.2 # change this with flutter_downloader @@ -72,7 +71,7 @@ dependencies: flutter_pdfview: ^1.3.1 # Navigation & Localization - auto_route: ^7.8.0 + auto_route: ^7.8.4 i18n_extension: ^7.0.0 intl: ^0.18.0 @@ -91,9 +90,7 @@ dependencies: # URL & Sharing utilities url_launcher: ^6.1.12 share_plus: ^7.1.0 - flutter_inappwebview: ^6.0.0-beta.25 - - + flutter_inappwebview: ^6.0.0-beta.30 # Notifications & Logging flutter_local_notifications: ^15.1.0+1 @@ -107,6 +104,9 @@ dependencies: # Package information package_info_plus: ^4.1.0 + # System tray + tray_manager: ^0.2.1 + # Path, permission & Markdown handling path_provider: ^2.1.0 permission_handler: ^10.4.3 @@ -116,12 +116,6 @@ dependencies: google_mobile_ads: ^3.0.0 # clever_ads_solutions: ^0.1.0 - -# wakelock ^0.6.2 requires win32 ^2.0.0 or ^3.0.0 -# See https://github.com/creativecreatorormaybenot/wakelock/issues/211 -dependency_overrides: - win32: 3.1.4 - dev_dependencies: flutter_test: sdk: flutter @@ -132,7 +126,7 @@ dev_dependencies: flutter_lints: ^2.0.1 test: ^1.15.7 mockito: ^5.0.12 - auto_route_generator: ^7.3.1 + auto_route_generator: ^7.3.2 build_runner: ^2.0.5 # For information on the generic Dart part of this file, see the diff --git a/scripts/screenshot_generation_assets/requirements.txt b/scripts/screenshot_generation_assets/requirements.txt index 738447f37..bde048904 100644 --- a/scripts/screenshot_generation_assets/requirements.txt +++ b/scripts/screenshot_generation_assets/requirements.txt @@ -2,10 +2,10 @@ attrs==18.2.0 Brotli==1.0.9 cffi==1.15.0 cssselect2==0.4.1 -fonttools==4.28.5 +fonttools==4.43.0 html5lib==1.1 ImageHash==4.2.1 -Jinja2==3.0.3 +Jinja2==3.1.3 markdown2==2.4.2 Markdown2PDF==0.1.4 MarkupSafe==2.0.1 diff --git a/test/base_screen_test.dart b/test/base_screen_test.dart index 12a7ce715..4f00798f0 100644 --- a/test/base_screen_test.dart +++ b/test/base_screen_test.dart @@ -55,7 +55,7 @@ void main() { ], ), // TODO <08-08-22, kalli> Confirm we can use BotToast - builder: BotToastInit(), + //builder: BotToastInit(), supportedLocales: [ const Locale('ar', 'EG'), const Locale('fr', 'FR'), diff --git a/test/signaling_test.dart b/test/signaling_test.dart index e0b4d56bf..c09eb9b6a 100644 --- a/test/signaling_test.dart +++ b/test/signaling_test.dart @@ -1,7 +1,8 @@ -import 'package:lantern/messaging/calls/signaling.dart'; +//import 'package:lantern/messaging/calls/signaling.dart'; import 'package:test/test.dart'; void main() { + /* group('forceOpus()', () { test('opus available, force', () { final expected = sdp @@ -37,6 +38,7 @@ void main() { expect(tuneOpus(sdpWithoutAudio, force: true), sdpWithoutAudio); }); }); + */ } final sdp = ''' diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 146b88b84..000000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:androidlantern/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 000000000..d492d0d98 --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 000000000..6cf6d6591 --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(Lantern LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "lantern") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000..903f4899d --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..c20062b8a --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,32 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); + EmojiPickerFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + SentryFlutterPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SentryFlutterPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + TrayManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TrayManagerPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..dc139d85a --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000..3efef9dd7 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,30 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows + emoji_picker_flutter + permission_handler_windows + sentry_flutter + share_plus + tray_manager + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 000000000..394917c05 --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 000000000..6f42d4cc8 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "org.getlantern" "\0" + VALUE "FileDescription", "lantern" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "lantern" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "lantern.exe" "\0" + VALUE "ProductName", "Lantern" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 000000000..955ee3038 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 000000000..6da0652f0 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 000000000..0933eb402 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"Lantern", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 000000000..66a65d1e4 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 000000000..8bc3de85e Binary files /dev/null and b/windows/runner/resources/app_icon.ico differ diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 000000000..a42ea7687 --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 000000000..b2b08734d --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 000000000..3879d5475 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 000000000..60608d0fe --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 000000000..e901dde68 --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_