Compare commits

..

6 Commits

108 changed files with 3551 additions and 7446 deletions

View File

@@ -1,4 +1,3 @@
---
parserOptions: parserOptions:
ecmaVersion: 2017 ecmaVersion: 2017
@@ -12,16 +11,17 @@ env:
es6: true es6: true
jquery: true jquery: true
node: true node: true
mocha: true
globals: globals:
DOMPurify: readonly DOMPurify: false
cleanup: writable after: true
describe: readonly before: true
jsc: readonly cleanup: true
jsdom: writable describe: false
kjua: writable it: false
WebCrypto: writable jsc: false
jsdom: true
kjua: true
# http://eslint.org/docs/rules/ # http://eslint.org/docs/rules/
rules: rules:

6
.gitattributes vendored
View File

@@ -1,6 +1,5 @@
doc/ export-ignore doc/ export-ignore
tst/ export-ignore tst/ export-ignore
img/browserstack.svg export-ignore
js/.istanbul.yml export-ignore js/.istanbul.yml export-ignore
js/.nycrc.yml export-ignore js/.nycrc.yml export-ignore
js/common.js export-ignore js/common.js export-ignore
@@ -19,8 +18,3 @@ js/test/ export-ignore
.styleci.yml export-ignore .styleci.yml export-ignore
.travis.yml export-ignore .travis.yml export-ignore
composer.json export-ignore composer.json export-ignore
composer.lock export-ignore
crowdin.yml export-ignore
BADGES.md export-ignore
CODE_OF_CONDUCT.md export-ignore
Makefile export-ignore

View File

@@ -1,52 +0,0 @@
name: Tests
on: [push]
jobs:
Composer:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Validate composer.json and composer.lock
run: composer validate
- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-suggest
PHPunit:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4']
name: PHP ${{ matrix.php-versions }} unit tests on ${{ matrix.operating-system }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: gd, sqlite3
- name: Remove composer lock
run: rm composer.lock
- name: Setup PHPunit
run: composer install -n
- name: Run unit tests
run: ../vendor/bin/phpunit --no-coverage
working-directory: tst
Mocha:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '12'
- name: Setup Mocha
run: npm install -g mocha
- name: Setup Node modules
run: npm install
working-directory: js
- name: Run unit tests
run: mocha
working-directory: js

4
.gitignore vendored
View File

@@ -12,6 +12,10 @@ data/
doc/* doc/*
!doc/*.md !doc/*.md
# Ignore developers composer status so it isn't accidentally checked in,
# see https://github.com/PrivateBin/PrivateBin/issues/84
composer.lock
# Ignore vendor dir of Composer except PHP files # Ignore vendor dir of Composer except PHP files
vendor/*.* vendor/*.*
vendor/*/*.* vendor/*/*.*

View File

@@ -2,11 +2,3 @@ RewriteEngine on
RewriteCond !%{HTTP_USER_AGENT} "Let's Encrypt validation server" [NC] RewriteCond !%{HTTP_USER_AGENT} "Let's Encrypt validation server" [NC]
RewriteCond %{HTTP_USER_AGENT} ^.*(bot|spider|crawl|https?://|WhatsApp|SkypeUriPreview|facebookexternalhit) [NC] RewriteCond %{HTTP_USER_AGENT} ^.*(bot|spider|crawl|https?://|WhatsApp|SkypeUriPreview|facebookexternalhit) [NC]
RewriteRule .* - [R=403,L] RewriteRule .* - [R=403,L]
<IfModule mod_php7.c>
php_value max_execution_time 30
php_value post_max_size 10M
php_value upload_max_size 10M
php_value upload_max_filesize 10M
php_value max_file_uploads 100
</IfModule>

View File

@@ -17,9 +17,8 @@ disabled:
- concat_without_spaces - concat_without_spaces
- declare_equal_normalize - declare_equal_normalize
- heredoc_to_nowdoc - heredoc_to_nowdoc
- method_argument_space_strict - method_argument_space
- new_with_braces - new_with_braces
- no_alternative_syntax
- phpdoc_align - phpdoc_align
- phpdoc_no_access - phpdoc_no_access
- phpdoc_separation - phpdoc_separation

35
.travis.yml Normal file
View File

@@ -0,0 +1,35 @@
language: php
sudo: false
php:
- '5.5'
- '5.6'
- '7.0'
- '7.1'
- '7.2'
- '7.3'
# as this is a php project, node.js (for JS unit testing) isn't installed
install:
- if [ ! -d "$HOME/.nvm" ]; then mkdir -p $HOME/.nvm && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | NVM_METHOD=script bash; fi
- source ~/.nvm/nvm.sh && nvm install --lts
before_script:
- composer install -n
- npm install -g mocha
- cd js && npm install
script:
- mocha
- cd ../tst && ../vendor/bin/phpunit
after_script:
- ../vendor/bin/test-reporter --coverage-report log/coverage-clover.xml
- cd .. && vendor/bin/codacycoverage clover tst/log/coverage-clover.xml
cache:
directories:
- $HOME/.composer/cache/files
- $HOME/.composer/cache/vcs
- $HOME/.nvm
- $HOME/.npm
- js/node_modules

View File

@@ -1,11 +0,0 @@
# Badges
[![Build Status](https://travis-ci.org/PrivateBin/PrivateBin.svg?branch=master)](https://travis-ci.org/PrivateBin/PrivateBin) [![Build Status](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/build.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/build-status/master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin)
[![Code Climate](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/gpa.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff/mini.png)](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff)
[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin)
[![Test Coverage](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/coverage.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin/coverage) [![Code Coverage](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
[![BrowserStack - cross browser testing](img/browserstack.svg)](https://www.browserstack.com/)

View File

@@ -1,50 +1,6 @@
# PrivateBin version history # PrivateBin version history
* **1.4 (not yet released)** * **1.3 (not yet released)**
* ADDED: Translation for Hebrew
* CHANGED: Upgrading libraries to: DOMpurify 2.1.1
* **1.3.4 (2020-03-22)**
* CHANGED: Minimum required PHP version is 5.6, due to a change in the identicon library and to use php's native hash_equals()
* CHANGED: Upgrading libraries to: identicon 2.0.0
* FIXED: Support custom expiration options in email function (#586)
* FIXED: Regression with encoding of HTML entities (#588)
* FIXED: Unable to paste password on paste with attachment (#565 & #595)
* **1.3.3 (2020-02-16)**
* CHANGED: Upgrading libraries to: DOMpurify 2.0.8
* CHANGED: Several translations got updated with missing messages
* CHANGED: Introduce HTML entity encoding on server side (#581)
* FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560)
* **1.2.3 (2020-02-16)**
* CHANGED: Upgrading libraries to: DOMpurify 2.0.8
* CHANGED: Introduce HTML entity encoding on server side (#581)
* FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560)
* **1.3.2 (2020-01-11)**
* ADDED: Translation for Ukrainian (#533)
* ADDED: Option to send a mail with the link, when creating a paste (#398)
* ADDED: Add support for CONFIG_PATH environment variable (#552)
* CHANGED: Upgrading libraries to: base-x 3.0.7, DOMpurify 2.0.7 & Showdown 1.9.1
* FIXED: HTML injection via unescaped attachment filename (#554)
* FIXED: Password disabling option (#527)
* **1.2.2 (2020-01-11)**
* CHANGED: Upgrading libraries to: bootstrap 3.4.1, DOMpurify 2.0.7, jQuery 3.4.1, kjua 0.6.0, Showdown 1.9.1 & SJCL 1.0.8
* FIXED: HTML injection via unescaped attachment filename (#554)
* **1.3.1 (2019-09-22)**
* ADDED: Translation for Bulgarian (#455)
* CHANGED: Improved mobile UI - obscured send button and hard to click shortener button (#477)
* CHANGED: Enhanced URL shortener integration (#479)
* CHANGED: Improved file upload drag & drop UI (#317)
* CHANGED: Increased default size limit from 2 to 10 MiB, switch data from BLOB to MEDIUMBLOB in MySQL (#458)
* CHANGED: Upgrading libraries to: DOMpurify 2.0.1
* FIXED: Enabling browsers without WASM to create pastes and read uncompressed ones (#454)
* FIXED: Cloning related issues (#489, #491, #493, #494)
* FIXED: Enable file operation only when editing (#497)
* FIXED: Clicking 'New' on a previously submitted paste does not blank address bar (#354)
* FIXED: Clear address bar when create new paste from existing paste (#479)
* FIXED: Discussion section not hiding when new/clone paste is clicked on (#484)
* FIXED: Showdown.js error when posting svg qrcode (#485)
* FIXED: Failed to handle the case where user cancelled attachment selection properly (#487)
* FIXED: Displaying the appropriate errors in older browsers (#508)
* **1.3 (2019-07-09)**
* ADDED: Translation for Czech (#424) * ADDED: Translation for Czech (#424)
* ADDED: Threat modeled the application (#177) * ADDED: Threat modeled the application (#177)
* ADDED: Made compression configurable (#38) * ADDED: Made compression configurable (#38)

View File

@@ -1,9 +0,0 @@
# Netiquette
As suggested by the current project hoster, we are hereby referring to
[RFC 1855](https://tools.ietf.org/html/rfc1855) as a minimum set of guidelines
of Network Etiquette for individuals interacting on this project.
The maintainers of this project reserve the right to remove unlawful or
disrupting content and block users that repeatedly disturb the project at their
discretion.

View File

@@ -25,8 +25,6 @@ Sébastien Sauvage - original idea and main developer
* PunKeel - first docker container * PunKeel - first docker container
* thororm - Display of video, audio & PDF, drag & drop, preview of attachments * thororm - Display of video, audio & PDF, drag & drop, preview of attachments
* Harald Leithner - base58 encoding of key * Harald Leithner - base58 encoding of key
* Haocen - lots of bugfixes and UI improvements
* Lucas Savva - configurable config file location, NixOS packaging
## Translations ## Translations
* Hexalyse - French * Hexalyse - French
@@ -44,6 +42,3 @@ Sébastien Sauvage - original idea and main developer
* Michael van Schaik - Dutch * Michael van Schaik - Dutch
* Péter Tabajdi - Hungarian * Péter Tabajdi - Hungarian
* info-path - Czech * info-path - Czech
* BigWax - Bulgarian
* AndriiZ - Ukrainian
* Yaron Shahrabani - Hebrew

View File

@@ -50,27 +50,6 @@ process (see also
> PrivateBin will look for your includes / data here: > PrivateBin will look for your includes / data here:
> /home/example.com/secret/privatebin > /home/example.com/secret/privatebin
### Changing the config path only
In situations where you want to keep the PrivateBin static files separate from the
rest of your data, or you want to reuse the installation files on multiple vhosts,
you may only want to change the `conf.php`. In this instance, you can set the
`CONFIG_PATH` environment variable to the absolute path to the `conf.php` file.
This can be done in your web server's virtual host config, the PHP config, or in
the index.php if you choose to customize it.
Note that your PHP process will need read access to the config wherever it may be.
> #### CONFIG_PATH example
> Setting the value in an Apache Vhost:
> SetEnv CONFIG_PATH /var/lib/privatebin/conf.php
>
> In a php-fpm pool config:
> env[CONFIG_PATH] = /var/lib/privatebin/conf.php
>
> In the index.php, near the top:
> putenv('CONFIG_PATH=/var/lib/privatebin/conf.php');
### Transport security ### Transport security
When setting up PrivateBin, also set up HTTPS, if you haven't already. Without HTTPS When setting up PrivateBin, also set up HTTPS, if you haven't already. Without HTTPS
@@ -87,9 +66,8 @@ See [this FAQ item](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#what-are-t
In the file `cfg/conf.php` you can configure PrivateBin. A `cfg/conf.sample.php` In the file `cfg/conf.php` you can configure PrivateBin. A `cfg/conf.sample.php`
is provided containing all options and default values. You can copy it to is provided containing all options and default values. You can copy it to
`cfg/conf.php` and adapt it as needed. Alternatively you can copy it anywhere and `cfg/conf.php` and adapt it as needed. The config file is divided into multiple
set the `CONFIG_PATH` environment variable (see above notes). The config file is sections, which are enclosed in square brackets.
divided into multiple sections, which are enclosed in square brackets.
In the `[main]` section you can enable or disable the discussion feature, set In the `[main]` section you can enable or disable the discussion feature, set
the limit of stored pastes and comments in bytes. The `[traffic]` section lets the limit of stored pastes and comments in bytes. The `[traffic]` section lets
@@ -161,7 +139,7 @@ For reference or if you want to create the table schema for yourself to avoid ha
```sql ```sql
CREATE TABLE prefix_paste ( CREATE TABLE prefix_paste (
dataid CHAR(16) NOT NULL, dataid CHAR(16) NOT NULL,
data MEDIUMBLOB, data BLOB,
postdate INT, postdate INT,
expiredate INT, expiredate INT,
opendiscussion INT, opendiscussion INT,
@@ -187,7 +165,7 @@ CREATE INDEX parent ON prefix_comment(pasteid);
CREATE TABLE prefix_config ( CREATE TABLE prefix_config (
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id) id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
); );
INSERT INTO prefix_config VALUES('VERSION', '1.3.4'); INSERT INTO prefix_config VALUES('VERSION', '1.2.1');
``` ```
In **PostgreSQL**, the data, attachment, nickname and vizhash columns needs to be TEXT and not BLOB or MEDIUMBLOB. In **PostgreSQL**, the data, attachment, nickname and vizhash columns needs to be TEXT and not BLOB or MEDIUMBLOB.

View File

@@ -1,53 +0,0 @@
.PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help
CURRENT_VERSION = 1.3.4
VERSION ?= 1.3.5
VERSION_FILES = index.php cfg/ *.md css/ i18n/ img/ js/privatebin.js lib/ Makefile tpl/ tst/
REGEX_CURRENT_VERSION := $(shell echo $(CURRENT_VERSION) | sed "s/\./\\\./g")
REGEX_VERSION := $(shell echo $(VERSION) | sed "s/\./\\\./g")
all: coverage doc ## Equivalent to running `make coverage doc`.
coverage: coverage-js coverage-php ## Run all unit tests and generate code coverage reports.
coverage-js: ## Run JS unit tests and generate code coverage reports.
cd js && nyc mocha
coverage-php: ## Run PHP unit tests and generate code coverage reports.
cd tst && phpunit 2> /dev/null
cd log/php-coverage-report && sed -i "s#$(CURDIR)##g" *.html */*.html
doc: doc-js doc-php ## Generate all code documentation.
doc-js: ## Generate JS code documentation.
jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js
doc-php: ## Generate JS code documentation.
phpdoc --visibility public,protected,private -t doc/phpdoc -d lib/
increment: ## Increment and commit new version number, set target version using `make increment VERSION=1.2.3`.
for F in `grep -l -R $(REGEX_CURRENT_VERSION) $(VERSION_FILES) | grep -v -e tst/log/ -e ":0" -e CHANGELOG.md`; \
do \
sed -i "s/$(REGEX_CURRENT_VERSION)/$(REGEX_VERSION)/g" $$F; \
done
git add $(VERSION_FILES)
git commit -m "incrementing version"
sign: ## Sign a release.
git tag $(VERSION)
git push --tags
signrelease.sh
test: test-js test-php ## Run all unit tests.
test-js: ## Run JS unit tests.
cd js && mocha
test-php: ## Run PHP unit tests.
cd tst && phpunit --no-coverage
help: ## Displays these usage instructions.
@echo "Usage: make <target(s)>"
@echo
@echo "Specify one or multiple of the following targets and they will be processed in the given order:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "%-16s%s\n", $$1, $$2}' $(MAKEFILE_LIST)

View File

@@ -1,6 +1,13 @@
# [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/) # [<img alt="PrivateBin" src="https://cdn.rawgit.com/PrivateBin/assets/master/images/minified/logo.svg" width="500" />](https://privatebin.info/)
[![Build Status](https://travis-ci.org/PrivateBin/PrivateBin.svg?branch=master)](https://travis-ci.org/PrivateBin/PrivateBin) [![Build Status](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/build.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/build-status/master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin)
[![Code Climate](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/gpa.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff/mini.png)](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff)
[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin)
[![Test Coverage](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/coverage.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin/coverage) [![Code Coverage](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
*Current version: 1.3.4* *Current version: 1.2.1*
**PrivateBin** is a minimalist, open source online [pastebin](https://en.wikipedia.org/wiki/Pastebin) **PrivateBin** is a minimalist, open source online [pastebin](https://en.wikipedia.org/wiki/Pastebin)
where the server has zero knowledge of pasted data. where the server has zero knowledge of pasted data.
@@ -95,10 +102,10 @@ file](https://github.com/PrivateBin/PrivateBin/wiki/Configuration):
## Further resources ## Further resources
* [FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ)
* [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation) * [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation)
* [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha)
* [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration) * [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration)
* [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) * [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates)

View File

@@ -1,18 +0,0 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.3.4 | :heavy_check_mark: |
| < 1.3.4 | :x: |
## Reporting a Vulnerability
You can send us email at security@privatebin.org. You should be able to get
a response within a week (usually during the next weekend). The respondee will
reply from their personal address and can offer you their GPG public key to
support end-to-end encrypted communication on sensitive topics or attachments.
You can also contact us via the regular issue tracker if the risk of early
publication is low or you would request input from other PrivateBin users.

View File

@@ -7,10 +7,6 @@
; (optional) set a project name to be displayed on the website ; (optional) set a project name to be displayed on the website
; name = "PrivateBin" ; name = "PrivateBin"
; The full URL, with the domain name and directories that point to the PrivateBin files
; This URL is essential to allow Opengraph images to be displayed on social networks
; basepath = ""
; enable or disable the discussion feature, defaults to true ; enable or disable the discussion feature, defaults to true
discussion = true discussion = true
@@ -33,8 +29,8 @@ defaultformatter = "plaintext"
; (optional) set a syntax highlighting theme, as found in css/prettify/ ; (optional) set a syntax highlighting theme, as found in css/prettify/
; syntaxhighlightingtheme = "sons-of-obsidian" ; syntaxhighlightingtheme = "sons-of-obsidian"
; size limit per paste or comment in bytes, defaults to 10 Mebibytes ; size limit per paste or comment in bytes, defaults to 2 Mebibytes
sizelimit = 10485760 sizelimit = 2097152
; template to include, default is "bootstrap" (tpl/bootstrap.php) ; template to include, default is "bootstrap" (tpl/bootstrap.php)
template = "bootstrap" template = "bootstrap"
@@ -64,26 +60,17 @@ languageselection = false
; a different user when the same username was used in a comment. It might be ; a different user when the same username was used in a comment. It might be
; used to get the IP of a non anonymous comment poster if the server salt is ; used to get the IP of a non anonymous comment poster if the server salt is
; leaked and a SHA256 HMAC rainbow table is generated for all (relevant) IPs. ; leaked and a SHA256 HMAC rainbow table is generated for all (relevant) IPs.
; Can be set to one these values: "none" / "vizhash" / "identicon" (default). ; Can be set to one these values: none / vizhash / identicon (default).
; icon = "none" ; icon = none
; Content Security Policy headers allow a website to restrict what sources are ; Content Security Policy headers allow a website to restrict what sources are
; allowed to be accessed in its context. You need to change this if you added ; allowed to be accessed in its context. You need to change this if you added
; custom scripts from third-party domains to your templates, e.g. tracking ; custom scripts from third-party domains to your templates, e.g. tracking
; scripts or run your site behind certain DDoS-protection services. ; scripts or run your site behind certain DDoS-protection services.
; Check the documentation at https://content-security-policy.com/ ; Check the documentation at https://content-security-policy.com/
; Notes: ; Note: If you use a bootstrap theme, you can remove the allow-popups from the sandbox restrictions.
; - If you use a bootstrap theme, you can remove the allow-popups from the ; By default this disallows to load images from third-party servers, e.g. when they are embedded in pastes. If you wish to allow that, you can adjust the policy here. See https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-it-load-embedded-images for details.
; sandbox restrictions. ; cspheader = "default-src 'none'; manifest-src 'self'; connect-src *; script-src 'self' 'unsafe-eval'; style-src 'self'; font-src 'self'; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals"
; - By default this disallows to load images from third-party servers, e.g. when
; they are embedded in pastes. If you wish to allow that, you can adjust the
; policy here. See https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-it-load-embedded-images
; for details.
; - The 'unsafe-eval' is used in two cases; to check if the browser supports
; async functions and display an error if not and for Chrome to enable
; webassembly support (used for zlib compression). You can remove it if Chrome
; doesn't need to be supported and old browsers don't need to be warned.
; cspheader = "default-src 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'unsafe-eval' resource:; style-src 'self'; font-src 'self'; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-downloads"
; stay compatible with PrivateBin Alpha 0.19, less secure ; stay compatible with PrivateBin Alpha 0.19, less secure
; if enabled will use base64.js version 1.7 instead of 2.1.9 and sha1 instead of ; if enabled will use base64.js version 1.7 instead of 2.1.9 and sha1 instead of
@@ -99,8 +86,8 @@ languageselection = false
; Pick compression algorithm or disable it. Only applies to pastes/comments ; Pick compression algorithm or disable it. Only applies to pastes/comments
; created after changing the setting. ; created after changing the setting.
; Can be set to one these values: "none" / "zlib" (default). ; Can be set to one these values: none / zlib (default).
; compression = "zlib" ; compression = zlib
[expire] [expire]
; expire value that is selected per default ; expire value that is selected per default

View File

@@ -24,11 +24,13 @@
"docs" : "https://privatebin.info/codedoc/" "docs" : "https://privatebin.info/codedoc/"
}, },
"require" : { "require" : {
"php" : "^5.6.0 || ^7.0", "php" : "^5.5.0 || ^7.0",
"paragonie/random_compat" : "2.0.18", "paragonie/random_compat" : "2.0.18",
"yzalis/identicon" : "2.0.0" "yzalis/identicon" : "1.2.0"
}, },
"require-dev" : { "require-dev" : {
"codacy/coverage" : "dev-master",
"codeclimate/php-test-reporter" : "dev-master",
"phpunit/phpunit" : "^4.6 || ^5.0" "phpunit/phpunit" : "^4.6 || ^5.0"
}, },
"autoload" : { "autoload" : {

1509
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +0,0 @@
files:
- source: /i18n/en.json
translation: /i18n/%two_letters_code%.json

View File

@@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
body { body {
@@ -80,29 +80,10 @@ body.loading {
margin-bottom: 20px; margin-bottom: 20px;
} }
#dropzone {
text-align: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
opacity: 0.6;
background-color: #99ccff;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 25vh;
outline: 2px dashed #228bff;
outline-offset: -50px;
}
.dragAndDropFile{ .dragAndDropFile{
color: #777; color:#777;
font-size: 1em; font-size:1em;
display: inline; display:inline;
white-space: normal;
} }
#deletelink { #deletelink {
@@ -131,9 +112,8 @@ body.loading {
margin-bottom: 10px; margin-bottom: 10px;
} }
#message, .replymessage { #message {
font-family: monospace; font-family: monospace;
resize: vertical;
} }
#nickname { #nickname {
@@ -144,10 +124,6 @@ body.loading {
margin-bottom: 10px; margin-bottom: 10px;
} }
#filewrap {
transition: background-color 0.75s ease-out;
}
.comment { .comment {
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
padding: 5px 0 5px 10px; padding: 5px 0 5px 10px;
@@ -155,7 +131,7 @@ body.loading {
transition: background-color 0.75s ease-out; transition: background-color 0.75s ease-out;
} }
.highlight { .comment.highlight {
background-color: #ffdd86; background-color: #ffdd86;
transition: background-color 0.2s ease-in; transition: background-color 0.2s ease-in;
} }
@@ -171,77 +147,3 @@ li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 {
.dark-theme .alert-info .alert-link { .dark-theme .alert-info .alert-link {
color: #fff; color: #fff;
} }
/* address 2K or 4K monitors when using bootstrap 3 */
@media (min-width: 1280px) {
.container {
width: 100%;
padding-left: 4ch;
padding-right: 4ch;
}
}
.modal-dialog {
margin: auto !important;
}
/* makeup for the original margin on modal-dialog */
@media (min-width: 768px) {
.modal-content {
margin: 30px 0;
}
}
.modal-content {
margin: 10px;
}
.modal-body {
display: flex;
justify-content: center;
align-items: center;
}
.modal .modal-content button {
margin: 0.5em 0;
}
/* sidebar */
#menu-toggle {
position: relative;
bottom: -94px;
left: -61px;
margin-bottom: -12px;
transform: rotate(90deg);
}
@media (max-width: 768px) {
#menu-toggle {
position: static;
margin-bottom: 1em;
transform: rotate(0);
}
}
main {
transition: all 0.5s ease;
}
main.toggled {
padding-left: 450px;
}
#sidebar-wrapper {
position: fixed;
width: 450px;
height: 100%;
left: -450px;
padding-left: 4ch;
overflow-y: scroll;
overflow-x: hidden;
transition: all 0.5s ease;
}
main.toggled #sidebar-wrapper {
left: 0;
}

View File

@@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
/* When there is no script at all other */ /* When there is no script at all other */

View File

@@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved. /* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved.
@@ -102,7 +102,6 @@ h3.title {
padding: 5px; padding: 5px;
white-space: pre-wrap; white-space: pre-wrap;
font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace; font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace;
resize: vertical;
} }
#attachmentPreview img { #attachmentPreview img {
@@ -116,29 +115,10 @@ h3.title {
margin-bottom: 20px; margin-bottom: 20px;
} }
#dropzone {
text-align: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
opacity: 0.6;
background-color: #99ccff;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 25vh;
outline: 2px dashed #228bff;
outline-offset: -50px;
}
.dragAndDropFile{ .dragAndDropFile{
color: #777; color:#777;
font-size: 1em; font-size:1em;
display: inline; display:inline;
white-space: normal;
} }
#status { #status {
@@ -425,15 +405,6 @@ h4.title {
.commentdate { color: #bfcede; } .commentdate { color: #bfcede; }
#filewrap {
transition: background-color 0.75s ease-out;
}
.highlight {
background-color: #ffdd86;
transition: background-color 0.2s ease-in;
}
img.vizhash { img.vizhash {
width: 16px; width: 16px;
height: 16px; height: 16px;

View File

@@ -55,6 +55,6 @@ $ ln -s /usr/bin/nodejs /usr/local/bin/node
To generate the documentation, change into the main directory and run phpdoc: To generate the documentation, change into the main directory and run phpdoc:
```console ```console
$ cd PrivateBin $ cd PrivateBin
$ jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js $ jsdoc -p -d doc/jsdoc js/privatebin.js
``` ```

View File

@@ -1,181 +0,0 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s е изчистен и изцяло достъпен като отворен код, онлайн \"paste\" услуга, където сървъра не знае подадената информация. Тя се шифрова/дешифрова <i>във браузъра</i> използвайки 256 битов AES алгоритъм. Повече информация може да намерите на <a href=\"https://privatebin.info/\">страницата на проекта (Английски)</a>",
"Because ignorance is bliss": "Невежеството е блаженство",
"en": "bg",
"Paste does not exist, has expired or has been deleted.": "Информацията не съществува, срокът и е изтекъл или е била изтрита.",
"%s requires php %s or above to work. Sorry.": "%s има нужда от PHP %s или по-нова, за да работи. Съжалявам.",
"%s requires configuration section [%s] to be present in configuration file.": "%s задължава отдела от настройките [%s] да съществува във файла със настройките.",
"Please wait %d seconds between each post.": "Моля изчакайте %d секунди между всяка публикация.",
"Paste is limited to %s of encrypted data.": "Съдържанието е ограничено до %s криптирана информация.",
"Invalid data.": "Невалидна информация.",
"You are unlucky. Try again.": "Нямаш късмет. Пробвай отново.",
"Error saving comment. Sorry.": "Грешка в запазването на коментара. Съжалявам.",
"Error saving paste. Sorry.": "Грешка в записването на информацията. Съжалявам.",
"Invalid paste ID.": "Невалиден идентификационен код.",
"Paste is not of burn-after-reading type.": "Информацията не е от тип \"унищожаване след преглед\".",
"Wrong deletion token. Paste was not deleted.": "Невалиден код за изтриване. Информацията Ви не беше изтрита.",
"Paste was properly deleted.": "Информацията Ви е изтрита.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Услугата %s се нуждае от JavaScript, за да работи. Съжаляваме за неудобството.",
"%s requires a modern browser to work.": "%s се нуждае от съвременен браузър за да работи.",
"New": "Създаване",
"Send": "Изпрати",
"Clone": "Дублирай",
"Raw text": "Чист текст",
"Expires": "Изтича",
"Burn after reading": "Унищожи след преглед",
"Open discussion": "Отворена дискусия",
"Password (recommended)": "Парола (препоръчва се)",
"Discussion": "Коментари",
"Toggle navigation": "Включи или Изключи навигацията",
"%d seconds": [
"%d секунди",
"%d секунда",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
],
"%d minutes": [
"%d минути",
"%d минута",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
],
"%d hours": [
"%d часа",
"%d час",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
],
"%d days": [
"%d дни",
"%d ден",
"%d days (2nd plural)",
"%d days (3rd plural)"
],
"%d weeks": [
"%d седмици",
"%d седмица",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
],
"%d months": [
"%d месеци",
"%d месец",
"%d months (2nd plural)",
"%d months (3rd plural)"
],
"%d years": [
"%d години",
"%d година",
"%d years (2nd plural)",
"%d years (3rd plural)"
],
"Never": "Никога",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Забележка: Това е пробна услуга: Информацията може да бъде изтрита по всяко време. Котета ще измрат ако злоупотребиш с услугата.",
"This document will expire in %d seconds.": [
"Този документ изтича след една секунда.",
"Този документ изтича след %d секунди.",
"This document will expire in %d seconds (2nd plural)",
"This document will expire in %d seconds (3rd plural)"
],
"This document will expire in %d minutes.": [
"Този документ изтича след една минута.",
"Този документ изтича след %d минути.",
"This document will expire in %d minutes (2nd plural)",
"This document will expire in %d minutes (3rd plural)"
],
"This document will expire in %d hours.": [
"Този документ изтича след един час.",
"Този документ изтича след %d часа.",
"This document will expire in %d hours (2nd plural)",
"This document will expire in %d hours (3rd plural)"
],
"This document will expire in %d days.": [
"Този документ изтича след един ден.",
"Този документ изтича след %d дни.",
"This document will expire in %d days (2nd plural)",
"This document will expire in %d days (3rd plural)"
],
"This document will expire in %d months.": [
"Този документ изтича след една година.",
"Този документ изтича след %d години.",
"This document will expire in %d months (2nd plural)",
"This document will expire in %d months (3rd plural)"
],
"Please enter the password for this paste:": "Моля въведете паролата за това съдържание:",
"Could not decrypt data (Wrong key?)": "Информацията не можеше да се дешифрова (Грешен ключ?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Изтриването на информацията беше неуспешно. Тя не е от тип \"унищожаване след преглед\".",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "САМО ЗА ВАШИТЕ ОЧИ. Не затваряйте прозореца, понеже тази информация няма да може да бъде показана отново.",
"Could not decrypt comment; Wrong key?": "Дешифроването на коментара беше неуспешно. Грешен ключ?",
"Reply": "Отговор",
"Anonymous": "Безименен",
"Avatar generated from IP address": "Аватар (на базата на IP адреса Ви)",
"Add comment": "Добави коментар",
"Optional nickname…": "Избирателен псевдоним",
"Post comment": "Публикувай коментара",
"Sending comment…": "Изпращане на коментара Ви…",
"Comment posted.": "Коментара Ви е публикуван.",
"Could not refresh display: %s": "Презареждането на екрана беше неуспешно: %s",
"unknown status": "Неизвестно състояние",
"server error or not responding": "Грешка в сървъра или не отговаря",
"Could not post comment: %s": "Публикуването на коментара Ви беше неуспешно: %s",
"Sending paste…": "Изпращане на информацията Ви…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Вашата връзка е <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Натиснете [Ctrl]+[c] за да копирате)</span>",
"Delete data": "Изтриване на информацията",
"Could not create paste: %s": "Създаването на връзката ви беше неуспешно: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Дешифроването на информацията беше неуспешно: Ключа за декриптиране липсва във връзката (Да не сте използвали услуга за пренасочване или скъсяване на връзката, което би изрязало части от нея?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Plain Text": "Чист текст",
"Source Code": "Изходен код",
"Markdown": "Markdown",
"Download attachment": "Свали прикачения файл",
"Cloned: '%s'": "Дублирано: '%s'",
"The cloned file '%s' was attached to this paste.": "Дублирания файл '%s' беше прикачен.",
"Attach a file": "Прикачи файл",
"alternatively drag & drop a file or paste an image from the clipboard": "Също можеш да пуснеш файла върху този прозорец или да поставиш изображение от клипборда",
"File too large, to display a preview. Please download the attachment.": "Файла е твърде голям, за да се представи визуализация. Моля, свалете файла.",
"Remove attachment": "Премахнете файла",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Браузърът ви не поддържа прикачване на шифровани файлове. Моля, използвайте по-нов браузър",
"Invalid attachment.": "Невалидно прикачване.",
"Options": "Настройки",
"Shorten URL": "Скъси връзката",
"Editor": "Редактор",
"Preview": "Визуализация",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "PATH трябва да е във края на \"%s\" за да може %s да работи правилно. Моля обновете PATH във вашият index.php .",
"Decrypt": "Дешифровай",
"Enter password": "Въведи паролата",
"Loading…": "Зареждане…",
"Decrypting paste…": "Дешифроване на информацията…",
"Preparing new paste…": "Приготвяне на връзката Ви…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Във случай, че това съобщение не изчезне след време, моля прегледайте <a href=\"%s\">този FAQ (Английски)</a>, за информация, която би ви помогнала.",
"+++ no paste text +++": "+++ няма текстово съдържание +++",
"Could not get paste data: %s": "Взимането на информацията беше неуспешно: %s",
"QR code": "QR код",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Този сайт използва несигурна HTTP връзка. Моля използвайте само за проби.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "<a href=\"%s\">Вижте тази страница</a> за повече информация.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Браузъра ви може да се нуждае от HTTPS връзка за да използва WebCrypto API. Пробвай <a href=\"%s\">да минеш на HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.",
"Retry": "Retry",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
}

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s je minimalistický open source 'pastebin' server, který neanalyzuje vložená data. Data jsou šifrována <i>v prohlížeči</i> pomocí 256 bitů AES. Více informací na <a href=\"https://privatebin.info/\">stránce projetu</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Protože nevědomost je sladká", "%s je minimalistický open source 'pastebin' server, který neanalyzuje vložená data. Data jsou šifrována <i>v prohlížeči</i> pomocí 256 bitů AES. Více informací na <a href=\"https://privatebin.info/\">stránce projetu</a>.",
"Because ignorance is bliss":
"Protože nevědomost je sladká",
"en": "cs", "en": "cs",
"Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, expiroval nebo byl odstraněn.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s nebo vyšší. Lituji.", "Vložený text neexistuje, expiroval nebo byl odstraněn.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Počet sekund do dalšího příspěvku: %d.", "%s vyžaduje php %s nebo vyšší. Lituji.",
"Paste is limited to %s of encrypted data.": "Příspěvek je limitován na %s šífrovaných dat", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Chybná data.", "%s requires configuration section [%s] to be present in configuration file.",
"You are unlucky. Try again.": "Lituji, zkuste to znovu.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Chyba při ukládání komentáře.", "Počet sekund do dalšího příspěvku: %d.",
"Error saving paste. Sorry.": "Chyba při ukládání příspěvku.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Chybně vložené ID.", "Příspěvek je limitován na %s šífrovaných dat",
"Paste is not of burn-after-reading type.": "Paste is not of burn-after-reading type.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Wrong deletion token. Paste was not deleted.", "Chybná data.",
"Paste was properly deleted.": "Paste was properly deleted.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript is required for %s to work. Sorry for the inconvenience.", "Lituji, zkuste to znovu.",
"%s requires a modern browser to work.": "%%s requires a modern browser to work.", "Error saving comment. Sorry.":
"New": "Nový", "Chyba při ukládání komentáře.",
"Send": "Odeslat", "Error saving paste. Sorry.":
"Clone": "Klonovat", "Chyba při ukládání příspěvku.",
"Raw text": "Pouze Text", "Invalid paste ID.":
"Expires": "Expirace", "Chybně vložené ID.",
"Burn after reading": "Po přečtení smazat", "Paste is not of burn-after-reading type.":
"Open discussion": "Povolit komentáře", "Paste is not of burn-after-reading type.",
"Password (recommended)": "Heslo (doporučeno)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Komentáře", "Wrong deletion token. Paste was not deleted.",
"Toggle navigation": "Toggle navigation", "Paste was properly deleted.":
"%d seconds": [ "Paste was properly deleted.",
"%d sekuda", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d sekundy", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.",
"%d sekund", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%%s requires a modern browser to work.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:",
"%d minuta", "New":
"%d minuty", "Nový",
"%d minut", "Send":
"%d minutes (3rd plural)" "Odeslat",
], "Clone":
"%d hours": [ "Klonovat",
"%d hodin", "Raw text":
"%d hodiny", "Pouze Text",
"%d hodin", "Expires":
"%d hours (3rd plural)" "Expirace",
], "Burn after reading":
"%d days": [ "Po přečtení smazat",
"%d den", "Open discussion":
"%d dny", "Povolit komentáře",
"%d dní", "Password (recommended)":
"%d days (3rd plural)" "Heslo (doporučeno)",
], "Discussion":
"%d weeks": [ "Komentáře",
"%d týden", "Toggle navigation":
"%d týdeny", "Toggle navigation",
"%d týdnů", "%d seconds": ["%d sekuda", "%d sekundy", "%d sekund"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuta", "%d minuty", "%d minut"],
], "%d hours": ["%d hodin", "%d hodiny", "%d hodin"],
"%d months": [ "%d days": ["%d den", "%d dny", "%d dní"],
"%d měsíc", "%d weeks": ["%d týden", "%d týdeny", "%d týdnů"],
"%d měsíce", "%d months": ["%d měsíc", "%d měsíce", "%d měsíců"],
"%d měsíců", "%d years": ["%d rok", "%d roky", "%d roků"],
"%d months (3rd plural)" "Never":
], "Nikdy",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d rok", "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.",
"%d roky", "This document will expire in %d seconds.":
"%d roků", ["Tento dokument expiruje za %d sekundu.", "Tento dokument expiruje za %d sekundy.", "Tento dokument expiruje za %d sekund."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Tento dokument expiruje za %d minutu.", "Tento dokument expiruje za %d minuty.", "Tento dokument expiruje za %d minut."],
"Never": "Nikdy", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.", ["Tento dokument expiruje za %d hodinu.", "Tento dokument expiruje za %d hodiny.", "Tento dokument expiruje za %d hodin."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Tento dokument expiruje za %d sekundu.", ["Tento dokument expiruje za %d den.", "Tento dokument expiruje za %d dny.", "Tento dokument expiruje za %d dny."],
"Tento dokument expiruje za %d sekundy.", "This document will expire in %d months.":
"Tento dokument expiruje za %d sekund.", ["Tento dokument expiruje za %d měsíc.", "Tento dokument expiruje za %d měsíce.", "Tento dokument expiruje za %d měsíců."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Zadejte prosím heslo:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Tento dokument expiruje za %d minutu.", "Could not decrypt data (Wrong key?)",
"Tento dokument expiruje za %d minuty.", "Could not delete the paste, it was not stored in burn after reading mode.":
"Tento dokument expiruje za %d minut.", "Could not delete the paste, it was not stored in burn after reading mode.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Tento dokument expiruje za %d hodinu.", "Could not decrypt comment; Wrong key?",
"Tento dokument expiruje za %d hodiny.", "Reply":
"Tento dokument expiruje za %d hodin.", "Reply",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonym",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Tento dokument expiruje za %d den.", "Avatar generated from IP address",
"Tento dokument expiruje za %d dny.", "Add comment":
"Tento dokument expiruje za %d dny.", "Přidat komentář",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Volitelný nickname…",
"This document will expire in %d months.": [ "Post comment":
"Tento dokument expiruje za %d měsíc.", "Odeslat komentář",
"Tento dokument expiruje za %d měsíce.", "Sending comment…":
"Tento dokument expiruje za %d měsíců.", "Odesílání komentáře…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Komentář odeslán.",
"Please enter the password for this paste:": "Zadejte prosím heslo:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Could not decrypt data (Wrong key?)", "Could not refresh display: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Could not delete the paste, it was not stored in burn after reading mode.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.", "neznámý stav",
"Could not decrypt comment; Wrong key?": "Could not decrypt comment; Wrong key?", "server error or not responding":
"Reply": "Reply", "Chyba na serveru nebo server neodpovídá",
"Anonymous": "Anonym", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar generated from IP address", "Nelze odeslat komentář: %s",
"Add comment": "Přidat komentář", "Sending paste…":
"Optional nickname…": "Volitelný nickname…", "Odesílání příspěvku…",
"Post comment": "Odeslat komentář", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Odesílání komentáře…", "Váš link je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte [Ctrl]+[c] pro zkopírování)</span>",
"Comment posted.": "Komentář odeslán.", "Delete data":
"Could not refresh display: %s": "Could not refresh display: %s", "Odstranit data",
"unknown status": "neznámý stav", "Could not create paste: %s":
"server error or not responding": "Chyba na serveru nebo server neodpovídá", "Nelze vytvořit příspěvek: %s",
"Could not post comment: %s": "Nelze odeslat komentář: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Odesílání příspěvku…", "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Možnou příčinou může být URL shortener?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Váš link je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte [Ctrl]+[c] pro zkopírování)</span>",
"Delete data": "Odstranit data",
"Could not create paste: %s": "Nelze vytvořit příspěvek: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Možnou příčinou může být URL shortener?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formát", "Format": "Formát",
"Plain Text": "Prostý Text", "Plain Text": "Prostý Text",
"Source Code": "Zdrojový kód", "Source Code": "Zdrojový kód",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "Soubor je příliš velký pro zobrazení náhledu. Stáhněte si přílohu.", "File too large, to display a preview. Please download the attachment.": "Soubor je příliš velký pro zobrazení náhledu. Stáhněte si přílohu.",
"Remove attachment": "Odstranit přílohu", "Remove attachment": "Odstranit přílohu",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prohlížeč nepodporuje nahrávání šifrovaných souborů. Použijte modernější verzi prohlížeče.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Váš prohlížeč nepodporuje nahrávání šifrovaných souborů. Použijte modernější verzi prohlížeče.",
"Invalid attachment.": "Chybná příloha.", "Invalid attachment.": "Chybná příloha.",
"Options": "Volby", "Options": "Volby",
"Shorten URL": "Shorten URL", "Shorten URL": "Shorten URL",
"Editor": "Editor", "Editor": "Editor",
"Preview": "Náhled", "Preview": "Náhled",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Decrypt", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"Enter password": "Zadejte heslo", "Decrypt":
"Decrypt",
"Enter password":
"Zadejte heslo",
"Loading…": "Loading…", "Loading…": "Loading…",
"Decrypting paste…": "Decrypting paste…", "Decrypting paste…": "Decrypting paste…",
"Preparing new paste…": "Preparing new paste…", "Preparing new paste…": "Preparing new paste…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.",
"+++ no paste text +++": "+++ žádný vložený text +++", "+++ no paste text +++": "+++ žádný vložený text +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s ist ein minimalistischer, quelloffener \"Pastebin\"-artiger Dienst, bei dem der Server keinerlei Kenntnis der Inhalte hat. Die Daten werden <i>im Browser</i> mit 256 Bit AES ver- und entschlüsselt. Weitere Informationen sind auf der <a href=\"https://privatebin.info/\">Projektseite</a> zu finden.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Unwissenheit ist ein Segen", "%s ist ein minimalistischer, quelloffener \"Pastebin\"-artiger Dienst, bei dem der Server keinerlei Kenntnis der Inhalte hat. Die Daten werden <i>im Browser</i> mit 256 Bit AES ver- und entschlüsselt. Weitere Informationen sind auf der <a href=\"https://privatebin.info/\">Projektseite</a> zu finden.",
"Because ignorance is bliss":
"Unwissenheit ist ein Segen",
"en": "de", "en": "de",
"Paste does not exist, has expired or has been deleted.": "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.", "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.",
"%s requires configuration section [%s] to be present in configuration file.": "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Bitte warte %d Sekunden zwischen dem Absenden.", "%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.",
"Paste is limited to %s of encrypted data.": "Texte sind auf %s verschlüsselte Datenmenge beschränkt.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Ungültige Daten.", "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.",
"You are unlucky. Try again.": "Du hast Pech. Versuchs nochmal.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Fehler beim Speichern des Kommentars. Sorry.", "Bitte warte %d Sekunden zwischen dem Absenden.",
"Error saving paste. Sorry.": "Fehler beim Speichern des Textes. Sorry.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Ungültige Text-ID.", "Texte sind auf %s verschlüsselte Datenmenge beschränkt.",
"Paste is not of burn-after-reading type.": "Text ist kein \"Einmal\"-Typ.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Falscher Lösch-Code. Text wurde nicht gelöscht.", "Ungültige Daten.",
"Paste was properly deleted.": "Text wurde erfolgreich gelöscht.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript ist eine Voraussetzung, um %s zu nutzen. Bitte entschuldige die Unannehmlichkeiten.", "Du hast Pech. Versuchs nochmal.",
"%s requires a modern browser to work.": "%s setzt einen modernen Browser voraus, um funktionieren zu können.", "Error saving comment. Sorry.":
"New": "Neu", "Fehler beim Speichern des Kommentars. Sorry.",
"Send": "Senden", "Error saving paste. Sorry.":
"Clone": "Klonen", "Fehler beim Speichern des Textes. Sorry.",
"Raw text": "Reiner Text", "Invalid paste ID.":
"Expires": "Ablaufzeit", "Ungültige Text-ID.",
"Burn after reading": "Nach dem Lesen löschen", "Paste is not of burn-after-reading type.":
"Open discussion": "Kommentare aktivieren", "Text ist kein \"Einmal\"-Typ.",
"Password (recommended)": "Passwort (empfohlen)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Kommentare", "Falscher Lösch-Code. Text wurde nicht gelöscht.",
"Toggle navigation": "Navigation umschalten", "Paste was properly deleted.":
"%d seconds": [ "Text wurde erfolgreich gelöscht.",
"%d Sekunde", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d Sekunden", "JavaScript ist eine Voraussetzung, um %s zu nutzen.<br />Bitte entschuldige die Unannehmlichkeiten.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s setzt einen modernen Browser voraus, um funktionieren zu können.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Du benutzt immer noch den Internet Explorer? Tu Dir einen Gefallen und wechsle zu einem moderneren Browser:",
"%d Minute", "New":
"%d Minuten", "Neu",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Senden",
], "Clone":
"%d hours": [ "Klonen",
"%d Stunde", "Raw text":
"%d Stunden", "Reiner Text",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Ablaufzeit",
], "Burn after reading":
"%d days": [ "Nach dem Lesen löschen",
"%d Tag", "Open discussion":
"%d Tage", "Kommentare aktivieren",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Passwort (empfohlen)",
], "Discussion":
"%d weeks": [ "Kommentare",
"%d Woche", "Toggle navigation":
"%d Wochen", "Navigation umschalten",
"%d weeks (2nd plural)", "%d seconds": ["%d Sekunde", "%d Sekunden"],
"%d weeks (3rd plural)" "%d minutes": ["%d Minute", "%d Minuten"],
], "%d hours": ["%d Stunde", "%d Stunden"],
"%d months": [ "%d days": ["%d Tag", "%d Tage"],
"%d Monat", "%d weeks": ["%d Woche", "%d Wochen"],
"%d Monate", "%d months": ["%d Monat", "%d Monate"],
"%d months (2nd plural)", "%d years": ["%d Jahr", "%d Jahre"],
"%d months (3rd plural)" "Never":
], "Nie",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d Jahr", "Hinweis: Dies ist ein Versuchsdienst. Daten können jederzeit gelöscht werden. Kätzchen werden sterben wenn du diesen Dienst missbrauchst.",
"%d Jahre", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Dieses Dokument läuft in einer Sekunde ab.", "Dieses Dokument läuft in %d Sekunden ab."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Dieses Dokument läuft in einer Minute ab.", "Dieses Dokument läuft in %d Minuten ab."],
"Never": "Nie", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Hinweis: Dies ist ein Versuchsdienst. Daten können jederzeit gelöscht werden. Kätzchen werden sterben, wenn du diesen Dienst missbrauchst.", ["Dieses Dokument läuft in einer Stunde ab.", "Dieses Dokument läuft in %d Stunden ab."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Dieses Dokument läuft in einer Sekunde ab.", ["Dieses Dokument läuft in einem Tag ab.", "Dieses Dokument läuft in %d Tagen ab."],
"Dieses Dokument läuft in %d Sekunden ab.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Dieses Dokument läuft in einem Monat ab.", "Dieses Dokument läuft in %d Monaten ab."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Bitte gib das Passwort für diesen Text ein:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Dieses Dokument läuft in einer Minute ab.", "Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)",
"Dieses Dokument läuft in %d Minuten ab.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Konnte das Paste nicht löschen, es wurde nicht im Einmal-Modus gespeichert.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "DIESER TEXT IST NUR FÜR DICH GEDACHT. Schließe das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Dieses Dokument läuft in einer Stunde ab.", "Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?",
"Dieses Dokument läuft in %d Stunden ab.", "Reply":
"This document will expire in %d hours (2nd plural)", "Antworten",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonym",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Dieses Dokument läuft in einem Tag ab.", "Avatar (generiert aus der IP-Adresse)",
"Dieses Dokument läuft in %d Tagen ab.", "Add comment":
"This document will expire in %d days (2nd plural)", "Kommentar hinzufügen",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Optionales Pseudonym…",
"This document will expire in %d months.": [ "Post comment":
"Dieses Dokument läuft in einem Monat ab.", "Kommentar absenden",
"Dieses Dokument läuft in %d Monaten ab.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Sende Kommentar…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Kommentar gesendet.",
"Please enter the password for this paste:": "Bitte gib das Passwort für diesen Text ein:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)", "Ansicht konnte nicht aktualisiert werden: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Konnte das Paste nicht löschen, es wurde nicht im Einmal-Modus gespeichert.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "DIESER TEXT IST NUR FÜR DICH GEDACHT. Schließe das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.", "Unbekannter Grund",
"Could not decrypt comment; Wrong key?": "Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?", "server error or not responding":
"Reply": "Antworten", "Fehler auf dem Server oder keine Antwort vom Server",
"Anonymous": "Anonym", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar (generiert aus der IP-Adresse)", "Konnte Kommentar nicht senden: %s",
"Add comment": "Kommentar hinzufügen", "Sending paste…":
"Optional nickname…": "Optionales Pseudonym…", "Sende Paste…",
"Post comment": "Kommentar absenden", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Sende Kommentar…", "Dein Text ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke [Strg]+[c] um den Link zu kopieren)</span>",
"Comment posted.": "Kommentar gesendet.", "Delete data":
"Could not refresh display: %s": "Ansicht konnte nicht aktualisiert werden: %s", "Lösche Daten",
"unknown status": "Unbekannter Grund", "Could not create paste: %s":
"server error or not responding": "Fehler auf dem Server oder keine Antwort vom Server", "Text konnte nicht erstellt werden: %s",
"Could not post comment: %s": "Konnte Kommentar nicht senden: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Sende Paste…", "Konnte Paste nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Dein Text ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke [Strg]+[c] um den Link zu kopieren)</span>",
"Delete data": "Lösche Daten",
"Could not create paste: %s": "Text konnte nicht erstellt werden: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Konnte Paste nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format", "Format": "Format",
"Plain Text": "Nur Text", "Plain Text": "Nur Text",
"Source Code": "Quellcode", "Source Code": "Quellcode",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "Alternativ Drag & Drop einer Datei oder einfügen eines Bildes aus der Zwischenablage", "alternatively drag & drop a file or paste an image from the clipboard": "Alternativ Drag & Drop einer Datei oder einfügen eines Bildes aus der Zwischenablage",
"File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.", "File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.",
"Remove attachment": "Anhang entfernen", "Remove attachment": "Anhang entfernen",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.",
"Invalid attachment.": "Ungültiger Datei-Anhang.", "Invalid attachment.": "Ungültiger Datei-Anhang.",
"Options": "Optionen", "Options": "Optionen",
"Shorten URL": "URL verkürzen", "Shorten URL": "URL verkürzen",
"Editor": "Bearbeiten", "Editor": "Bearbeiten",
"Preview": "Vorschau", "Preview": "Vorschau",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "Der PATH muss bei %s mit einem \"%s\" enden. Bitte passe Deinen PATH in Deiner index.php an.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Entschlüsseln", "Der PATH muss bei %s mit einem \"%s\" enden. Bitte passe Deinen PATH in Deiner index.php an.",
"Enter password": "Passwort eingeben", "Decrypt":
"Entschlüsseln",
"Enter password":
"Passwort eingeben",
"Loading…": "Lädt…", "Loading…": "Lädt…",
"Decrypting paste…": "Entschlüssle Text…", "Decrypting paste…": "Entschlüssle Text…",
"Preparing new paste…": "Bereite neuen Text vor…", "Preparing new paste…": "Bereite neuen Text vor…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Wenn diese Nachricht nicht mehr verschwindet, schau bitte in <a href=\"%s\">die FAQ</a> (englisch), um zu sehen, wie der Fehler behoben werden kann.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Wenn diese Nachricht nicht mehr verschwindet, schau bitte in <a href=\"%s\">die FAQ</a> (englisch), um zu sehen, wie der Fehler behoben werden kann.",
"+++ no paste text +++": "+++ kein Paste-Text +++", "+++ no paste text +++": "+++ kein Paste-Text +++",
"Could not get paste data: %s": "Text konnte nicht geladen werden: %s", "Could not get paste data: %s":
"Text konnte nicht geladen werden: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Diese Webseite verwendet eine unsichere HTTP Verbindung! Bitte benutze sie nur zum Testen.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "<a href=\"%s\">Besuche diesen FAQ Eintrag</a> für weitere Informationen dazu.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Dein Browser benötigt möglicherweise eine HTTPS Verbindung um das WebCrypto API nutzen zu können. Versuche <a href=\"%s\">auf HTTPS zu wechseln</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Dein Browser unterstützt WebAssembly nicht, welches für zlib Komprimierung benötigt wird. Du kannst unkomprimierte Dokumente erzeugen, aber keine komprimierten lesen.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "warte auf Passworteingabe durch Benutzer", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Konnte Daten nicht entschlüsseln. Hast Du das falsche Passwort eingegeben? Wiederhole den Vorgang mit dem oben stehenden Knopf.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Wiederholen", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Zeige reinen Text an…",
"Notice:": "Hinweis:",
"This link will expire after %s.": "Dieser Link wird um %s ablaufen.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Dieser Link kann nur einmal geöffnet werden, verwende nicht den Zurück- oder Neu-laden-Knopf Deines Browsers.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Der Empfänger könnte Deine Zeitzone erfahren, möchtest Du die Zeit in UTC umwandeln?",
"Use Current Timezone": "Aktuelle Zeitzone verwenden",
"Convert To UTC": "In UTC Umwandeln",
"Close": "Schliessen",
"Encrypted note on PrivateBin": "Verschlüsselte Notiz auf PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Besuche diesen Link um das Dokument zu sehen. Wird die URL an eine andere Person gegeben, so kann diese Person ebenfalls auf diese Notiz zugreifen."
} }

View File

@@ -1,181 +0,0 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.",
"Because ignorance is bliss": "Because ignorance is bliss",
"en": "en",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.",
"%s requires php %s or above to work. Sorry.": "%s requires php %s or above to work. Sorry.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
"Please wait %d seconds between each post.": "Please wait %d seconds between each post.",
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
"You are unlucky. Try again.": "You are unlucky. Try again.",
"Error saving comment. Sorry.": "Error saving comment. Sorry.",
"Error saving paste. Sorry.": "Error saving paste. Sorry.",
"Invalid paste ID.": "Invalid paste ID.",
"Paste is not of burn-after-reading type.": "Paste is not of burn-after-reading type.",
"Wrong deletion token. Paste was not deleted.": "Wrong deletion token. Paste was not deleted.",
"Paste was properly deleted.": "Paste was properly deleted.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript is required for %s to work. Sorry for the inconvenience.",
"%s requires a modern browser to work.": "%s requires a modern browser to work.",
"New": "New",
"Send": "Send",
"Clone": "Clone",
"Raw text": "Raw text",
"Expires": "Expires",
"Burn after reading": "Burn after reading",
"Open discussion": "Open discussion",
"Password (recommended)": "Password (recommended)",
"Discussion": "Discussion",
"Toggle navigation": "Toggle navigation",
"%d seconds": [
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
],
"Never": "Never",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.",
"This document will expire in %d seconds.": [
"This document will expire in %d second. (singular)",
"This document will expire in %d seconds (1st plural)",
"This document will expire in %d seconds (2nd plural)",
"This document will expire in %d seconds (3rd plural)"
],
"This document will expire in %d minutes.": [
"This document will expire in %d minute. (singular)",
"This document will expire in %d minutes (1st plural)",
"This document will expire in %d minutes (2nd plural)",
"This document will expire in %d minutes (3rd plural)"
],
"This document will expire in %d hours.": [
"This document will expire in %d hour. (singular)",
"This document will expire in %d hours (1st plural)",
"This document will expire in %d hours (2nd plural)",
"This document will expire in %d hours (3rd plural)"
],
"This document will expire in %d days.": [
"This document will expire in %d day. (singular)",
"This document will expire in %d days (1st plural)",
"This document will expire in %d days (2nd plural)",
"This document will expire in %d days (3rd plural)"
],
"This document will expire in %d months.": [
"This document will expire in %d month. (singular)",
"This document will expire in %d months (1st plural)",
"This document will expire in %d months (2nd plural)",
"This document will expire in %d months (3rd plural)"
],
"Please enter the password for this paste:": "Please enter the password for this paste:",
"Could not decrypt data (Wrong key?)": "Could not decrypt data (Wrong key?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Could not delete the paste, it was not stored in burn after reading mode.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.",
"Could not decrypt comment; Wrong key?": "Could not decrypt comment; Wrong key?",
"Reply": "Reply",
"Anonymous": "Anonymous",
"Avatar generated from IP address": "Avatar generated from IP address",
"Add comment": "Add comment",
"Optional nickname…": "Optional nickname…",
"Post comment": "Post comment",
"Sending comment…": "Sending comment…",
"Comment posted.": "Comment posted.",
"Could not refresh display: %s": "Could not refresh display: %s",
"unknown status": "unknown status",
"server error or not responding": "server error or not responding",
"Could not post comment: %s": "Could not post comment: %s",
"Sending paste…": "Sending paste…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>",
"Delete data": "Delete data",
"Could not create paste: %s": "Could not create paste: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Plain Text": "Plain Text",
"Source Code": "Source Code",
"Markdown": "Markdown",
"Download attachment": "Download attachment",
"Cloned: '%s'": "Cloned: '%s'",
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
"Attach a file": "Attach a file",
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Remove attachment",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.",
"Invalid attachment.": "Invalid attachment.",
"Options": "Options",
"Shorten URL": "Shorten URL",
"Editor": "Editor",
"Preview": "Preview",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"Decrypt": "Decrypt",
"Enter password": "Enter password",
"Loading…": "Loading…",
"Decrypting paste…": "Decrypting paste…",
"Preparing new paste…": "Preparing new paste…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.",
"+++ no paste text +++": "+++ no paste text +++",
"Could not get paste data: %s": "Could not get paste data: %s",
"QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.",
"Retry": "Retry",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
}

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s es un \"pastebin\" en línea minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados <i>en el navegador</i> usando 256 bits AES. Más información en la <a href=\"https://privatebin.info/\">página del proyecto</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Porque la ignorancia es dicha", "%s es un \"pastebin\" en línea minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados <i>en el navegador</i> usando 256 bits AES. Más información en la <a href=\"https://privatebin.info/\">página del proyecto</a>.",
"Because ignorance is bliss":
"Porque la ignorancia es dicha",
"en": "es", "en": "es",
"Paste does not exist, has expired or has been deleted.": "El \"paste\" no existe, ha caducado o ha sido eliminado.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s requiere php %s o superior para funcionar. Lo siento.", "El \"paste\" no existe, ha caducado o ha sido eliminado.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Por favor espere %d segundos entre cada publicación.", "%s requiere php %s o superior para funcionar. Lo siento.",
"Paste is limited to %s of encrypted data.": "El \"paste\" está limitado a %s de datos cifrados.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Datos inválidos.", "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.",
"You are unlucky. Try again.": "Tienes mala suerte. Inténtalo de nuevo", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Error al guardar el comentario. Lo siento.", "Por favor espere %d segundos entre cada publicación.",
"Error saving paste. Sorry.": "Error al guardar el \"paste\". Lo siento", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "ID del \"paste\" inválido.", "El \"paste\" está limitado a %s de datos cifrados.",
"Paste is not of burn-after-reading type.": "El \"paste\" no es del tipo \"destruir despues de leer\".", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Token de eliminación erróneo. El \"paste\" no fue eliminado.", "Datos inválidos.",
"Paste was properly deleted.": "El \"paste\" se ha eliminado correctamente.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript es necesario para que %s funcione. Sentimos los inconvenientes ocasionados.", "Tienes mala suerte. Inténtalo de nuevo",
"%s requires a modern browser to work.": "%s requiere un navegador moderno para funcionar.", "Error saving comment. Sorry.":
"New": "Nuevo", "Error al guardar el comentario. Lo siento.",
"Send": "Enviar", "Error saving paste. Sorry.":
"Clone": "Clonar", "Error al guardar el \"paste\". Lo siento",
"Raw text": "Texto sin formato", "Invalid paste ID.":
"Expires": "Caducar en", "ID del \"paste\" inválido.",
"Burn after reading": "Destruir después de leer", "Paste is not of burn-after-reading type.":
"Open discussion": "Discusión abierta", "El \"paste\" no es del tipo \"destruir despues de leer\".",
"Password (recommended)": "Contraseña (recomendado)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discusión", "Token de eliminación erróneo. El \"paste\" no fue eliminado.",
"Toggle navigation": "Cambiar navegación", "Paste was properly deleted.":
"%d seconds": [ "El \"paste\" se ha eliminado correctamente.",
"%d segundo", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d segundos", "JavaScript es necesario para que %s funcione.<br />Sentimos los inconvenientes ocasionados.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s requiere un navegador moderno para funcionar.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "¿Sigues usando Internet Explorer? Hazte un favor, cambia a un navegador moderno:",
"%d minuto", "New":
"%d minutos", "Nuevo",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Enviar",
], "Clone":
"%d hours": [ "Clonar",
"%d hora", "Raw text":
"%d horas", "Texto sin formato",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Caducar en",
], "Burn after reading":
"%d days": [ "Destruir después de leer",
"%d día", "Open discussion":
"%d días", "Discusión abierta",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Contraseña (recomendado)",
], "Discussion":
"%d weeks": [ "Discusión",
"%d semana", "Toggle navigation":
"%d semanas", "Cambiar navegación",
"%d weeks (2nd plural)", "%d seconds": ["%d segundo", "%d segundos"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuto", "%d minutos"],
], "%d hours": ["%d hora", "%d horas"],
"%d months": [ "%d days": ["%d día", "%d días"],
"%d mes", "%d weeks": ["%d semana", "%d semanas"],
"%d meses", "%d months": ["%d mes", "%d meses"],
"%d months (2nd plural)", "%d years": ["%d año", "%d años"],
"%d months (3rd plural)" "Never":
], "Nunca",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d año", "Nota: Este es un servicio de prueba. Los datos pueden ser eliminados en cualquier momento. Morirán gatitos si abusas de este servicio.",
"%d años", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Este documento caducará en un segundo.", "Este documento caducará en %d segundos."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Este documento caducará en un minuto.", "Este documento caducará en %d minutos."],
"Never": "Nunca", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota: Este es un servicio de prueba. Los datos pueden ser eliminados en cualquier momento. Morirán gatitos si abusas de este servicio.", ["Este documento caducará en una hora.", "Este documento caducará en %d horas."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Este documento caducará en un segundo.", ["Este documento caducará en un día.", "Este documento caducará en %d días."],
"Este documento caducará en %d segundos.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Este documento caducará en un mes.", "Este documento caducará en %d meses."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Por favor ingrese la contraseña para este \"paste\":",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Este documento caducará en un minuto.", "No fue posible descifrar los datos (¿Clave errónea?)",
"Este documento caducará en %d minutos.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "No fue posible eliminar el documento, no fue guardado en modo \"destruir despues de leer\".",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "SÓLO PARA TUS OJOS. No cierres esta ventana, este mensaje no se puede volver a mostrar.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Este documento caducará en una hora.", "No se pudo descifrar el comentario; ¿Llave incorrecta?",
"Este documento caducará en %d horas.", "Reply":
"This document will expire in %d hours (2nd plural)", "Responder",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anónimo",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Este documento caducará en un día.", "Avatar generado a partir de la dirección IP",
"Este documento caducará en %d días.", "Add comment":
"This document will expire in %d days (2nd plural)", "Añadir comentario",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Seudónimo opcional…",
"This document will expire in %d months.": [ "Post comment":
"Este documento caducará en un mes.", "Publicar comentario",
"Este documento caducará en %d meses.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Enviando comentario…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Comentario publicado.",
"Please enter the password for this paste:": "Por favor ingrese la contraseña para este \"paste\":", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "No fue posible descifrar los datos (¿Clave errónea?)", "No se pudo actualizar la vista: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "No fue posible eliminar el documento, no fue guardado en modo \"destruir despues de leer\".", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "SÓLO PARA TUS OJOS. No cierres esta ventana, este mensaje no se puede volver a mostrar.", "Estado desconocido",
"Could not decrypt comment; Wrong key?": "No se pudo descifrar el comentario; ¿Llave incorrecta?", "server error or not responding":
"Reply": "Responder", "Error del servidor o el servidor no responde",
"Anonymous": "Anónimo", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar generado a partir de la dirección IP", "No fue posible publicar comentario: %s",
"Add comment": "Añadir comentario", "Sending paste…":
"Optional nickname…": "Seudónimo opcional…", "Enviando \"paste\"…",
"Post comment": "Publicar comentario", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Enviando comentario…", "Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione [Ctrl]+[c] para copiar)</span>",
"Comment posted.": "Comentario publicado.", "Delete data":
"Could not refresh display: %s": "No se pudo actualizar la vista: %s", "Eliminar datos",
"unknown status": "Estado desconocido", "Could not create paste: %s":
"server error or not responding": "Error del servidor o el servidor no responde", "No fue posible crear el archivo: %s",
"Could not post comment: %s": "No fue posible publicar comentario: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Enviando \"paste\"…", "No es posible descifrar el documento: Falta la clave de descifrado en la URL (¿Utilizó un redirector o un acortador de URL que quite parte de la URL?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione [Ctrl]+[c] para copiar)</span>",
"Delete data": "Eliminar datos",
"Could not create paste: %s": "No fue posible crear el archivo: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "No es posible descifrar el documento: Falta la clave de descifrado en la URL (¿Utilizó un redirector o un acortador de URL que quite parte de la URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formato", "Format": "Formato",
"Plain Text": "Texto sin formato", "Plain Text": "Texto sin formato",
"Source Code": "Código fuente", "Source Code": "Código fuente",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Remover adjunto", "Remove attachment": "Remover adjunto",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.",
"Invalid attachment.": "Adjunto inválido.", "Invalid attachment.": "Adjunto inválido.",
"Options": "Opciones", "Options": "Opciones",
"Shorten URL": "Acortar URL", "Shorten URL": "Acortar URL",
"Editor": "Editor", "Editor": "Editor",
"Preview": "Previsualización", "Preview": "Previsualización",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requiere que el PATH termine en \"%s\". Por favor, actualice el PATH en su index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Descifrar", "%s requiere que el PATH termine en \"%s\". Por favor, actualice el PATH en su index.php.",
"Enter password": "Ingrese contraseña", "Decrypt":
"Descifrar",
"Enter password":
"Ingrese contraseña",
"Loading…": "Cargando…", "Loading…": "Cargando…",
"Decrypting paste…": "Descifrando \"paste\"…", "Decrypting paste…": "Descifrando \"paste\"…",
"Preparing new paste…": "Preparando \"paste\" nuevo…", "Preparing new paste…": "Preparando \"paste\" nuevo…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "En caso de que este mensaje nunca desaparezca por favor revise <a href=\"%s\">este FAQ para obtener información para solucionar problemas</a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"En caso de que este mensaje nunca desaparezca por favor revise <a href=\"%s\">este FAQ para obtener información para solucionar problemas</a>.",
"+++ no paste text +++": "+++ \"paste\" sin texto +++", "+++ no paste text +++": "+++ \"paste\" sin texto +++",
"Could not get paste data: %s": "No se pudieron obtener los datos: %s", "Could not get paste data: %s":
"No se pudieron obtener los datos: %s",
"QR code": "Código QR", "QR code": "Código QR",
"This website is using an insecure HTTP connection! Please use it only for testing.": "¡Este sitio está usando una conexión HTTP insegura! Por favor úselo solo para pruebas.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Para más información <a href=\"%s\">consulte esta entrada de las preguntas frecuentes</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Su navegador puede requerir una conexión HTTPS para soportar la API de WebCrypto. Intente <a href=\"%s\">cambiar a HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Su navegador no es compatible con WebAssembly, que se utiliza para la compresión zlib. Puede crear documentos sin comprimir, pero no puede leer los comprimidos.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "esperando que el usuario proporcione una contraseña", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "No se pudieron descifrar los datos. ¿Ingresó una contraseña incorrecta? Vuelva a intentarlo con el botón de la parte superior.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Reintentar", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Mostrando texto sin formato…",
"Notice:": "Aviso:",
"This link will expire after %s.": "Este enlace expirará después de %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Solo se puede acceder a este enlace una vez, no use el botón Atrás o Actualizar en su navegador.",
"Link:": "Enlace:",
"Recipient may become aware of your timezone, convert time to UTC?": "El destinatario puede descubrir su zona horaria, ¿convertir la hora a UTC?",
"Use Current Timezone": "Usar Zona Horaria Actual",
"Convert To UTC": "Convertir A UTC",
"Close": "Cerrar",
"Encrypted note on PrivateBin": "Nota cifrada en PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visite este enlace para ver la nota. Dar la URL a cualquier persona también les permite acceder a la nota."
} }

View File

@@ -1,129 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées <i>dans le navigateur</i> par un chiffrement AES 256 bits. Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Parce que l'ignorance c'est le bonheur", "%s est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées <i>dans le navigateur</i> par un chiffrement AES 256 bits. Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.",
"Because ignorance is bliss":
"Parce que l'ignorance c'est le bonheur",
"en": "fr", "en": "fr",
"Paste does not exist, has expired or has been deleted.": "Le paste n'existe pas, a expiré, ou a été supprimé.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "Désolé, %s nécessite php %s ou supérieur pour fonctionner.", "Le paste n'existe pas, a expiré, ou a été supprimé.",
"%s requires configuration section [%s] to be present in configuration file.": "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Merci d'attendre %d secondes entre chaque publication.", "Désolé, %s nécessite php %s ou supérieur pour fonctionner.",
"Paste is limited to %s of encrypted data.": "Le paste est limité à %s de données chiffrées.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Données invalides.", "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.",
"You are unlucky. Try again.": "Pas de chance. Essayez encore.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Erreur lors de la sauvegarde du commentaire.", "Merci d'attendre %d secondes entre chaque publication.",
"Error saving paste. Sorry.": "Erreur lors de la sauvegarde du paste. Désolé.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "ID du paste invalide.", "Le paste est limité à %s de données chiffrées.",
"Paste is not of burn-after-reading type.": "Le paste n'est pas de type \"Effacer après lecture\".", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Jeton de suppression incorrect. Le paste n'a pas été supprimé.", "Données invalides.",
"Paste was properly deleted.": "Le paste a été correctement supprimé.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript est requis pour faire fonctionner %s. Désolé pour cet inconvénient.", "Pas de chance. Essayez encore.",
"%s requires a modern browser to work.": "%s nécessite un navigateur moderne pour fonctionner.", "Error saving comment. Sorry.":
"New": "Nouveau", "Erreur lors de la sauvegarde du commentaire.",
"Send": "Envoyer", "Error saving paste. Sorry.":
"Clone": "Cloner", "Erreur lors de la sauvegarde du paste. Désolé.",
"Raw text": "Texte brut", "Invalid paste ID.":
"Expires": "Expire", "ID du paste invalide.",
"Burn after reading": "Effacer après lecture", "Paste is not of burn-after-reading type.":
"Open discussion": "Autoriser la discussion", "Le paste n'est pas de type \"Effacer après lecture\".",
"Password (recommended)": "Mot de passe (recommandé)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discussion", "Jeton de suppression incorrect. Le paste n'a pas été supprimé.",
"Toggle navigation": "Basculer la navigation", "Paste was properly deleted.":
"%d seconds": [ "Le paste a été correctement supprimé.",
"%d seconde", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d secondes", "JavaScript est requis pour faire fonctionner %s. <br />Désolé pour cet inconvénient.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s nécessite un navigateur moderne pour fonctionner.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Encore sur Internet Explorer ? Faites-vous une faveur, passez à un navigateur moderne :",
"%d minute", "New":
"%d minutes", "Nouveau",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Envoyer",
], "Clone":
"%d hours": [ "Cloner",
"%d heure", "Raw text":
"%d heures", "Texte brut",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Expire",
], "Burn after reading":
"%d days": [ "Effacer après lecture",
"%d jour", "Open discussion":
"%d jours", "Autoriser la discussion",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Mot de passe (recommandé)",
], "Discussion":
"%d weeks": [ "Discussion",
"%d semaine", "Toggle navigation":
"%d semaines", "Basculer la navigation",
"%d weeks (2nd plural)", "%d seconds": ["%d seconde", "%d secondes"],
"%d weeks (3rd plural)" "%d minutes": ["%d minute", "%d minutes"],
], "%d hours": ["%d heure", "%d heures"],
"%d months": [ "%d days": ["%d jour", "%d jours"],
"%d mois", "%d weeks": ["%d semaine", "%d semaines"],
"%d mois", "%d months": ["%d mois", "%d mois"],
"%d months (2nd plural)", "%d years": ["%d an", "%d ans"],
"%d months (3rd plural)" "Never":
], "Jamais",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d an", "Note : Ceci est un service de test : les données peuvent être supprimées à tout moment. Des chatons mourront si vous utilisez ce service de manière abusive.",
"%d ans", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Ce document expirera dans %d seconde.", "Ce document expirera dans %d secondes."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Ce document expirera dans %d minute.", "Ce document expirera dans %d minutes."],
"Never": "Jamais", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note : Ceci est un service de test : les données peuvent être supprimées à tout moment. Des chatons mourront si vous utilisez ce service de manière abusive.", ["Ce document expirera dans %d heure.", "Ce document expirera dans %d heures."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Ce document expirera dans %d seconde.", ["Ce document expirera dans %d jour.", "Ce document expirera dans %d jours."],
"Ce document expirera dans %d secondes.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Ce document expirera dans %d mois.", "Ce document expirera dans %d mois."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Entrez le mot de passe pour ce paste:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Ce document expirera dans %d minute.", "Impossible de déchiffrer les données (mauvaise clé ?)",
"Ce document expirera dans %d minutes.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Impossible de supprimer le paste, car il n'a pas été stocké en mode \"Effacer après lecture\".",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Ce document expirera dans %d heure.", "Impossible de déchiffrer le commentaire ; mauvaise clé ?",
"Ce document expirera dans %d heures.", "Reply":
"This document will expire in %d hours (2nd plural)", "Répondre",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonyme",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Ce document expirera dans %d jour.", "Avatar généré à partir de l'adresse IP",
"Ce document expirera dans %d jours.", "Add comment":
"This document will expire in %d days (2nd plural)", "Ajouter un commentaire",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Pseudonyme optionnel…",
"This document will expire in %d months.": [ "Post comment":
"Ce document expirera dans %d mois.", "Poster le commentaire",
"Ce document expirera dans %d mois.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Envoi du commentaire…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Commentaire posté.",
"Please enter the password for this paste:": "Entrez le mot de passe pour ce paste:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Impossible de déchiffrer les données (mauvaise clé ?)", "Impossible de rafraichir l'affichage : %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Impossible de supprimer le paste, car il n'a pas été stocké en mode \"Effacer après lecture\".", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.", "Statut inconnu",
"Could not decrypt comment; Wrong key?": "Impossible de déchiffrer le commentaire; mauvaise clé ?", "server error or not responding":
"Reply": "Répondre", "Le serveur ne répond pas ou a rencontré une erreur",
"Anonymous": "Anonyme", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar généré à partir de l'adresse IP", "Impossible de poster le commentaire : %s",
"Add comment": "Ajouter un commentaire", "Sending paste…":
"Optional nickname…": "Pseudonyme optionnel…", "Envoi du paste…",
"Post comment": "Poster le commentaire", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Envoi du commentaire…", "Votre paste est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur [Ctrl]+[c] pour copier)</span>",
"Comment posted.": "Commentaire posté.", "Delete data":
"Could not refresh display: %s": "Impossible de rafraichir l'affichage : %s", "Supprimer les données du paste",
"unknown status": "Statut inconnu", "Could not create paste: %s":
"server error or not responding": "Le serveur ne répond pas ou a rencontré une erreur", "Impossible de créer le paste : %s",
"Could not post comment: %s": "Impossible de poster le commentaire : %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Envoi du paste…", "Impossible de déchiffrer le paste : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Votre paste est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur [Ctrl]+[c] pour copier)</span>",
"Delete data": "Supprimer les données du paste",
"Could not create paste: %s": "Impossible de créer le paste : %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Impossible de déchiffrer le paste : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)",
"B": "o", "B": "o",
"KiB": "Kio", "KiB": "Kio",
"MiB": "Mio", "MiB": "Mio",
@@ -141,41 +139,36 @@
"Cloned: '%s'": "Cloner '%s'", "Cloned: '%s'": "Cloner '%s'",
"The cloned file '%s' was attached to this paste.": "Le fichier cloné '%s' a été attaché à ce paste.", "The cloned file '%s' was attached to this paste.": "Le fichier cloné '%s' a été attaché à ce paste.",
"Attach a file": "Attacher un fichier ", "Attach a file": "Attacher un fichier ",
"alternatively drag & drop a file or paste an image from the clipboard": "au choix, glisser & déposer un fichier ou coller une image à partir du presse-papiers", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "Fichier trop volumineux, pour afficher un aperçu. Veuillez télécharger la pièce jointe.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Enlever la pièce jointe", "Remove attachment": "Enlever l'attachement",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Invalid attachment.": "Pièce jointe invalide.", "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.",
"Invalid attachment.": "Attachement invalide.",
"Options": "Options", "Options": "Options",
"Shorten URL": "Raccourcir URL", "Shorten URL": "Raccourcir URL",
"Editor": "Éditer", "Editor": "Éditer",
"Preview": "Prévisualiser", "Preview": "Prévisualiser",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requiert que le PATH se termine dans un \"%s\". Veuillez mettre à jour le PATH dans votre index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Déchiffrer", "%s requiert que le PATH se termine dans un \"%s\". Veuillez mettre à jour le PATH dans votre index.php.",
"Enter password": "Entrez le mot de passe", "Decrypt":
"Déchiffrer",
"Enter password":
"Entrez le mot de passe",
"Loading…": "Chargement…", "Loading…": "Chargement…",
"Decrypting paste…": "Déchiffrement du paste…", "Decrypting paste…": "Déchiffrement du paste…",
"Preparing new paste…": "Préparation du paste…", "Preparing new paste…": "Préparation du paste…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Si ce message ne disparaîssait pas, jetez un oeil à <a href=\"%s\">cette FAQ pour des idées de résolution</a> (en Anglais).", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"+++ no paste text +++": "+++ pas de texte copié +++", "Si ce message ne disparaîssait pas, jetez un oeil à <a href=\"%s\">cette FAQ pour des idées de résolution</a> (en Anglais).",
"Could not get paste data: %s": "Impossible d'obtenir les données du paste: %s", "+++ no paste text +++": "+++ pas de paste-text +++",
"Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Ce site web utilise une connexion HTTP non sécurisée ! Veuillez lutiliser uniquement pour des tests.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Pour plus d'informations <a href=\"%s\">consultez cette rubrique de la FAQ</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Votre navigateur peut nécessiter une connexion HTTPS pour prendre en charge lAPI WebCrypto. Essayez <a href=\"%s\">de passer en HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Votre navigateur ne prend pas en charge WebAssembly, utilisé pour la compression zlib. Vous pouvez créer des documents non compressés, mais vous ne pouvez pas lire les documents compressés.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "en attendant que l'utilisateur fournisse un mot de passe", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Impossible de décrypter les données. Vous avez saisi un mot de passe incorrect ? Réessayez avec le bouton en haut.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Réessayer", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Affichage du texte brut…",
"Notice:": "Avertissement:",
"This link will expire after %s.": "Ce lien expire après le %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Vous ne pouvez accéder à ce lien qu'une seule fois, n'utilisez pas le bouton précédent ou rafraîchir de votre navigateur.",
"Link:": "Lien:",
"Recipient may become aware of your timezone, convert time to UTC?": "Le destinataire peut connaître votre fuseau horaire, convertir l'heure au format UTC?",
"Use Current Timezone": "Conserver l'actuel",
"Convert To UTC": "Convertir en UTC",
"Close": "Fermer",
"Encrypted note on PrivateBin": "Message chiffré sur PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visiter ce lien pour voir la note. Donner l'URL à une autre personne lui permet également d'accéder à la note."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a <i>böngésződ</i> segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva. További információt a <a href=\"https://privatebin.info/\">projekt oldalán</a> találsz.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "A titok egyfajta hatalom.", "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a <i>böngésződ</i> segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva. További információt a <a href=\"https://privatebin.info/\">projekt oldalán</a> találsz.",
"Because ignorance is bliss":
"A titok egyfajta hatalom.",
"en": "hu", "en": "hu",
"Paste does not exist, has expired or has been deleted.": "A bejegyzés nem létezik, lejárt vagy törölve lett.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.", "A bejegyzés nem létezik, lejárt vagy törölve lett.",
"%s requires configuration section [%s] to be present in configuration file.": "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Kérlek várj %d másodpercet két beküldés között.", "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.",
"Paste is limited to %s of encrypted data.": "A bejegyzés maximális hossza: %s", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Érvénytelen adat.", "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.",
"You are unlucky. Try again.": "Peched volt, próbáld újra.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Nem sikerült menteni a hozzászólást. Bocs.", "Kérlek várj %d másodpercet két beküldés között.",
"Error saving paste. Sorry.": "Nem sikerült menteni a bejegyzést. Bocs.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Érvénytelen bejegyzés azonosító.", "A bejegyzés maximális hossza: %s",
"Paste is not of burn-after-reading type.": "A bejegyzés nem semmisül meg azonnal olvasás után.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Hibás törlési azonosító. A bejegyzés nem lett törölve.", "Érvénytelen adat.",
"Paste was properly deleted.": "A bejegyzés sikeresen törölve.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript szükséges a %s működéséhez. Elnézést a fennakadásért.", "Peched volt, próbáld újra.",
"%s requires a modern browser to work.": "A %s működéséhez a jelenleginél újabb böngészőre van szükség.", "Error saving comment. Sorry.":
"New": "Új", "Nem sikerült menteni a hozzászólást. Bocs.",
"Send": "Beküldöm!", "Error saving paste. Sorry.":
"Clone": "Másol", "Nem sikerült menteni a bejegyzést. Bocs.",
"Raw text": "A nyers szöveg", "Invalid paste ID.":
"Expires": "Lejárati idő", "Érvénytelen bejegyzés azonosító.",
"Burn after reading": "Törlés az első olvasás után", "Paste is not of burn-after-reading type.":
"Open discussion": "Hozzászólások engedélyezése", "A bejegyzés nem semmisül meg azonnal olvasás után.",
"Password (recommended)": "Jelszó (ajánlott)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Hozzászólások", "Hibás törlési azonosító. A bejegyzés nem lett törölve.",
"Toggle navigation": "Navigáció", "Paste was properly deleted.":
"%d seconds": [ "A bejegyzés sikeresen törölve.",
"%d másodperc", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d másodperc", "JavaScript szükséges a %s működéséhez. Elnézést a fennakadásért.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "A %s működéséhez a jelenleginél újabb böngészőre van szükség.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Még mindig Internet Explorert használsz? Ideje váltani:",
"%d perc", "New":
"%d perc", "Új",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Beküldöm!",
], "Clone":
"%d hours": [ "Másol",
"%d óra", "Raw text":
"%d óra", "A nyers szöveg",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Lejárati idő",
], "Burn after reading":
"%d days": [ "Törlés az első olvasás után",
"%d nap", "Open discussion":
"%d nap", "Hozzászólások engedélyezése",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Jelszó (ajánlott)",
], "Discussion":
"%d weeks": [ "Hozzászólások",
"%d hét", "Toggle navigation":
"%d hét", "Navigáció",
"%d weeks (2nd plural)", "%d seconds": ["%d másodperc", "%d másodperc"],
"%d weeks (3rd plural)" "%d minutes": ["%d perc", "%d perc"],
], "%d hours": ["%d óra", "%d óra"],
"%d months": [ "%d days": ["%d nap", "%d nap"],
"%d hónap", "%d weeks": ["%d hét", "%d hét"],
"%d hónap", "%d months": ["%d hónap", "%d hónap"],
"%d months (2nd plural)", "%d years": ["%d év", "%d év"],
"%d months (3rd plural)" "Never":
], "Soha",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d év", "Megjegyzés: ez egy teszt szolgáltatás, az adatok bármikor törlődhetnek. Ha visszaélsz vele, kiscicák bánhatják! :)",
"%d év", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Ez a bejegyzés %d másodperc után megsemmisül.", "Ez a bejegyzés %d másodperc múlva megsemmisül."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Ez a bejegyzés %d perc után megsemmisül.", "Ez a bejegyzés %d perc múlva megsemmisül."],
"Never": "Soha", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Megjegyzés: ez egy teszt szolgáltatás, az adatok bármikor törlődhetnek. Ha visszaélsz vele, kiscicák bánhatják! :)", ["Ez a bejegyzés %d óra után megsemmisül.", "Ez a bejegyzés %d óra múlva megsemmisül."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Ez a bejegyzés %d másodperc után megsemmisül.", ["Ez a bejegyzés %d nap után megsemmisül.", "Ez a bejegyzés %d nap múlva megsemmisül."],
"Ez a bejegyzés %d másodperc múlva megsemmisül.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Ez a bejegyzés %d hónap múlva megsemmisül.", "Ez a bejegyzés %d hónap múlva megsemmisül."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Add meg a szükséges jelszót a bejegyzés megtekintéséhez:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Ez a bejegyzés %d perc un megsemmisül.", "Nem tudtuk dekódolni az adatot. Talán rossz kulcsot adl meg?",
"Ez a bejegyzés %d perc múlva megsemmisül.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Nem tudtuk törölni a bejegyzést, mivel az olvasás után egyből megsemmisült. Így nem is volt tárolva.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "EZT A BEJEGYZÉST CSAK TE LÁTHATOD!!! Ne csukd be ezt az ablakot, mivel nem tudod újra megnézni. Az ugyanis az első olvasás után rögtön megsemmisül.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Ez a bejegyzés %d óra un megsemmisül.", "Nem tudtuk dekódolni a hozzászólást. Talán rossz kulcsot adl meg?",
"Ez a bejegyzés %d óra múlva megsemmisül.", "Reply":
"This document will expire in %d hours (2nd plural)", "Válasz",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonymous",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Ez a bejegyzés %d nap után megsemmisül.", "Avatar (az IP cím alapján generáljuk)",
"Ez a bejegyzés %d nap múlva megsemmisül.", "Add comment":
"This document will expire in %d days (2nd plural)", "Hozzászólok",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Becenév (már ha meg akarod adni)",
"This document will expire in %d months.": [ "Post comment":
"Ez a bejegyzés %d hónap múlva megsemmisül.", "Beküld",
"Ez a bejegyzés %d hónap múlva megsemmisül.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Beküldés alatt...",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "A hozzászólás beküldve.",
"Please enter the password for this paste:": "Add meg a szükséges jelszót a bejegyzés megtekintéséhez:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Nem tudtuk dekódolni az adatot. Talán rossz kulcsot adtál meg?", "Nem tudtuk frissíteni: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nem tudtuk törölni a bejegyzést, mivel az olvasás után egyből megsemmisült. Így nem is volt tárolva.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "EZT A BEJEGYZÉST CSAK TE LÁTHATOD!!! Ne csukd be ezt az ablakot, mivel nem tudod újra megnézni. Az ugyanis az első olvasás után rögtön megsemmisül.", "Ismeretlen státusz.",
"Could not decrypt comment; Wrong key?": "Nem tudtuk dekódolni a hozzászólást. Talán rossz kulcsot adtál meg?", "server error or not responding":
"Reply": "Válasz", "A szerveren hiba lépett fel vagy nem válaszol.",
"Anonymous": "Anonymous", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar (az IP cím alapján generáljuk)", "Nem tudtuk beküldeni a hozzászólást: %s",
"Add comment": "Hozzászólok", "Sending paste…":
"Optional nickname…": "Becenév (már ha meg akarod adni)", "Bejegyzés elküldése...",
"Post comment": "Beküld", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Beküldés alatt...", "A bejegyzésed a <a id=\"pasteurl\" href=\"%s\">%s</a> címen elérhető. <span id=\"copyhint\"> [Ctrl]+[c]-vel tudod vágólapra másolni.</span>",
"Comment posted.": "A hozzászólás beküldve.", "Delete data":
"Could not refresh display: %s": "Nem tudtuk frissíteni: %s", "Adat törlése",
"unknown status": "Ismeretlen státusz.", "Could not create paste: %s":
"server error or not responding": "A szerveren hiba lépett fel vagy nem válaszol.", "Nem tudtuk létrehozni a bejegyzést: %s",
"Could not post comment: %s": "Nem tudtuk beküldeni a hozzászólást: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Bejegyzés elküldése...", "Nem tudjuk dekódolni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál ami kivágta azt belőle?",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "A bejegyzésed a <a id=\"pasteurl\" href=\"%s\">%s</a> címen elérhető. <span id=\"copyhint\"> [Ctrl]+[c]-vel tudod vágólapra másolni.</span>",
"Delete data": "Adat törlése",
"Could not create paste: %s": "Nem tudtuk létrehozni a bejegyzést: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nem tudjuk dekódolni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál ami kivágta azt belőle?",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formátum", "Format": "Formátum",
"Plain Text": "Egyszerű szöveg", "Plain Text": "Egyszerű szöveg",
"Source Code": "Forráskód", "Source Code": "Forráskód",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", "alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.",
"File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.", "File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.",
"Remove attachment": "Csatolmány eltávolítása", "Remove attachment": "Csatolmány eltávolítása",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.",
"Invalid attachment.": "Érvénytelen csatolmány.", "Invalid attachment.": "Érvénytelen csatolmány.",
"Options": "Opciók", "Options": "Opciók",
"Shorten URL": "URL rövidítés", "Shorten URL": "URL rövidítés",
"Editor": "Szerkesztő felület", "Editor": "Szerkesztő felület",
"Preview": "Előnézet", "Preview": "Előnézet",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s számára szükséges, hogy a PATH itt végződjön: \"%s\". Kérlek frissítsd a PATH értékét az index.php fájlban.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Dekódolás", "%s számára szükséges, hogy a PATH itt végződjön: \"%s\". Kérlek frissítsd a PATH értékét az index.php fájlban.",
"Enter password": "Jelszó", "Decrypt":
"Dekódolás",
"Enter password":
"Jelszó",
"Loading…": "Folyamatban...", "Loading…": "Folyamatban...",
"Decrypting paste…": "Bejegyzés dekódolása...", "Decrypting paste…": "Bejegyzés dekódolása...",
"Preparing new paste…": "Új bejegyzés előkészítése...", "Preparing new paste…": "Új bejegyzés előkészítése...",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Abban az esetben, ha ez az üzenet mindig látható lenne, látogass el a <a href=\"%s\">Gyakran Ismételt Kérdések szekcióba a megoldásához</a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Abban az esetben, ha ez az üzenet mindig látható lenne, látogass el a <a href=\"%s\">Gyakran Ismételt Kérdések szekcióba a megoldásához</a>.",
"+++ no paste text +++": "+++ nincs beillesztett szöveg +++", "+++ no paste text +++": "+++ nincs beillesztett szöveg +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati <i>nel Browser</i> con algoritmo AES a 256 Bit. Per ulteriori informazioni, vedi <a href=\"https://privatebin.info/\">Sito del progetto</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Perché l'ignoranza è una benedizione (Because ignorance is bliss)", "%s è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati <i>nel Browser</i> con algoritmo AES a 256 Bit. Per ulteriori informazioni, vedi <a href=\"https://privatebin.info/\">Sito del progetto</a>.",
"Because ignorance is bliss":
"Perché l'ignoranza è una benedizione (Because ignorance is bliss)",
"en": "it", "en": "it",
"Paste does not exist, has expired or has been deleted.": "Questo messaggio non esiste, è scaduto o è stato cancellato.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s richiede php %s o superiore per funzionare. Ci spiace.", "Questo messaggio non esiste, è scaduto o è stato cancellato.",
"%s requires configuration section [%s] to be present in configuration file.": "%s richiede la presenza della sezione [%s] nei file di configurazione.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Attendi per favore %d secondi prima di ciascun invio.", "%s richiede php %s o superiore per funzionare. Ci spiace.",
"Paste is limited to %s of encrypted data.": "La dimensione del messaggio è limitata a %s di dati cifrati.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Dati non validi.", "%s richiede la presenza della sezione [%s] nei file di configurazione.",
"You are unlucky. Try again.": "Ritenta, sarai più fortunato.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Errore durante il salvataggio del commento.", "Attendi per favore %d secondi prima di ciascun invio.",
"Error saving paste. Sorry.": "Errore durante il salvataggio del messaggio.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "ID-Messaggio non valido.", "La dimensione del messaggio è limitata a %s di dati cifrati.",
"Paste is not of burn-after-reading type.": "Il messaggio non è di tipo Distruggi-dopo-lettura.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Codice cancellazione errato. Il messaggio NON è stato cancellato.", "Dati non validi.",
"Paste was properly deleted.": "Il messaggio è stato correttamente cancellato.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "%s funziona solo con JavaScript attivo. Ci dispiace per l'inconveniente.", "Ritenta, sarai più fortunato.",
"%s requires a modern browser to work.": "%s richiede un browser moderno e aggiornato per funzionare.", "Error saving comment. Sorry.":
"New": "Nuovo", "Errore durante il salvataggio del commento.",
"Send": "Invia", "Error saving paste. Sorry.":
"Clone": "Clona", "Errore durante il salvataggio del messaggio.",
"Raw text": "Testo Raw", "Invalid paste ID.":
"Expires": "Scade", "ID-Messaggio non valido.",
"Burn after reading": "Distruggi dopo lettura", "Paste is not of burn-after-reading type.":
"Open discussion": "Apri discussione", "Il messaggio non è di tipo Distruggi-dopo-lettura.",
"Password (recommended)": "Password (raccomandato)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discussione", "Codice cancellazione errato. Il messaggio NON è stato cancellato.",
"Toggle navigation": "Scambia Navigazione", "Paste was properly deleted.":
"%d seconds": [ "Il messaggio è stato correttamente cancellato.",
"%d secondo", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d secondi", "%s funziona solo con JavaScript attivo.<br />Ci dispiace per l'inconveniente.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s richiede un browser moderno e aggiornato per funzionare.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Usi ancora Internet Explorer? Ti consigliamo di passare ad un browser più sicuro:",
"%d minuto", "New":
"%d minuti", "Nuovo",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Invia",
], "Clone":
"%d hours": [ "Clona",
"%d ora", "Raw text":
"%d ore", "Testo Raw",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Scade",
], "Burn after reading":
"%d days": [ "Distruggi dopo lettura",
"%d giorno", "Open discussion":
"%d giorni", "Apri discussione",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Password (raccomandato)",
], "Discussion":
"%d weeks": [ "Discussione",
"%d settimana", "Toggle navigation":
"%d settimane", "Scambia Navigazione",
"%d weeks (2nd plural)", "%d seconds": ["%d secondo", "%d secondi"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuto", "%d minuti"],
], "%d hours": ["%d ora", "%d ore"],
"%d months": [ "%d days": ["%d giorno", "%d giorni"],
"%d mese", "%d weeks": ["%d settimana", "%d settimane"],
"%d mesi", "%d months": ["%d mese", "%d mesi"],
"%d months (2nd plural)", "%d years": ["%d anno", "%d anni"],
"%d months (3rd plural)" "Never":
], "Mai",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d anno", "Nota: questo è un servizio di prova, i messaggi salvati possono essere cancellati in qualsiasi momento. Moriranno dei gattini se abuserai di questo servizio.",
"%d anni", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Questo documento scadrà tra un secondo.", "Questo documento scadrà in %d secondi."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Questo documento scadrà tra un minuto.", "Questo documento scadrà in %d minuti."],
"Never": "Mai", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota: questo è un servizio di prova, i messaggi salvati possono essere cancellati in qualsiasi momento. Moriranno dei gattini se abuserai di questo servizio.", ["Questo documento scadrà tra un'ora.", "Questo documento scadrà in %d ore."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Questo documento scadrà tra un secondo.", ["Questo documento scadrà tra un giorno.", "Questo documento scadrà in %d giorni."],
"Questo documento scadrà in %d secondi.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Questo documento scadrà tra un mese.", "Questo documento scadrà in %d mesi."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Inserisci la password per questo messaggio:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Questo documento scadrà tra un minuto.", "Non riesco a decifrari i dati (Chiave errata?)",
"Questo documento scadrà in %d minuti.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Non riesco a cancellare il messaggio, non è stato salvato in modalità Distruggi-dopo-lettora.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "FOR YOUR EYES ONLY. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Questo documento scadrà tra un'ora.", "Non riesco a decifrare il commento (Chiave errata?)",
"Questo documento scadrà in %d ore.", "Reply":
"This document will expire in %d hours (2nd plural)", "Rispondi",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonimo",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Questo documento scadrà tra un giorno.", "Avatar generato dall'indirizzo IP)",
"Questo documento scadrà in %d giorni.", "Add comment":
"This document will expire in %d days (2nd plural)", "Aggiungi un commento",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Nickname opzionale…",
"This document will expire in %d months.": [ "Post comment":
"Questo documento scadrà tra un mese.", "Invia commento",
"Questo documento scadrà in %d mesi.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Commento in fase di invio…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Commento inviato.",
"Please enter the password for this paste:": "Inserisci la password per questo messaggio:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Non riesco a decifrari i dati (Chiave errata?)", "Non riesco ad aggiornare il display: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Non riesco a cancellare il messaggio, non è stato salvato in modalità Distruggi-dopo-lettora.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "FOR YOUR EYES ONLY. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.", "stato sconosciuto",
"Could not decrypt comment; Wrong key?": "Non riesco a decifrare il commento (Chiave errata?)", "server error or not responding":
"Reply": "Rispondi", "errore o mancata risposta dal server",
"Anonymous": "Anonimo", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar generato dall'indirizzo IP)", "Impossibile inviare il commento: %s",
"Add comment": "Aggiungi un commento", "Sending paste…":
"Optional nickname…": "Nickname opzionale…", "Messaggio in fase di invio…",
"Post comment": "Invia commento", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Commento in fase di invio…", "Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Premi [Ctrl]+[c] (Windows) o [Cmd]+[c] (Mac) per copiare il link)</span>",
"Comment posted.": "Commento inviato.", "Delete data":
"Could not refresh display: %s": "Non riesco ad aggiornare il display: %s", "Cancella i dati",
"unknown status": "stato sconosciuto", "Could not create paste: %s":
"server error or not responding": "errore o mancata risposta dal server", "Non riesco a creare il messaggio: %s",
"Could not post comment: %s": "Impossibile inviare il commento: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Messaggio in fase di invio…", "Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Premi [Ctrl]+[c] (Windows) o [Cmd]+[c] (Mac) per copiare il link)</span>",
"Delete data": "Cancella i dati",
"Could not create paste: %s": "Non riesco a creare il messaggio: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formato", "Format": "Formato",
"Plain Text": "Solo Testo", "Plain Text": "Solo Testo",
"Source Code": "Codice Sorgente", "Source Code": "Codice Sorgente",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Rimuovi allegato", "Remove attachment": "Rimuovi allegato",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.",
"Invalid attachment.": "Allegato non valido.", "Invalid attachment.": "Allegato non valido.",
"Options": "Opzioni", "Options": "Opzioni",
"Shorten URL": "Accorcia URL", "Shorten URL": "Accorcia URL",
"Editor": "Editor", "Editor": "Editor",
"Preview": "Preview", "Preview": "Preview",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Decifra", "%s necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.",
"Enter password": "Inserisci la password", "Decrypt":
"Decifra",
"Enter password":
"Inserisci la password",
"Loading…": "Carico…", "Loading…": "Carico…",
"Decrypting paste…": "Decifro il messaggio…", "Decrypting paste…": "Decifro il messaggio…",
"Preparing new paste…": "Preparo il nuovo messaggio…", "Preparing new paste…": "Preparo il nuovo messaggio…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Nel caso questo messaggio non scompaia, controlla questa <a href=\"%s\">FAQ</a> per trovare informazioni su come risolvere il problema (in Inglese).", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Nel caso questo messaggio non scompaia, controlla questa <a href=\"%s\">FAQ</a> per trovare informazioni su come risolvere il problema (in Inglese).",
"+++ no paste text +++": "+++ nessun testo nel messaggio +++", "+++ no paste text +++": "+++ nessun testo nel messaggio +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd <i> in de browser </i> met behulp van 256 bits AES. Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Onwetendheid is een zegen", "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd <i> in de browser </i> met behulp van 256 bits AES. Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.",
"Because ignorance is bliss":
"Onwetendheid is een zegen",
"en": "nl", "en": "nl",
"Paste does not exist, has expired or has been deleted.": "Geplakte tekst bestaat niet, is verlopen of verwijderd.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s vereist PHP %s of hoger om te kunnen werken. Sorry", "Geplakte tekst bestaat niet, is verlopen of verwijderd.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Alstublieft %d seconden wachten tussen elk bericht", "%s vereist PHP %s of hoger om te kunnen werken. Sorry",
"Paste is limited to %s of encrypted data.": "Geplakte tekst is beperkt tot %s aan versleutelde gegevens", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Ongeldige gegevens", "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand",
"You are unlucky. Try again.": "Helaas. Probeer het nog eens", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Fout bij het opslaan van het commentaar. Sorry", "Alstublieft %d seconden wachten tussen elk bericht",
"Error saving paste. Sorry.": "Fout bij het opslaan van de geplakte tekst. Sorry.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Ongeldige ID.", "Geplakte tekst is beperkt tot %s aan versleutelde gegevens",
"Paste is not of burn-after-reading type.": "Geplakte tekst is geen 'vernietig na lezen' type", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Foutieve verwijdercode. Geplakte tekst is niet verwijderd.", "Ongeldige gegevens",
"Paste was properly deleted.": "Geplakte tekst is correct verwijderd.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript vereist om %s te laten werken. Sorry voor het ongemak.", "Helaas. Probeer het nog eens",
"%s requires a modern browser to work.": "%s vereist een moderne browser om te kunnen werken ", "Error saving comment. Sorry.":
"New": "Nieuw", "Fout bij het opslaan van het commentaar. Sorry",
"Send": "Verzenden", "Error saving paste. Sorry.":
"Clone": "Clonen", "Fout bij het opslaan van de geplakte tekst. Sorry.",
"Raw text": "Onbewerkte tekst", "Invalid paste ID.":
"Expires": "Verloopt", "Ongeldige ID.",
"Burn after reading": "Vernietig na lezen", "Paste is not of burn-after-reading type.":
"Open discussion": "Open discussie", "Geplakte tekst is geen 'vernietig na lezen' type",
"Password (recommended)": "Wachtwoord (aanbevolen)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discussie", "Foutieve verwijdercode. Geplakte tekst is niet verwijderd.",
"Toggle navigation": "Navigatie openen/sluiten", "Paste was properly deleted.":
"%d seconds": [ "Geplakte tekst is correct verwijderd.",
"%d second", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d seconden", "JavaScript vereist om %s te laten werken.<br />Sorry voor het ongemak.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s vereist een moderne browser om te kunnen werken ",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Gebruik je nog steeds Internet explorer? Doe jezelf een plezier en maak gebruik van een moderne browser:",
"%d minuut", "New":
"%d minuten", "Nieuw",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Verzenden",
], "Clone":
"%d hours": [ "Clonen",
"%d uur", "Raw text":
"%d hours (1st plural)", "Onbewerkte tekst",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Verloopt",
], "Burn after reading":
"%d days": [ "Vernietig na lezen",
"%d dag", "Open discussion":
"%d dagen", "Open discussie",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Wachtwoord (aanbevolen)",
], "Discussion":
"%d weeks": [ "Discussie",
"%d week", "Toggle navigation":
"%d weken", "Navigatie openen/sluiten",
"%d weeks (2nd plural)", "%d seconds": ["%d second", "%d seconden"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuut", "%d minuten"],
], "%d hours": ["%d uur"],
"%d months": [ "%d days": ["%d dag", "%d dagen"],
"%d maand", "%d weeks": ["%d week", "%d weken"],
"%d maanden", "%d months": ["%d maand", "%d maanden"],
"%d months (2nd plural)", "%d years": ["%d jaar"],
"%d months (3rd plural)" "Never":
], "Nooit",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d jaar", "Opmerking: Dit is een testservice: Gegevens kunnen op elk gegeven moment verwijderd worden.",
"%d years (1st plural)", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Dit document verloopt over %d second.", "Dit document verloopt over %d seconden."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Dit document verloopt over %d minuut.", "Dit document verloopt over %d minuten"],
"Never": "Nooit", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Opmerking: Dit is een testservice: Gegevens kunnen op elk gegeven moment verwijderd worden.", ["Dit document verloopt over %d uur."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Dit document verloopt over %d second.", ["Dit document verloopt over %d dag.", "Dit document verloopt over %d dagen."],
"Dit document verloopt over %d seconden.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Dit document verloopt over %d maand.", "Dit document verloopt over %d maanden."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Voer het wachtwoord in voor deze geplakte tekst:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Dit document verloopt over %d minuut.", "Kon de gegevens niet decoderen (verkeerde sleutel?)",
"Dit document verloopt over %d minuten", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Verwijderen van de geplakte tekst niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "FOR YOUR EYES ONLY. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Dit document verloopt over %d uur.", "Kon het commentaar niet decoderen; Verkeerde sleutel?",
"This document will expire in %d hours (1st plural)", "Reply":
"This document will expire in %d hours (2nd plural)", "Beantwoorden",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anoniem",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Dit document verloopt over %d dag.", "Anonieme avatar (van het IP adres)",
"Dit document verloopt over %d dagen.", "Add comment":
"This document will expire in %d days (2nd plural)", "Commentaar toevoegen",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Optionele bijnaam…",
"This document will expire in %d months.": [ "Post comment":
"Dit document verloopt over %d maand.", "Plaats een commentaar",
"Dit document verloopt over %d maanden.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Commentaar verzenden…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Commentaar geplaatst.",
"Please enter the password for this paste:": "Voer het wachtwoord in voor deze geplakte tekst:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Kon de gegevens niet decoderen (verkeerde sleutel?)", "Kon de weergave niet vernieuwen: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Verwijderen van de geplakte tekst niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "FOR YOUR EYES ONLY. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.", "Onbekende status",
"Could not decrypt comment; Wrong key?": "Kon het commentaar niet decoderen; Verkeerde sleutel?", "server error or not responding":
"Reply": "Beantwoorden", "Serverfout of server reageert niet",
"Anonymous": "Anoniem", "Could not post comment: %s":
"Avatar generated from IP address": "Anonieme avatar (van het IP adres)", "Kon het commentaar niet plaatsen: %s",
"Add comment": "Commentaar toevoegen", "Sending paste…":
"Optional nickname…": "Optionele bijnaam…", "Geplakte tekst verzenden…",
"Post comment": "Plaats een commentaar", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Commentaar verzenden…", "Uw geplakte tekst is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk [Ctrl]+[c] om te kopiëren)</span>",
"Comment posted.": "Commentaar geplaatst.", "Delete data":
"Could not refresh display: %s": "Kon de weergave niet vernieuwen: %s", "Gegevens wissen",
"unknown status": "Onbekende status", "Could not create paste: %s":
"server error or not responding": "Serverfout of server reageert niet", "Kon de geplakte tekst niet aanmaken: %s",
"Could not post comment: %s": "Kon het commentaar niet plaatsen: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Geplakte tekst verzenden…", "Kon de geplakte tekst niet decoderen: Decoderingssleutel ontbreekt in URL (Hebt u een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Uw geplakte tekst is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk [Ctrl]+[c] om te kopiëren)</span>",
"Delete data": "Gegevens wissen",
"Could not create paste: %s": "Kon de geplakte tekst niet aanmaken: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon de geplakte tekst niet decoderen: Decoderingssleutel ontbreekt in URL (Hebt u een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formaat", "Format": "Formaat",
"Plain Text": "Platte tekst", "Plain Text": "Platte tekst",
"Source Code": "Broncode", "Source Code": "Broncode",
@@ -143,39 +132,34 @@
"Attach a file": "Een bestand toevoegen", "Attach a file": "Een bestand toevoegen",
"alternatively drag & drop a file or paste an image from the clipboard": "U kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", "alternatively drag & drop a file or paste an image from the clipboard": "U kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord",
"File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden", "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden",
"Remove attachment": "Bijlage verwijderen", "Remove attachment": "Bijlage verwijderen",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Uw browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Uw browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser",
"Invalid attachment.": "Ongeldige bijlage", "Invalid attachment.": "Ongeldige bijlage",
"Options": "Opties", "Options": "Opties",
"Shorten URL": "URL verkorten", "Shorten URL": "URL verkorten",
"Editor": "Editor", "Editor": "Editor",
"Preview": "Preview", "Preview": "Preview",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vereist dat het PATH eindigt in een '%s'. Aub het PATH updaten in uw index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Decoderen", "%s vereist dat het PATH eindigt in een '%s'. Aub het PATH updaten in uw index.php.",
"Enter password": "Voer het wachtwoord in", "Decrypt":
"Decoderen",
"Enter password":
"Voer het wachtwoord in",
"Loading…": "Laden…", "Loading…": "Laden…",
"Decrypting paste…": "Geplakte tekst decoderen…", "Decrypting paste…": "Geplakte tekst decoderen…",
"Preparing new paste…": "Nieuwe geplakte tekst voorbereiden…", "Preparing new paste…": "Nieuwe geplakte tekst voorbereiden…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In het geval dat dit bericht nooit verdwijnt, kijkt u dan eens naar <a href=\"%s\"> veelgestelde vragen voor informatie over het oplossen van problemen </a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"In het geval dat dit bericht nooit verdwijnt, kijkt u dan eens naar <a href=\"%s\"> veelgestelde vragen voor informatie over het oplossen van problemen </a>.",
"+++ no paste text +++": "+++ geen geplakte tekst +++", "+++ no paste text +++": "+++ geen geplakte tekst +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres <i>i nettleseren</i> ved hjelp av 256 bits AES. Mer informasjon om prosjektet på <a href=\"https://privatebin.info/\">prosjektsiden</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Fordi uvitenhet er lykke", "%s er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres <i>i nettleseren</i> ved hjelp av 256 bits AES. Mer informasjon om prosjektet på <a href=\"https://privatebin.info/\">prosjektsiden</a>.",
"Because ignorance is bliss":
"Fordi uvitenhet er lykke",
"en": "no", "en": "no",
"Paste does not exist, has expired or has been deleted.": "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "Beklager, %s krever php %s eller nyere for å kjøre.", "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.",
"%s requires configuration section [%s] to be present in configuration file.": "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Vennligst vent %d sekunder mellom hvert innlegg.", "Beklager, %s krever php %s eller nyere for å kjøre.",
"Paste is limited to %s of encrypted data.": "Innlegg er begrenset til %s av kryptert data.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Ugyldige data.", "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .",
"You are unlucky. Try again.": "Du er uheldig. Prøv igjen.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Beklager, det oppstod en feil ved lagring kommentar.", "Vennligst vent %d sekunder mellom hvert innlegg.",
"Error saving paste. Sorry.": "Beklager, det oppstod en feil ved lagring innlegg.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Feil innlegg ID.", "Innlegg er begrenset til %s av kryptert data.",
"Paste is not of burn-after-reading type.": "Innlegg er ikke av typen slett etter lesing.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Feil slettingsnøkkel. Innlegg ble ikke fjernet.", "Ugyldige data.",
"Paste was properly deleted.": "Innlegget er slettet.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Javascript kreves for at %s skal fungere. Beklager.", "Du er uheldig. Prøv igjen.",
"%s requires a modern browser to work.": "%s krever en moderne nettleser for å fungere.", "Error saving comment. Sorry.":
"New": "Ny", "Beklager, det oppstod en feil ved lagring kommentar.",
"Send": "Send", "Error saving paste. Sorry.":
"Clone": "Kopier", "Beklager, det oppstod en feil ved lagring innlegg.",
"Raw text": "Ren tekst", "Invalid paste ID.":
"Expires": "Utgår", "Feil innlegg ID.",
"Burn after reading": "Slett etter lesing", "Paste is not of burn-after-reading type.":
"Open discussion": "Åpen diskusjon", "Innlegg er ikke av typen slett etter lesing.",
"Password (recommended)": "Passord (anbefalt)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Diskusjon", "Feil slettingsnøkkel. Innlegg ble ikke fjernet.",
"Toggle navigation": "Veksle navigasjon", "Paste was properly deleted.":
"%d seconds": [ "Innlegget er slettet.",
"%d sekund", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d sekunder", "Javascript kreves for at %s skal fungere<br />Beklager.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s krever en moderne nettleser for å fungere.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Fortsatt bruker av Internet Explorer? Gjør deg selv en tjeneste og bytt til en moderne nettleser:",
"%d minutt", "New":
"%d minutter", "Ny",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Send",
], "Clone":
"%d hours": [ "Kopier",
"%d time", "Raw text":
"%d timer", "Ren tekst",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Utgår",
], "Burn after reading":
"%d days": [ "Slett etter lesing",
"%d dag", "Open discussion":
"%d dager", "Åpen diskusjon",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Passord (anbefalt)",
], "Discussion":
"%d weeks": [ "Diskusjon",
"%d uke", "Toggle navigation":
"%d uker", "Veksle navigasjon",
"%d weeks (2nd plural)", "%d seconds": ["%d sekund", "%d sekunder"],
"%d weeks (3rd plural)" "%d minutes": ["%d minutt", "%d minutter"],
], "%d hours": ["%d time", "%d timer"],
"%d months": [ "%d days": ["%d dag", "%d dager"],
"%d måned", "%d weeks": ["%d uke", "%d uker"],
"%d måneder", "%d months": ["%d måned", "%d måneder"],
"%d months (2nd plural)", "%d years": ["%d år", "%d år"],
"%d months (3rd plural)" "Never":
], "Aldri",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d år", "Merk: Dette er en test tjeneste: Data kan slettes når som helst. Kattunger vil dø hvis du misbruker denne tjenesten.",
"%d år", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Dette dokumentet vil utløpe om %d sekund.", "Dette dokumentet vil utløpe om %d sekunder."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Dette dokumentet vil utløpe om %d minutt.", "Dette dokumentet vil utløpe om %d minutter."],
"Never": "Aldri", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Merk: Dette er en test tjeneste: Data kan slettes når som helst. Kattunger vil dø hvis du misbruker denne tjenesten.", ["Dette dokumentet vil utløpe om %d time.", "Dette dokumentet vil utløpe om %d timer."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Dette dokumentet vil utløpe om %d sekund.", ["Dette dokumentet vil utløpe om %d dag.", "Dette dokumentet vil utløpe om %d dager."],
"Dette dokumentet vil utløpe om %d sekunder.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Dette dokumentet vil utløpe om %d måned.", "Dette dokumentet vil utløpe om %d måneder."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Vennligst skriv inn passordet for dette innlegget:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Dette dokumentet vil utløpe om %d minutt.", "Kunne ikke dekryptere data (Feil nøkkel?)",
"Dette dokumentet vil utløpe om %d minutter.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Kan ikke slette innlegget, det ble ikke lagret som 'slett etter les' type.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Dette dokumentet vil utløpe om %d time.", "Kan ikke dekryptere kommentar; Feil nøkkel?",
"Dette dokumentet vil utløpe om %d timer.", "Reply":
"This document will expire in %d hours (2nd plural)", "Svar",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonym",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Dette dokumentet vil utløpe om %d dag.", "Anonym avatar generert med data fra IP adressen)",
"Dette dokumentet vil utløpe om %d dager.", "Add comment":
"This document will expire in %d days (2nd plural)", "Legg til kommentar",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Valgfritt kallenavn…",
"This document will expire in %d months.": [ "Post comment":
"Dette dokumentet vil utløpe om %d måned.", "Send kommentar",
"Dette dokumentet vil utløpe om %d måneder.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Sender Kommentar…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Kommentar sendt.",
"Please enter the password for this paste:": "Vennligst skriv inn passordet for dette innlegget:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Kunne ikke dekryptere data (Feil nøkkel?)", "Kunne ikke oppdatere bildet: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Kan ikke slette innlegget, det ble ikke lagret som 'slett etter les' type.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.", "ukjent status",
"Could not decrypt comment; Wrong key?": "Kan ikke dekryptere kommentar; Feil nøkkel?", "server error or not responding":
"Reply": "Svar", "tjener feilet eller svarer ikke",
"Anonymous": "Anonym", "Could not post comment: %s":
"Avatar generated from IP address": "Anonym avatar generert med data fra IP adressen)", "Kunne ikke sende kommentar: %s",
"Add comment": "Legg til kommentar", "Sending paste…":
"Optional nickname…": "Valgfritt kallenavn…", "Sender innlegg…",
"Post comment": "Send kommentar", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Sender Kommentar…", "Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk [Ctrl]+[c] for å kopiere)</span>",
"Comment posted.": "Kommentar sendt.", "Delete data":
"Could not refresh display: %s": "Kunne ikke oppdatere bildet: %s", "Slett data",
"unknown status": "ukjent status", "Could not create paste: %s":
"server error or not responding": "tjener feilet eller svarer ikke", "Kunne ikke opprette innlegg: %s",
"Could not post comment: %s": "Kunne ikke sende kommentar: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Sender innlegg…", "Kan ikke dekryptere innlegg: Dekrypteringsnøkkelen mangler i adressen (Har du bruket en redirector eller en URL forkorter som fjerner en del av addressen?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk [Ctrl]+[c] for å kopiere)</span>",
"Delete data": "Slett data",
"Could not create paste: %s": "Kunne ikke opprette innlegg: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kan ikke dekryptere innlegg: Dekrypteringsnøkkelen mangler i adressen (Har du bruket en redirector eller en URL forkorter som fjerner en del av addressen?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format", "Format": "Format",
"Plain Text": "Ren Tekst", "Plain Text": "Ren Tekst",
"Source Code": "Kildekode", "Source Code": "Kildekode",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Slett vedlegg", "Remove attachment": "Slett vedlegg",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.",
"Invalid attachment.": "Ugyldig vedlegg.", "Invalid attachment.": "Ugyldig vedlegg.",
"Options": "Alternativer", "Options": "Alternativer",
"Shorten URL": "Adresse forkorter", "Shorten URL": "Adresse forkorter",
"Editor": "Rediger", "Editor": "Rediger",
"Preview": "Forhåndsvis", "Preview": "Forhåndsvis",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s krever at PATH ender på \"%s\". Vennligst oppdater PATH i index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Dekrypter", "%s krever at PATH ender på \"%s\". Vennligst oppdater PATH i index.php.",
"Enter password": "Skriv inn passord", "Decrypt":
"Dekrypter",
"Enter password":
"Skriv inn passord",
"Loading…": "Laster…", "Loading…": "Laster…",
"Decrypting paste…": "Dekrypterer innlegg…", "Decrypting paste…": "Dekrypterer innlegg…",
"Preparing new paste…": "Klargjør nytt innlegg…", "Preparing new paste…": "Klargjør nytt innlegg…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med <a href=\"%s\">ofte stilte spørsmål</a> for informasjon om feilsøking.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med <a href=\"%s\">ofte stilte spørsmål</a> for informasjon om feilsøking.",
"+++ no paste text +++": "+++ ingen innleggstekst +++", "+++ no paste text +++": "+++ ingen innleggstekst +++",
"Could not get paste data: %s": "Kunne ikke hente utklippsdata: %s", "Could not get paste data: %s":
"QR code": "QR kode", "Kunne ikke hente utklippsdata: %s",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Denne websiden bruker usikker HTTP tilkobling! Bruk den kun for testing.", "QR code": "QR code",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For mer informasjon <a href=\"%s\">se ofte stilte spørsmål</a>.", "I love you too, bot…": "I love you too, bot…",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Din nettleser har behov for HTTPS tilkobling for å støtte WebCrypto biblioteket. Prøv å <a href=\"%s\">bytt til HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Nettleseren din støtter ikke WebAssembly som brukes for zlib komprimering. Du kan lage ukomprimerte dokumenter, men du kan ikke lese komprimerte.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"waiting on user to provide a password": "venter på at bruker skal skrive passord", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Kunne ikke dekryptere data. Har du tastet riktig pssord? Prøv igjen med knappen på toppen.", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Retry": "Prøv igjen", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Showing raw text…": "Viser rå-tekst…", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Notice:": "Notat:",
"This link will expire after %s.": "Denne lenken vil bli inaktiv etter %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Denne addressen kan kun bli besøkt en gang, ikke trykk på tilbake eller oppdater knappene i nettleseren.",
"Link:": "Lenke:",
"Recipient may become aware of your timezone, convert time to UTC?": "Mottaker kan bli kjent med din tidssone, ønsker du å konvertere til UTC?",
"Use Current Timezone": "Bruk gjeldende tidssone",
"Convert To UTC": "Konverter til UTC",
"Close": "Steng",
"Encrypted note on PrivateBin": "Kryptert notat på PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Besøk denne lenken for å se notatet. Hvis lenken deles med andre, vil de også kunne se notatet."
} }

View File

@@ -1,129 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s es un 'pastebin' (o gestionari dextrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas <i>dins lo navigator</i> per un chiframent AES 256 bits. Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Perque lo bonaür es lignorància", "%s es un 'pastebin' (o gestionari dextrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas <i>dins lo navigator</i> per un chiframent AES 256 bits. Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.",
"Because ignorance is bliss":
"Perque lo bonaür es lignorància",
"en": "oc", "en": "oc",
"Paste does not exist, has expired or has been deleted.": "Lo tèxte existís pas, a expirat, o es estat suprimit.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "O planhèm, %s necessita php %s o superior per foncionar.", "Lo tèxte existís pas, a expirat, o es estat suprimit.",
"%s requires configuration section [%s] to be present in configuration file.": "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Mercés d'esperar %d segondas entre cada publicacion.", "O planhèm, %s necessita php %s o superior per foncionar.",
"Paste is limited to %s of encrypted data.": "Lo tèxte es limitat a %s de donadas chifradas.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Donadas invalidas.", "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.",
"You are unlucky. Try again.": "Pas cap de fortuna. Tornatz ensajar.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Error al moment de salvagardar lo comentari. O planhèm.", "Mercés d'esperar %d segondas entre cada publicacion.",
"Error saving paste. Sorry.": "Error al moment de salvagardar lo tèxte. O planhèm.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "ID del tèxte invalid.", "Lo tèxte es limitat a %s de donadas chifradas.",
"Paste is not of burn-after-reading type.": "Lo tèxte es pas del tip \"Escafar aprèp lectura\".", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Geton de supression incorrècte. Lo tèxte es pas estat suprimit.", "Donadas invalidas.",
"Paste was properly deleted.": "Lo tèxte es estat corrèctament suprimit.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript es requesit per far foncionar %s. O planhèm per linconvenient.", "Pas cap de fortuna. Tornatz ensajar.",
"%s requires a modern browser to work.": "%s necessita un navigator modèrn per foncionar.", "Error saving comment. Sorry.":
"New": "Nòu", "Error al moment de salvagardar lo comentari. O planhèm.",
"Send": "Mandar", "Error saving paste. Sorry.":
"Clone": "Clonar", "Error al moment de salvagardar lo tèxte. O planhèm.",
"Raw text": "Tèxte brut", "Invalid paste ID.":
"Expires": "Expira", "ID del tèxte invalid.",
"Burn after reading": "Escafar aprèp lectura", "Paste is not of burn-after-reading type.":
"Open discussion": "Autorizar la discussion", "Lo tèxte es pas del tip \"Escafar aprèp lectura\".",
"Password (recommended)": "Senhal (recomandat)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discussion", "Geton de supression incorrècte. Lo tèxte es pas estat suprimit.",
"Toggle navigation": "Virar la navigacion", "Paste was properly deleted.":
"%d seconds": [ "Lo tèxte es estat correctament suprimit.",
"%d segonda", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d segondas", "JavaScript es requesit per far foncionar %s. <br />O planhèm per linconvenient.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s necessita un navigator modèrn per foncionar.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Encora sus Internet Explorer?Fasètz-vos una favor, passatz a un navigator modèrn:",
"%d minuta", "New":
"%d minutas", "Nòu",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Mandar",
], "Clone":
"%d hours": [ "Clonar",
"%d ora", "Raw text":
"%d oras", "Tèxte brut",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Expira",
], "Burn after reading":
"%d days": [ "Escafar aprèp lectura",
"%d jorn", "Open discussion":
"%d jorns", "Autorizar la discussion",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Senhal (recomandat)",
], "Discussion":
"%d weeks": [ "Discussion",
"%d setmana", "Toggle navigation":
"%d setmanas", "Virar la navigacion",
"%d weeks (2nd plural)", "%d seconds": ["%d segonda", "%d segondas"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuta", "%d minutas"],
], "%d hours": ["%d ora", "%d oras"],
"%d months": [ "%d days": ["%d jorn", "%d jorns"],
"%d mes", "%d weeks": ["%d setmana", "%d setmanas"],
"%d meses", "%d months": ["%d mes", "%d meses"],
"%d months (2nd plural)", "%d years": ["%d an", "%d ans"],
"%d months (3rd plural)" "Never":
], "Jamai",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d an", "Nota:Aquò es un servici despròva:las donadas pòdon èsser suprimidas a cada moment. De catons moriràn sabusatz daqueste servici.",
"%d ans", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Ce document expirera dans %d seconde.", "Aqueste document expirarà dins %d segondas."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Ce document expirera dans %d minute.", "Aqueste document expirarà dins %d minutas."],
"Never": "Jamai", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota:Aquò es un servici despròva:las donadas pòdon èsser suprimidas a cada moment. De catons moriràn sabusatz daqueste servici.", ["Ce document expirera dans %d heure.", "Aqueste document expirarà dins %d oras."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Ce document expirera dans %d seconde.", ["Ce document expirera dans %d jour.", "Aqueste document expirarà dins %d jorns."],
"Aqueste document expirarà dins %d segondas.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Ce document expirera dans %d mois.", "Aqueste document expirarà dins %d meses."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Picatz lo senhal per aqueste tèxte:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Ce document expirera dans %d minute.", "Impossible de deschifrar las donadas (marrida clau?)",
"Aqueste document expirarà dins %d minutas.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Ce document expirera dans %d heure.", "Impossible de deschifrar lo comentari ; marrida clau?",
"Aqueste document expirarà dins %d oras.", "Reply":
"This document will expire in %d hours (2nd plural)", "Respondre",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonime",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Ce document expirera dans %d jour.", "Avatar anonime (Vizhash de ladreça IP)",
"Aqueste document expirarà dins %d jorns.", "Add comment":
"This document will expire in %d days (2nd plural)", "Apondre un comentari",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Escais opcional…",
"This document will expire in %d months.": [ "Post comment":
"Ce document expirera dans %d mois.", "Mandar lo comentari",
"Aqueste document expirarà dins %d meses.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Mandadís del comentari…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Comentari mandat.",
"Please enter the password for this paste:": "Picatz lo senhal per aqueste tèxte:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Impossible de deschifrar las donadas (marrida clau?)", "Impossible dactualizar lafichatge:%s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.", "Estatut desconegut",
"Could not decrypt comment; Wrong key?": "Impossible de deschifrar lo comentari ; marrida clau?", "server error or not responding":
"Reply": "Respondre", "Lo servidor respond pas o a rencontrat una error",
"Anonymous": "Anonime", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar anonime (Vizhash de ladreça IP)", "Impossible de mandar lo comentari:%s",
"Add comment": "Apondre un comentari", "Sending paste…":
"Optional nickname…": "Escais opcional…", "Mandadís del tèxte…",
"Post comment": "Mandar lo comentari", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Mandadís del comentari…", "Vòstre tèxte es disponible a ladreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus [Ctrl]+[c] per copiar)</span>",
"Comment posted.": "Comentari mandat.", "Delete data":
"Could not refresh display: %s": "Impossible dactualizar lafichatge:%s", "Supprimir las donadas del tèxte",
"unknown status": "Estatut desconegut", "Could not create paste: %s":
"server error or not responding": "Lo servidor respond pas o a rescontrat una error", "Impossible de crear lo tèxte:%s",
"Could not post comment: %s": "Impossible de mandar lo comentari:%s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Mandadís del tèxte…", "Impossible de deschifrar lo tèxte:clau de deschiframent absenta de lURL (Avètz utilizat un redirector o un site de reduccion dURL que suprimís una partida de lURL?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Vòstre tèxte es disponible a ladreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus [Ctrl]+[c] per copiar)</span>",
"Delete data": "Supprimir las donadas del tèxte",
"Could not create paste: %s": "Impossible de crear lo tèxte:%s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Impossible de deschifrar lo tèxte:clau de deschiframent absenta de lURL (Avètz utilizat un redirector o un site de reduccion dURL que suprimís una partida de lURL?)",
"B": "o", "B": "o",
"KiB": "Kio", "KiB": "Kio",
"MiB": "Mio", "MiB": "Mio",
@@ -144,38 +142,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz limatge del quichapapièrs", "alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz limatge del quichapapièrs",
"File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.", "File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.",
"Remove attachment": "Levar la pèça junta", "Remove attachment": "Levar la pèça junta",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés demplegar un navigator mai recent.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés demplegar un navigator mai recent.",
"Invalid attachment.": "Pèça junta invalida.", "Invalid attachment.": "Pèça junta invalida.",
"Options": "Opcions", "Options": "Opcions",
"Shorten URL": "Acorchir lURL", "Shorten URL": "Acorchir lURL",
"Editor": "Editar", "Editor": "Editar",
"Preview": "Previsualizar", "Preview": "Previsualizar",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s demanda que lo PATH termine en \"%s\". Mercés de metre a jorn lo PATH dins vòstre index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Deschifrar", "%s demanda que lo PATH termine en \"%s\". Mercés de metre a jorn lo PATH dins vòstre index.php.",
"Enter password": "Picatz lo senhal", "Decrypt":
"Deschifrar",
"Enter password":
"Picatz lo senhal",
"Loading…": "Cargament…", "Loading…": "Cargament…",
"Decrypting paste…": "Deschirament del tèxte…", "Decrypting paste…": "Deschirament del tèxte…",
"Preparing new paste…": "Preparacion…", "Preparing new paste…": "Preparacion…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Se per cas aqueste messatge quite pas de safichar mercés de gaitar <a href=\"%s\">aquesta FAQ per las solucions</a> (en anglés).", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Se per cas aqueste messatge quita pas de safichar mercés de gaitar <a href=\"%s\">aquesta FAQ per las solucions</a> (en anglés).",
"+++ no paste text +++": "+++ cap de tèxte pegat +++", "+++ no paste text +++": "+++ cap de tèxte pegat +++",
"Could not get paste data: %s": "Recuperacion impossibla de las donadas copiadas: %s", "Could not get paste data: %s":
"Recuperacion impossibla de las donadas copiadas: %s",
"QR code": "Còdi QR", "QR code": "Còdi QR",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Aqueste site utiliza una connexion HTTP pas segura ! Mercés de lutilizar pas que per densages.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Per mai dinformacions <a href=\"%s\">vejatz aqueste article de FAQ</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Se pòt que vòstre navigator faga besonh duna connexion HTTPS per èsser compatible amb lAPI WebCrypto. Ensajatz de <a href=\"%s\">passar al HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Vòstre navigator es pas compatible amb WebAssembly, utilizat per la compression zlib. Podètz crear de documents pas compressat, mas ne podètz pas legir de compressats.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "en espèra que lutilizaire fornisca un senhal", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Deschiframent de las donadas impossible. Avètz picat un marrit senhal? Tornatz ensajar amb lo boton ennaut.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Tornar ensajar", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Afichatge del tèxte brut…",
"Notice:": "Avertiment:",
"This link will expire after %s.": "Aqueste ligam expirarà aprèp %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Òm pòt pas quaccedir a aqueste ligam quun còp, utilizetz pas lo boton precedent o actualizar del navigator.",
"Link:": "Ligam:",
"Recipient may become aware of your timezone, convert time to UTC?": "Lo destinatari pòt savisar de vòstre fus orari, convertir en UTC?",
"Use Current Timezone": "Utilizar lactual",
"Convert To UTC": "Convertir en UTC",
"Close": "Tampar",
"Encrypted note on PrivateBin": "Nòtas chifradas sus PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitatz aqueste ligam per veire la nòta. Fornir lo ligam a qualquun mai li permet tanben daccedir a la nòta."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane <i>w przeglądarce</i> z użyciem 256-bitowego klucza AES. Więcej informacji na <a href=\"https://privatebin.info/\">stronie projektu</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Ponieważ ignorancja jest cnotą", "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane <i>w przeglądarce</i> z użyciem 256-bitowego klucza AES. Więcej informacji na <a href=\"https://privatebin.info/\">stronie projektu</a>.",
"Because ignorance is bliss":
"Ponieważ ignorancja jest cnotą",
"en": "pl", "en": "pl",
"Paste does not exist, has expired or has been deleted.": "Wklejka nie istnieje, wygasła albo została usunięta.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.", "Wklejka nie istnieje, wygasła albo została usunięta.",
"%s requires configuration section [%s] to be present in configuration file.": "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Poczekaj %d sekund pomiędzy każdą wklejką.", "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.",
"Paste is limited to %s of encrypted data.": "Wklejka jest limitowana do %s zaszyfrowanych danych.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Nieprawidłowe dane.", "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.",
"You are unlucky. Try again.": "Miałeś pecha. Spróbuj ponownie.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Błąd przy zapisywaniu komentarza, sorry.", "Poczekaj %d sekund pomiędzy każdą wklejką.",
"Error saving paste. Sorry.": "Błąd przy zapisywaniu wklejki, sorry.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Nieprawidłowe ID wklejki.", "Wklejka jest limitowana do %s zaszyfrowanych danych.",
"Paste is not of burn-after-reading type.": "Ta wklejka nie ulega autodestrukcji po przeczytaniu.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Nieprawidłowy token usuwania. Wklejka nie została usunięta.", "Nieprawidłowe dane.",
"Paste was properly deleted.": "Wklejka usunięta poprawnie.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Do działania %sa jest wymagany JavaScript. Przepraszamy za tę niedogodność.", "Miałeś pecha. Spróbuj ponownie.",
"%s requires a modern browser to work.": "%s wymaga do działania nowoczesnej przeglądarki.", "Error saving comment. Sorry.":
"New": "Nowa", "Błąd przy zapisywaniu komentarza, sorry.",
"Send": "Wyślij", "Error saving paste. Sorry.":
"Clone": "Sklonuj", "Błąd przy zapisywaniu wklejki, sorry.",
"Raw text": "Czysty tekst", "Invalid paste ID.":
"Expires": "Wygasa za", "Nieprawidłowe ID wklejki.",
"Burn after reading": "Zniszcz po przeczytaniu", "Paste is not of burn-after-reading type.":
"Open discussion": "Otwarta dyskusja", "Ta wklejka nie ulega autodestrukcji po przeczytaniu.",
"Password (recommended)": "Hasło (zalecane)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Dyskusja", "Nieprawidłowy token usuwania. Wklejka nie została usunięta.",
"Toggle navigation": "Przełącz nawigację", "Paste was properly deleted.":
"%d seconds": [ "Wklejka usunięta poprawnie.",
"%d second", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d second", "Do działania %sa jest wymagany JavaScript. Przepraszamy za tę niedogodność.",
"%d second", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s wymaga do działania nowoczesnej przeglądarki.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Cały czas używasz Internet Explorera? Zrób sobie przysługę, przesiądź się na nowoczesną przeglądarkę:",
"%d minut", "New":
"%d minut", "Nowa",
"%d minut", "Send":
"%d minutes (3rd plural)" "Wyślij",
], "Clone":
"%d hours": [ "Sklonuj",
"%d godzina", "Raw text":
"%d godzina", "Czysty tekst",
"%d godzinę", "Expires":
"%d hours (3rd plural)" "Wygasa za",
], "Burn after reading":
"%d days": [ "Zniszcz po przeczytaniu",
"%d dzień", "Open discussion":
"%d dzień", "Otwarta dyskusja",
"%d dzień", "Password (recommended)":
"%d days (3rd plural)" "Hasło (zalecane)",
], "Discussion":
"%d weeks": [ "Dyskusja",
"%d tydzień", "Toggle navigation":
"%d tydzień", "Przełącz nawigację",
"%d tydzień", "%d seconds": ["%d second", "%d second", "%d second"],
"%d weeks (3rd plural)" "%d minutes": ["%d minut", "%d minut", "%d minut"],
], "%d hours": ["%d godzina", "%d godzina", "%d godzinę"],
"%d months": [ "%d days": ["%d dzień", "%d dzień", "%d dzień"],
"%d miesiąc", "%d weeks": ["%d tydzień", "%d tydzień", "%d tydzień"],
"%d miesiąc", "%d months": ["%d miesiąc", "%d miesiąc", "%d miesiąc"],
"%d miesiąc", "%d years": ["%d rok", "%d rok", "%d rok"],
"%d months (3rd plural)" "Never":
], "nigdy",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d rok", "Notka: To jest usługa testowa. Dane mogą zostać usunięte w dowolnym momencie. Kociątka umrą, jeśli nadużyjesz tej usługi.",
"%d rok", "This document will expire in %d seconds.":
"%d rok", ["Ten dokument wygaśnie za %d sekundę.", "Ten dokument wygaśnie za %d sekund."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Ten dokument wygaśnie za %d minutę.", "Ten dokument wygaśnie za %d minut."],
"Never": "nigdy", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Notka: To jest usługa testowa. Dane mogą zostać usunięte w dowolnym momencie. Kociątka umrą, jeśli nadużyjesz tej usługi.", ["Ten dokument wygaśnie za godzinę.", "Ten dokument wygaśnie za %d godzin."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Ten dokument wygaśnie za %d sekundę.", ["Ten dokument wygaśnie za %d dzień.", "Ten dokument wygaśnie za %d dni."],
"Ten dokument wygaśnie za %d sekund.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Ten dokument wygaśnie za miesiąc.", "Ten dokument wygaśnie za %d miesięcy."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Wpisz hasło dla tej wklejki:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Ten dokument wygaśnie za %d minutę.", "Nie udało się odszyfrować danych (zły klucz?)",
"Ten dokument wygaśnie za %d minut.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Nie udało się usunąć wklejki, nie została zapisana w trybie zniszczenia po przeczytaniu.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "TYLKO DO TWOJEGO WGLĄDU. Nie zamykaj tego okna, ta wiadomość nie będzie mogła być wyświetlona ponownie.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Ten dokument wygaśnie za godzinę.", "Nie udało się odszyfrować komentarza; zły klucz?",
"Ten dokument wygaśnie za %d godzin.", "Reply":
"This document will expire in %d hours (2nd plural)", "Odpowiedz",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anonim",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Ten dokument wygaśnie za %d dzień.", "Anonimowy avatar (Vizhash z adresu IP)",
"Ten dokument wygaśnie za %d dni.", "Add comment":
"This document will expire in %d days (2nd plural)", "Dodaj komentarz",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Opcjonalny nick…",
"This document will expire in %d months.": [ "Post comment":
"Ten dokument wygaśnie za miesiąc.", "Wyślij komentarz",
"Ten dokument wygaśnie za %d miesięcy.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Wysyłanie komentarza…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Wysłano komentarz.",
"Please enter the password for this paste:": "Wpisz hasło dla tej wklejki:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Nie udało się odszyfrować danych (zły klucz?)", "Nie można odświeżyć widoku: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nie udało się usunąć wklejki, nie została zapisana w trybie zniszczenia po przeczytaniu.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "TYLKO DO TWOJEGO WGLĄDU. Nie zamykaj tego okna, ta wiadomość nie będzie mogła być wyświetlona ponownie.", "nieznany status",
"Could not decrypt comment; Wrong key?": "Nie udało się odszyfrować komentarza; zły klucz?", "server error or not responding":
"Reply": "Odpowiedz", "błąd serwera lub brak odpowiedzi",
"Anonymous": "Anonim", "Could not post comment: %s":
"Avatar generated from IP address": "Anonimowy avatar (Vizhash z adresu IP)", "Nie udało się wysłać komentarza: %s",
"Add comment": "Dodaj komentarz", "Sending paste…":
"Optional nickname…": "Opcjonalny nick…", "Wysyłanie wklejki…",
"Post comment": "Wyślij komentarz", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Wysyłanie komentarza…", "Twoja wklejka to <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(wciśnij [Ctrl]+[c] aby skopiować)</span>",
"Comment posted.": "Wysłano komentarz.", "Delete data":
"Could not refresh display: %s": "Nie można odświeżyć widoku: %s", "Skasuj dane",
"unknown status": "nieznany status", "Could not create paste: %s":
"server error or not responding": "błąd serwera lub brak odpowiedzi", "Nie udało się utworzyć wklejki: %s",
"Could not post comment: %s": "Nie udało się wysłać komentarza: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Wysyłanie wklejki…", "Nie udało się odszyfrować wklejki - brak klucza deszyfrującego w adresie (użyłeś skracacza linków, który ucina część adresu?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Twoja wklejka to <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(wciśnij [Ctrl]+[c] aby skopiować)</span>",
"Delete data": "Skasuj dane",
"Could not create paste: %s": "Nie udało się utworzyć wklejki: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nie udało się odszyfrować wklejki - brak klucza deszyfrującego w adresie (użyłeś skracacza linków, który ucina część adresu?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format", "Format": "Format",
"Plain Text": "Czysty tekst", "Plain Text": "Czysty tekst",
"Source Code": "Kod źródłowy", "Source Code": "Kod źródłowy",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", "alternatively drag & drop a file or paste an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka",
"File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.", "File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.",
"Remove attachment": "Usuń załącznik", "Remove attachment": "Usuń załącznik",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.",
"Invalid attachment.": "Nieprawidłowy załącznik.", "Invalid attachment.": "Nieprawidłowy załącznik.",
"Options": "Opcje", "Options": "Opcje",
"Shorten URL": "Skróć adres URL", "Shorten URL": "Skróć adres URL",
"Editor": "Edytować", "Editor": "Edytować",
"Preview": "Podgląd", "Preview": "Podgląd",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Odszyfruj", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"Enter password": "Wpisz hasło", "Decrypt":
"Odszyfruj",
"Enter password":
"Wpisz hasło",
"Loading…": "Wczytywanie…", "Loading…": "Wczytywanie…",
"Decrypting paste…": "Odszyfrowywanie wklejki…", "Decrypting paste…": "Odszyfrowywanie wklejki…",
"Preparing new paste…": "Przygotowywanie nowej wklejki…", "Preparing new paste…": "Przygotowywanie nowej wklejki…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "W przypadku gdy ten komunikat nigdy nie znika, proszę spójrz na <a href=\"%s\">to FAQ aby rozwiązać problem</a> (po angielsku).", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"W przypadku gdy ten komunikat nigdy nie znika, proszę spójrz na <a href=\"%s\">to FAQ aby rozwiązać problem</a> (po angielsku).",
"+++ no paste text +++": "+++ brak wklejonego tekstu +++", "+++ no paste text +++": "+++ brak wklejonego tekstu +++",
"Could not get paste data: %s": "Nie można było pobrać danych wklejki: %s", "Could not get paste data: %s":
"Nie można było pobrać danych wklejki: %s",
"QR code": "Kod QR", "QR code": "Kod QR",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados <i>no navegador</i> usando 256 bits AES. Mais informações na <a href=\"https://privatebin.info/\">página do projeto</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Porque a ignorância é uma benção", "%s é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados <i>no navegador</i> usando 256 bits AES. Mais informações na <a href=\"https://privatebin.info/\">página do projeto</a>.",
"Because ignorance is bliss":
"Porque a ignorância é uma benção",
"en": "pt", "en": "pt",
"Paste does not exist, has expired or has been deleted.": "A cópia não existe, expirou ou já foi excluída.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s requer php %s ou superior para funcionar. Desculpa.", "A cópia não existe, expirou ou já foi excluída.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Por favor espere %d segundos entre cada publicação.", "%s requer php %s ou superior para funcionar. Desculpa.",
"Paste is limited to %s of encrypted data.": "A cópia está limitada a %s de dados cifrados.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Dados inválidos.", "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.",
"You are unlucky. Try again.": "Você é azarado. Tente novamente", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Erro ao salvar comentário. Desculpa.", "Por favor espere %d segundos entre cada publicação.",
"Error saving paste. Sorry.": "Erro ao salvar cópia. Desculpa.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "ID de cópia inválido.", "A cópia está limitada a %s de dados cifrados.",
"Paste is not of burn-after-reading type.": "Cópia não é do tipo \"queime após ler\".", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Token de remoção inválido. A cópia não foi excluída.", "Dados inválidos.",
"Paste was properly deleted.": "A cópia foi devidamente excluída.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript é necessário para que %s funcione. Pedimos desculpas pela inconveniência.", "Você é azarado. Tente novamente",
"%s requires a modern browser to work.": "%s requer um navegador moderno para funcionar.", "Error saving comment. Sorry.":
"New": "Novo", "Erro ao salvar comentário. Desculpa.",
"Send": "Enviar", "Error saving paste. Sorry.":
"Clone": "Clonar", "Erro ao salvar cópia. Desculpa.",
"Raw text": "Texto sem formato", "Invalid paste ID.":
"Expires": "Expirar em", "ID de cópia inválido.",
"Burn after reading": "Queime após ler", "Paste is not of burn-after-reading type.":
"Open discussion": "Discussão aberta", "Cópia não é do tipo \"queime após ler\".",
"Password (recommended)": "Senha (recomendada)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Discussão", "Token de remoção inválido. A cópia não foi excluída.",
"Toggle navigation": "Mudar navegação", "Paste was properly deleted.":
"%d seconds": [ "A cópia foi devidamente excluída.",
"%d segundo", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d segundos", "JavaScript é necessário para que %s funcione.<br />Pedimos desculpas pela inconveniência.",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s requer um navegador moderno para funcionar.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Ainda usando Internet Explorer? Faça-se um favor, mude para um navegador moderno:",
"%d minuto", "New":
"%d minutos", "Novo",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "Enviar",
], "Clone":
"%d hours": [ "Clonar",
"%d hora", "Raw text":
"%d horas", "Texto sem formato",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "Expirar em",
], "Burn after reading":
"%d days": [ "Queime após ler",
"%d dia", "Open discussion":
"%d dias", "Discussão aberta",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "Senha (recomendada)",
], "Discussion":
"%d weeks": [ "Discussão",
"%d semana", "Toggle navigation":
"%d semanas", "Mudar navegação",
"%d weeks (2nd plural)", "%d seconds": ["%d segundo", "%d segundos"],
"%d weeks (3rd plural)" "%d minutes": ["%d minuto", "%d minutos"],
], "%d hours": ["%d hora", "%d horas"],
"%d months": [ "%d days": ["%d dia", "%d dias"],
"%d mês", "%d weeks": ["%d semana", "%d semanas"],
"%d meses", "%d months": ["%d mês", "%d meses"],
"%d months (2nd plural)", "%d years": ["%d ano", "%d anos"],
"%d months (3rd plural)" "Never":
], "Nunca",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d ano", "Nota: Este é um serviço de teste. Dados podem ser perdidos a qualquer momento. Gatinhos morrerão se você abusar desse serviço.",
"%d anos", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["Este documento irá expirar em um segundo.", "Este documento irá expirar em %d segundos."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Este documento irá expirar em um minuto.", "Este documento irá expirar em %d minutos."],
"Never": "Nunca", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota: Este é um serviço de teste. Dados podem ser perdidos a qualquer momento. Gatinhos morrerão se você abusar desse serviço.", ["Este documento irá expirar em uma hora.", "Este documento irá expirar em %d horas."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Este documento irá expirar em um segundo.", ["Este documento irá expirar em um dia.", "Este documento irá expirar em %d dias."],
"Este documento irá expirar em %d segundos.", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["Este documento irá expirar em um mês.", "Este documento irá expirar em %d meses."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Por favor, digite a senha para essa cópia:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Este documento irá expirar em um minuto.", "Não foi possível decifrar os dados (Chave errada?)",
"Este documento irá expirar em %d minutos.", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "Não foi possível excluir a cópia, ela não foi salva no modo de \"queime após ler\".",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "APENAS PARA SEUS OLHOS. Não feche essa janela, essa mensagem não pode ser exibida novamente.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Este documento irá expirar em uma hora.", "Não foi possível decifrar o comentário; Chave errada?",
"Este documento irá expirar em %d horas.", "Reply":
"This document will expire in %d hours (2nd plural)", "Responder",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Anônimo",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Este documento irá expirar em um dia.", "Avatar gerado à partir do endereço IP",
"Este documento irá expirar em %d dias.", "Add comment":
"This document will expire in %d days (2nd plural)", "Adicionar comentário",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Apelido opcional…",
"This document will expire in %d months.": [ "Post comment":
"Este documento irá expirar em um mês.", "Publicar comentário",
"Este documento irá expirar em %d meses.", "Sending comment…":
"This document will expire in %d months (2nd plural)", "Enviando comentário…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Comentário publicado.",
"Please enter the password for this paste:": "Por favor, digite a senha para essa cópia:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Não foi possível decifrar os dados (Chave errada?)", "Não foi possível atualizar a tela: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Não foi possível excluir a cópia, ela não foi salva no modo de \"queime após ler\".", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "APENAS PARA SEUS OLHOS. Não feche essa janela, essa mensagem não pode ser exibida novamente.", "Estado desconhecido",
"Could not decrypt comment; Wrong key?": "Não foi possível decifrar o comentário; Chave errada?", "server error or not responding":
"Reply": "Responder", "Servidor em erro ou não responsivo",
"Anonymous": "Anônimo", "Could not post comment: %s":
"Avatar generated from IP address": "Avatar gerado à partir do endereço IP", "Não foi possível publicar o comentário: %s",
"Add comment": "Adicionar comentário", "Sending paste…":
"Optional nickname…": "Apelido opcional…", "Enviando cópia…",
"Post comment": "Publicar comentário", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Enviando comentário…", "Sua cópia é <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pressione [Ctrl]+[c] para copiar)</span>",
"Comment posted.": "Comentário publicado.", "Delete data":
"Could not refresh display: %s": "Não foi possível atualizar a tela: %s", "Excluir dados",
"unknown status": "Estado desconhecido", "Could not create paste: %s":
"server error or not responding": "Servidor em erro ou não responsivo", "Não foi possível criar cópia: %s",
"Could not post comment: %s": "Não foi possível publicar o comentário: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Enviando cópia…", "Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Sua cópia é <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pressione [Ctrl]+[c] para copiar)</span>",
"Delete data": "Excluir dados",
"Could not create paste: %s": "Não foi possível criar cópia: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formato", "Format": "Formato",
"Plain Text": "Texto sem formato", "Plain Text": "Texto sem formato",
"Source Code": "Código fonte", "Source Code": "Código fonte",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Remover anexo", "Remove attachment": "Remover anexo",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.",
"Invalid attachment.": "Anexo inválido.", "Invalid attachment.": "Anexo inválido.",
"Options": "Opções", "Options": "Opções",
"Shorten URL": "Encurtar URL", "Shorten URL": "Encurtar URL",
"Editor": "Editor", "Editor": "Editor",
"Preview": "Visualizar", "Preview": "Visualizar",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requer que o PATH termine em \"%s\". Por favor, atualize o PATH em seu index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Decifrar", "%s requer que o PATH termine em \"%s\". Por favor, atualize o PATH em seu index.php.",
"Enter password": "Digite a senha", "Decrypt":
"Decifrar",
"Enter password":
"Digite a senha",
"Loading…": "Carregando…", "Loading…": "Carregando…",
"Decrypting paste…": "Decifrando cópia…", "Decrypting paste…": "Decifrando cópia…",
"Preparing new paste…": "Preparando nova cópia…", "Preparing new paste…": "Preparando nova cópia…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Caso essa mensagem nunca desapareça, por favor veja <a href=\"%s\">este FAQ para saber como resolver os problemas</a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Caso essa mensagem nunca desapareça, por favor veja <a href=\"%s\">este FAQ para saber como resolver os problemas</a>.",
"+++ no paste text +++": "+++ sem texto de cópia +++", "+++ no paste text +++": "+++ sem texto de cópia +++",
"Could not get paste data: %s": "Não foi possível obter dados de cópia: %s", "Could not get paste data: %s":
"QR code": "Código QR", "Could not get paste data: %s",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Esse site usa uma conexão HTTP insegura! Use-o apenas para testes.", "QR code": "QR code",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Para mais informações <a href=\"%s\">veja esse item do FAQ</a>.", "I love you too, bot…": "I love you too, bot…",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Seu navegador pode exigir uma conexão HTTPS para dar suporte à API WebCrypto. Tente <a href=\"%s\">mudar para HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Seu navagador não suporta WebAssembly, usado para compressão zlib. Você pode criar documentos não compactados, mas não pode lê-los.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"waiting on user to provide a password": "esperando que o usuário digite uma senha", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Não foi possível decifrar os dados. Você digitou a senha corretamente? Tente novamente com o botão ao topo.", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Retry": "Tentar Novamente", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Showing raw text…": "Mostrando texto bruto…", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Notice:": "Aviso:",
"This link will expire after %s.": "Esse link vai expirar após %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Esse link só pode ser acessado uma vez, não utilize o botão de voltar ou atualizar do seu navegador.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "O recipiente pode ter ciência de seu fuso horário, converter hora para UTC?",
"Use Current Timezone": "Usar Fuso Horário Atual",
"Convert To UTC": "Converter para UTC",
"Close": "Fechar",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,129 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются <i>в браузере</i> с использованием 256 битного шифрования AES. Подробнее можно узнать на <a href=\"https://privatebin.info/\">сайте проекта</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Потому что неведение - благо", "%s это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются <i>в браузере</i> с использованием 256 битного шифрования AES. Подробнее можно узнать на <a href=\"https://privatebin.info/\">сайте проекта</a>.",
"Because ignorance is bliss":
"Потому что неведение - благо",
"en": "ru", "en": "ru",
"Paste does not exist, has expired or has been deleted.": "Запись не существует, просрочена или была удалена.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "Для работы %s требуется php %s или выше. Извините.", "Запись не существует, просрочена или была удалена.",
"%s requires configuration section [%s] to be present in configuration file.": "%s необходимо наличие секции [%s] в конфигурационном файле.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Please wait %d seconds between each post.", "Для работы %s требуется php %s или выше. Извините.",
"Paste is limited to %s of encrypted data.": "Размер записи ограничен %s зашифрованных данных.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Неверные данные.", "%s необходимо наличие секции [%s] в конфигурационном файле.",
"You are unlucky. Try again.": "Вам не повезло. Попробуйте еще раз.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Ошибка при сохранении комментария. Извините.", ["Пожалуйста, ожидайте %d секунду между каждыми записями.", "Пожалуйста, ожидайте %d секунды между каждыми записями.", "Пожалуйста, ожидайте %d секунд между каждыми записями."],
"Error saving paste. Sorry.": "Ошибка при сохранении записи. Извините.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Неверный ID записи.", "Размер записи ограничен %s зашифрованных данных.",
"Paste is not of burn-after-reading type.": "Тип записи не \"Удалить после прочтения\".", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Неверный ключ удаления записи. Запись не удалена.", "Неверные данные.",
"Paste was properly deleted.": "Запись была успешно удалена.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Для работы %s требуется включенный JavaScript. Приносим извинения за неудобства.", "Вам не повезло. Попробуйте еще раз.",
"%s requires a modern browser to work.": "Для работы %s требуется более современный браузер.", "Error saving comment. Sorry.":
"New": "Новая запись", "Ошибка при сохранении комментария. Извините.",
"Send": "Отправить", "Error saving paste. Sorry.":
"Clone": "Дублировать", "Ошибка при сохранении записи. Извините.",
"Raw text": "Исходный текст", "Invalid paste ID.":
"Expires": "Удалить через", "Неверный ID записи.",
"Burn after reading": "Удалить после прочтения", "Paste is not of burn-after-reading type.":
"Open discussion": "Открыть обсуждение", "Тип записи не \"Удалить после прочтения\".",
"Password (recommended)": "Пароль (рекомендуется)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Обсуждение", "Неверный ключ удаления записи. Запись не удалена.",
"Toggle navigation": "Переключить навигацию", "Paste was properly deleted.":
"%d seconds": [ "Запись была успешно удалена.",
"%d секунду", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d секунды", "Для работы %s требуется включенный JavaScript.<br />Приносим извинения за неудобства.",
"%d секунд", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "Для работы %s требуется более современный браузер.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "До сих пор используете Internet Explorer? Пожалейте себя, перейдите на более современный браузер:",
"%d минуту", "New":
"%d минуты", "Новая запись",
"%d минут", "Send":
"%d minutes (3rd plural)" "Отправить",
], "Clone":
"%d hours": [ "Дублировать",
"%d час", "Raw text":
"%d часа", "Исходный текст",
"%d часов", "Expires":
"%d hours (3rd plural)" "Удалить через",
], "Burn after reading":
"%d days": [ "Удалить после прочтения",
"%d день", "Open discussion":
"%d дня", "Открыть обсуждение",
"%d дней", "Password (recommended)":
"%d days (3rd plural)" "Пароль (рекомендуется)",
], "Discussion":
"%d weeks": [ "Обсуждение",
"%d неделю", "Toggle navigation":
"%d недели", "Переключить навигацию",
"%d недель", "%d seconds": ["%d секунду", "%d секунды", "%d секунд"],
"%d weeks (3rd plural)" "%d minutes": ["%d минуту", "%d минуты", "%d минут"],
], "%d hours": ["%d час", "%d часа", "%d часов"],
"%d months": [ "%d days": ["%d день", "%d дня", "%d дней"],
"%d месяц", "%d weeks": ["%d неделю", "%d недели", "%d недель"],
"%d месяца", "%d months": ["%d месяц", "%d месяца", "%d месяцев"],
"%d месяцев", "%d years": ["%d год", "%d года", "%d лет"],
"%d months (3rd plural)" "Never":
], "Никогда",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d год", "Примечание: Этот сервис тестовый: Данные могут быть удалены в любое время. Котята умрут, если вы будете злоупотреблять серсисом.",
"%d года", "This document will expire in %d seconds.":
"%d лет", ["Документ будет удален через %d секунду.", "Документ будет удален через %d секунды.", "Документ будет удален через %d секунд."],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["Документ будет удален через %d минуту.", "Документ будет удален через %d минуты.", "Документ будет удален через %d минут."],
"Never": "Никогда", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Примечание: Этот сервис тестовый: Данные могут быть удалены в любое время. Котята умрут, если вы будете злоупотреблять серсисом.", ["Документ будет удален через %d час.", "Документ будет удален через %d часа.", "Документ будет удален через %d часов."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Документ будет удален через %d секунду.", ["Документ будет удален через %d день.", "Документ будет удален через %d дня.", "Документ будет удален через %d дней."],
"Документ будет удален через %d секунды.", "This document will expire in %d months.":
"Документ будет удален через %d секунд.", ["Документ будет удален через %d месяц.", "Документ будет удален через %d месяца.", "Документ будет удален через %d месяцев."],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "Пожалуйста, введите пароль от записи:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Документ будет удален через %d минуту.", "Невозможно расшифровать данные (Неверный ключ?)",
"Документ будет удален через %d минуты.", "Could not delete the paste, it was not stored in burn after reading mode.":
"Документ будет удален через %d минут.", "Невозможно удалить запись, она не была сохранена в режиме удаления после прочтения.",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "ТОЛЬКО ДЛЯ ВАШИХ ГЛАЗ. Не закрывайте это окно, это сообщение не может быть показано снова.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Документ будет удален через %d час.", "Невозможно расшифровать комментарий; Неверный ключ?",
"Документ будет удален через %d часа.", "Reply":
"Документ будет удален через %d часов.", "Ответить",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "Аноним",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Документ будет удален через %d день.", "Аватар, сгенерированный из IP-адреса",
"Документ будет удален через %d дня.", "Add comment":
"Документ будет удален через %d дней.", "Добавить комментарий",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "Опциональный никнейм…",
"This document will expire in %d months.": [ "Post comment":
"Документ будет удален через %d месяц.", "Отправить комментарий",
"Документ будет удален через %d месяца.", "Sending comment…":
"Документ будет удален через %d месяцев.", "Отправка комментария…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "Комментарий опубликован.",
"Please enter the password for this paste:": "Пожалуйста, введите пароль от записи:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Невозможно расшифровать данные (Неверный ключ?)", "Не удалось обновить отображение: %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Невозможно удалить запись, она не была сохранена в режиме удаления после прочтения.", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "ТОЛЬКО ДЛЯ ВАШИХ ГЛАЗ. Не закрывайте это окно, это сообщение не может быть показано снова.", "неизвестная причина",
"Could not decrypt comment; Wrong key?": "Невозможно расшифровать комментарий; Неверный ключ?", "server error or not responding":
"Reply": "Ответить", "ошибка сервера или нет ответа",
"Anonymous": "Аноним", "Could not post comment: %s":
"Avatar generated from IP address": "Аватар, сгенерированный из IP-адреса", "Не удалось опубликовать комментарий: %s",
"Add comment": "Добавить комментарий", "Sending paste…":
"Optional nickname…": "Опциональный никнейм…", "Отправка записи…",
"Post comment": "Отправить комментарий", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Отправка комментария…", "Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите [Ctrl]+[c], чтобы скопировать ссылку)</span>",
"Comment posted.": "Комментарий опубликован.", "Delete data":
"Could not refresh display: %s": "Не удалось обновить отображение: %s", "Удалить запись",
"unknown status": "неизвестная причина", "Could not create paste: %s":
"server error or not responding": "ошибка сервера или нет ответа", "Не удалось опубликовать запись: %s",
"Could not post comment: %s": "Не удалось опубликовать комментарий: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Отправка записи…", "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть, вы используете сокращатель ссылок, который удаляет часть ссылки?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите [Ctrl]+[c], чтобы скопировать ссылку)</span>",
"Delete data": "Удалить запись",
"Could not create paste: %s": "Не удалось опубликовать запись: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть, вы используете сокращатель ссылок, который удаляет часть ссылки?)",
"B": "байт", "B": "байт",
"KiB": "Кбайт", "KiB": "Кбайт",
"MiB": "Мбайт", "MiB": "Мбайт",
@@ -139,43 +137,39 @@
"Markdown": "Язык разметки", "Markdown": "Язык разметки",
"Download attachment": "Скачать прикрепленный файл", "Download attachment": "Скачать прикрепленный файл",
"Cloned: '%s'": "Дублировано: '%s'", "Cloned: '%s'": "Дублировано: '%s'",
"The cloned file '%s' was attached to this paste.": "Дубликат файла '%s' был прикреплен к этой записи.", "The cloned file '%s' was attached to this paste.":
"Дубликат файла '%s' был прикреплен к этой записи.",
"Attach a file": "Прикрепить файл", "Attach a file": "Прикрепить файл",
"alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", "alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера",
"File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста, скачайте прикрепленный файл.", "File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста, скачайте прикрепленный файл.",
"Remove attachment": "Удалить вложение", "Remove attachment": "Удалить вложение",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.",
"Invalid attachment.": "Неизвестное вложение.", "Invalid attachment.": "Неизвестное вложение.",
"Options": "Опции", "Options": "Опции",
"Shorten URL": "Короткая ссылка", "Shorten URL": "Короткая ссылка",
"Editor": "Редактор", "Editor": "Редактор",
"Preview": "Предпросмотр", "Preview": "Предпросмотр",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "Переменная PATH необходима %s в конце \"%s\". Пожалуйста, обновите переменную PATH в вашем index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Расшифровать", "Переменная PATH необходима %s в конце \"%s\". Пожалуйста, обновите переменную PATH в вашем index.php.",
"Enter password": "Введите пароль", "Decrypt":
"Расшифровать",
"Enter password":
"Введите пароль",
"Loading…": "Загрузка…", "Loading…": "Загрузка…",
"Decrypting paste…": "Расшифровка записи…", "Decrypting paste…": "Расшифровка записи…",
"Preparing new paste…": "Подготовка новой записи…", "Preparing new paste…": "Подготовка новой записи…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Если данное сообщение не исчезает длительное время, посмотрите <a href=\"%s\">этот FAQ с информацией о возможном решении проблемы (на английском)</a>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"Если данное сообщение не исчезает длительное время, посмотрите <a href=\"%s\">этот FAQ с информацией о возможном решении проблемы (на английском)</a>.",
"+++ no paste text +++": "+++ в записи нет текста +++", "+++ no paste text +++": "+++ в записи нет текста +++",
"Could not get paste data: %s": "Не удалось получить данные записи: %s", "Could not get paste data: %s":
"QR code": "QR код", "Не удалось получить данные записи: %s",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Данный сайт использует незащищенное HTTP подключение! Пожалуйста используйте его только для тестирования.", "QR code": "QR code",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Для продробностей <a href=\"%s\">прочтите информацию в FAQ</a>.", "I love you too, bot…": "I love you too, bot…",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Ваш браузер требует использования HTTPS подключения для поддержки WebCrypto API. Попробуйте <a href=\"%s\">переключиться на HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Ваш браузер не поддерживает WebAssembly используемый для сжатия с помощью zlib. Вы можете создавать новые записи без сжатия, но не сможете открыть записи с сжатием.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"waiting on user to provide a password": "ожидаем ввода пароля пользователем", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Не удалось расшифровать данные. Может быть вы ввели не верный пароль? Попробуйте снова с помощью кнопки вверху.", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Retry": "Повторить", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Showing raw text…": "Показываем исходный текст…", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Notice:": "Уведомление:",
"This link will expire after %s.": "Срок жизни ссылки истечет через %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Данная ссылка доступна только один раз, не нажимайте кнопку назад или обновления страницы в вашем браузере.",
"Link:": "Ссылка:",
"Recipient may become aware of your timezone, convert time to UTC?": "Получатель узнает ваш часовой пояс, сконвертировать время в UTC?",
"Use Current Timezone": "Использовать текущий часовой пояс",
"Convert To UTC": "Конвертировать в UTC",
"Close": "Закрыть",
"Encrypted note on PrivateBin": "Зашифрованная запиь на PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Посетите эту ссылку чтобы просмотреть запись. Передача ссылки кому либо позволит им получить доступ к записи тоже."
} }

View File

@@ -1,129 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s je minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani <i>v brskalniku</i> z uporabo 256 bitnega AES. Več informacij na <a href=\"https://privatebin.info/\">spletni strani projekta.</a>.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "Ker kar ne veš ne boli.", "%s je minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani <i>v brskalniku</i> z uporabo 256 bitnega AES. Več informacij na < href=\"https://privatebin.info/\">spletni strani projekta.</a>.",
"Because ignorance is bliss":
"Ker kar ne veš ne boli.",
"en": "sl", "en": "sl",
"Paste does not exist, has expired or has been deleted.": "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "Oprosti, %s za delovanje potrebuje vsaj php %s.", "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.",
"%s requires configuration section [%s] to be present in configuration file.": "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.", "Oprosti, %s za delovanje potrebuje vsaj php %s.",
"Paste is limited to %s of encrypted data.": "Velikost prilepka je omejena na %s zakodiranih podatkov.", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "Neveljavni podatki.", "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.",
"You are unlucky. Try again.": "Nimaš sreče, poskusi ponovno.", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "Nekaj je šlo narobe pri shranjevanju komentarja. Oprosti.", "Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.",
"Error saving paste. Sorry.": "Nekaj je šlo narobe pri shranjevanju prilepka. Oprosti.", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "Napačen ID prilepka.", "Velikost prilepka je omejena na %s zakodiranih podatkov.",
"Paste is not of burn-after-reading type.": "Prilepek ni tipa zažgi-po-branju.", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "Napačen token za izbris. Prilepek ni bil izbrisan..", "Neveljavni podatki.",
"Paste was properly deleted.": "Prilepek je uspešno izbrisan.", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Da %s deluje, moraš vklopiti JavaScript. Oprosti za povročene nevšečnosti.", "Nimaš sreče, poskusi ponovno.",
"%s requires a modern browser to work.": "%s za svoje delovanje potrebuje moderen brskalnik.", "Error saving comment. Sorry.":
"New": "Nov prilepek", "Nekaj je šlo narobe pri shranjevanju komentarja. Oprosti.",
"Send": "Pošlji", "Error saving paste. Sorry.":
"Clone": "Kloniraj", "Nekaj je šlo narobe pri shranjevanju prilepka. Oprosti.",
"Raw text": "Surov tekst", "Invalid paste ID.":
"Expires": "Poteče", "Napačen ID prilepka.",
"Burn after reading": "Zažgi (pobriši) po branju", "Paste is not of burn-after-reading type.":
"Open discussion": "Dovoli razpravo", "Prilepek ni tipa zažgi-po-branju.",
"Password (recommended)": "Geslo (priporočeno)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "Razprava", "Napačen token za izbris. Prilepek ni bil izbrisan..",
"Toggle navigation": "Preklopi navigacijo", "Paste was properly deleted.":
"%d seconds": [ "Prilepek je uspešno izbrisan.",
"%d sekunda", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d sekundi", "Da %s deluje, moraš vklopiti JavaScript.<br />Oprosti za povročene nevšečnosti.",
"%d sekunde", "%s requires a modern browser to work.":
"%d sekund" "%s za svoje delovanje potrebuje moderen brskalnik.",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "Še vedno uporabljaš Internet Explorer? Naredi si uslugo, preklopi na moderen brskalnik:",
"%d minuta", "New":
"%d minuti", "Nov prilepek",
"%d minute", "Send":
"%d minut" "Pošlji",
], "Clone":
"%d hours": [ "Kloniraj",
"%d ura", "Raw text":
"%d uri", "Surov tekst",
"%d ure", "Expires":
"%d ur" "Poteče",
], "Burn after reading":
"%d days": [ "Zažgi (pobriši) po branju",
"%d dan", "Open discussion":
"%d dneva", "Dovoli razpravo",
"%d dnevi", "Password (recommended)":
"%d dni" "Geslo (priporočeno)",
], "Discussion":
"%d weeks": [ "Razprava",
"%d teden", "Toggle navigation":
"%d tedna", "Preklopi navigacijo",
"%d tedni", "%d seconds": ["%d sekunda", "%d sekundi", "%d sekunde", "%d sekund"],
"%d tednov" "%d minutes": ["%d minuta", "%d minuti", "%d minute", "%d minut"],
], "%d hours": ["%d ura", "%d uri", "%d ure", "%d ur"],
"%d months": [ "%d days": ["%d dan", "%d dneva", "%d dnevi", "%d dni"],
"%d mesec", "%d weeks": ["%d teden", "%d tedna", "%d tedni", "%d tednov"],
"%d meseca", "%d months": ["%d mesec", "%d meseca", "%d meseci", "%d mesecev"],
"%d meseci", "%d years": ["%d leto", "%d leti", "%d leta", "%d let"],
"%d mesecev" "Never":
], "Nikoli",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d leto", "Ne pozabi: To je testna storitev: Podatki so lahko kadarkoli pobrisani. Mucki bodo umrli, če boš zlorabljala to storitev.",
"%d leti", "This document will expire in %d seconds.":
"%d leta", ["Ta dokument bo potekel čez %d sekundo.", "Ta dokument bo potekel čez %d sekundi.", "Ta dokument bo potekel čez %d sekunde.", "Ta dokument bo potekel čez %d sekund."],
"%d let" "This document will expire in %d minutes.":
], ["Ta dokument bo potekel čez %d minuto.", "Ta dokument bo potekel čez %d minuti.", "Ta dokument bo potekel čez %d minute.", "Ta dokument bo potekel čez %d minut."],
"Never": "Nikoli", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Ne pozabi: To je testna storitev: Podatki so lahko kadarkoli pobrisani. Mucki bodo umrli, če boš zlorabljala to storitev.", ["Ta dokument bo potekel čez %d uro.", "Ta dokument bo potekel čez %d uri.", "Ta dokument bo potekel čez %d ure.", "Ta dokument bo potekel čez %d ur."],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"Ta dokument bo potekel čez %d sekundo.", ["Ta dokument bo potekel čez %d dan.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni."],
"Ta dokument bo potekel čez %d sekundi.", "This document will expire in %d months.":
"Ta dokument bo potekel čez %d sekunde.", ["Ta dokument bo potekel čez %d mesec.", "Ta dokument bo potekel čez %d meseca.", "Ta dokument bo potekel čez %d mesece.", "Ta dokument bo potekel čez %d mesecev."],
"Ta dokument bo potekel čez %d sekund." "Please enter the password for this paste:":
], "Prosim vnesi geslo tega prilepka:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"Ta dokument bo potekel čez %d minuto.", "Nemogoče odkodirati podakte (Imaš napačen ključ?)",
"Ta dokument bo potekel čez %d minuti.", "Could not delete the paste, it was not stored in burn after reading mode.":
"Ta dokument bo potekel čez %d minute.", "Prilepek je nemogoče izbrisati, ni bil shranjen v načinu \"zažgi po branju\".",
"Ta dokument bo potekel čez %d minut." "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "SAMO ZA TVOJE OČI. Ne zapri tega okna (zavihka), to sporočilo ne bo prikazano nikoli več.",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"Ta dokument bo potekel čez %d uro.", "Ne morem odkodirati komentarja: Imaš napačen ključ?",
"Ta dokument bo potekel čez %d uri.", "Reply":
"Ta dokument bo potekel čez %d ure.", "Odgovori",
"Ta dokument bo potekel čez %d ur." "Anonymous":
], "Aninomno",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"Ta dokument bo potekel čez %d dan.", "Anonimen avatar (Vizhash IP naslova)",
"Ta dokument bo potekel čez %d dni.", "Add comment":
"Ta dokument bo potekel čez %d dni.", "Dodaj komentar",
"Ta dokument bo potekel čez %d dni." "Optional nickname…":
], "Uporabniško ime (lahko izpustiš)",
"This document will expire in %d months.": [ "Post comment":
"Ta dokument bo potekel čez %d mesec.", "Objavi komentar",
"Ta dokument bo potekel čez %d meseca.", "Sending comment…":
"Ta dokument bo potekel čez %d mesece.", "Pošiljam komentar …",
"Ta dokument bo potekel čez %d mesecev." "Comment posted.":
], "Komentar poslan.",
"Please enter the password for this paste:": "Prosim vnesi geslo tega prilepka:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "Nemogoče odkodirati podakte (Imaš napačen ključ?)", "Ne morem osvežiti zaslona : %s",
"Could not delete the paste, it was not stored in burn after reading mode.": "Prilepek je nemogoče izbrisati, ni bil shranjen v načinu \"zažgi po branju\".", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "SAMO ZA TVOJE OČI. Ne zapri tega okna (zavihka), to sporočilo ne bo prikazano nikoli več.", "neznan status",
"Could not decrypt comment; Wrong key?": "Ne morem odkodirati komentarja: Imaš napačen ključ?", "server error or not responding":
"Reply": "Odgovori", "napaka na strežniku, ali pa se strežnik ne odziva",
"Anonymous": "Aninomno", "Could not post comment: %s":
"Avatar generated from IP address": "Anonimen avatar (Vizhash IP naslova)", "Komentarja ni bilo mogoče objaviti : %s",
"Add comment": "Dodaj komentar", "Sending paste…":
"Optional nickname…": "Uporabniško ime (lahko izpustiš)", "Pošiljam prilepek…",
"Post comment": "Objavi komentar", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "Pošiljam komentar …", "Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)</span>",
"Comment posted.": "Komentar poslan.", "Delete data":
"Could not refresh display: %s": "Ne morem osvežiti zaslona : %s", "Izbriši podatke",
"unknown status": "neznan status", "Could not create paste: %s":
"server error or not responding": "napaka na strežniku, ali pa se strežnik ne odziva", "Ne morem ustvariti prilepka: %s",
"Could not post comment: %s": "Komentarja ni bilo mogoče objaviti : %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "Pošiljam prilepek…", "Ne morem odkodirati prilepka: V URL-ju manjka ključ (A si uporabil krajšalnik URL-jev, ki odstrani del URL-ja?)",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)</span>",
"Delete data": "Izbriši podatke",
"Could not create paste: %s": "Ne morem ustvariti prilepka: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ne morem odkodirati prilepka: V URL-ju manjka ključ (A si uporabil krajšalnik URL-jev, ki odstrani del URL-ja?)",
"B": "o", "B": "o",
"KiB": "KB", "KiB": "KB",
"MiB": "MB", "MiB": "MB",
@@ -144,38 +142,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
"Remove attachment": "Odstrani priponko", "Remove attachment": "Odstrani priponko",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.",
"Invalid attachment.": "Neveljavna priponka.", "Invalid attachment.": "Neveljavna priponka.",
"Options": "Možnosti", "Options": "Možnosti",
"Shorten URL": "Skrajšajte URL", "Shorten URL": "Skrajšajte URL",
"Editor": "Uredi", "Editor": "Uredi",
"Preview": "Predogled", "Preview": "Predogled",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "Decrypt", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"Enter password": "Prosim vnesi geslo", "Decrypt":
"Decrypt",
"Enter password":
"Prosim vnesi geslo",
"Loading…": "Loading…", "Loading…": "Loading…",
"Decrypting paste…": "Decrypting paste…", "Decrypting paste…": "Decrypting paste…",
"Preparing new paste…": "Preparing new paste…", "Preparing new paste…": "Preparing new paste…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a> (in English).", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a> (in English).",
"+++ no paste text +++": "+++ no paste text +++", "+++ no paste text +++": "+++ no paste text +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s":
"Could not get paste data: %s",
"QR code": "QR code", "QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "waiting on user to provide a password", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "Retry", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
} }

View File

@@ -1,181 +0,0 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s це мінімалістичний Open Source проєкт для створення нотаток, де сервер не знає нічого про дані, що зберігаються. Дані шифруються/розшифровуються <i>у переглядачі</i> з використанням 256-бітного шифрувания AES. Подробиці можна дізнатися на <a href=\"https://privatebin.info/\">сайті проєкту</a>.",
"Because ignorance is bliss": "Бо незнання - благо",
"en": "uk",
"Paste does not exist, has expired or has been deleted.": "Допис не існує, протермінований чи був видалений.",
"%s requires php %s or above to work. Sorry.": "Для роботи %s потрібен php %s и вище. Вибачте.",
"%s requires configuration section [%s] to be present in configuration file.": "%s потрібна секція [%s] в конфігураційному файлі.",
"Please wait %d seconds between each post.": "Please wait %d seconds between each post.",
"Paste is limited to %s of encrypted data.": "Розмір допису обмежений %s зашифрованих даних.",
"Invalid data.": "Неправильні дані.",
"You are unlucky. Try again.": "Вам не пощастило. Спробуйте ще раз.",
"Error saving comment. Sorry.": "Помилка при збереженні коментаря. Вибачте.",
"Error saving paste. Sorry.": "Помилка при збереженні допису. Вибачте.",
"Invalid paste ID.": "Неправильний ID допису.",
"Paste is not of burn-after-reading type.": "Тип допису не \"Знищити після прочитання\".",
"Wrong deletion token. Paste was not deleted.": "Неправильний ключ вилучення допису. Допис не вилучено.",
"Paste was properly deleted.": "Допис був вилучений повністю.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Для роботи %s потрібен увімкнутий JavaScript. Вибачте.",
"%s requires a modern browser to work.": "Для роботи %s потрібен більш сучасний переглядач.",
"New": "Новий допис",
"Send": "Відправити",
"Clone": "Дублювати",
"Raw text": "Початковий текст",
"Expires": "Вилучити через",
"Burn after reading": "Знищити після прочитання",
"Open discussion": "Відкрити обговорення",
"Password (recommended)": "Пароль (рекомендується)",
"Discussion": "Обговорення",
"Toggle navigation": "Перемкнути навігацію",
"%d seconds": [
"%d секунду",
"%d секунди",
"%d секунд",
"%d seconds (3rd plural)"
],
"%d minutes": [
"%d хвилину",
"%d хвилини",
"%d хвилин",
"%d minutes (3rd plural)"
],
"%d hours": [
"%d годину",
"%d години",
"%d годин",
"%d hours (3rd plural)"
],
"%d days": [
"%d день",
"%d дні",
"%d днів",
"%d days (3rd plural)"
],
"%d weeks": [
"%d тиждень",
"%d тижні",
"%d тижнів",
"%d weeks (3rd plural)"
],
"%d months": [
"%d місяць",
"%d місяці",
"%d місяців",
"%d months (3rd plural)"
],
"%d years": [
"%d рік",
"%d роки",
"%d років",
"%d years (3rd plural)"
],
"Never": "Ніколи",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Примітка: Це тестовий сервіс: Дані можуть бути вилучені в будь який момент. Кошенята помруть, якщо ви будете зловживати сервісом.",
"This document will expire in %d seconds.": [
"Документ буде вилучений через %d секунду.",
"Документ буде вилучений через %d секунди.",
"Документ буде вилучений через %d секунд.",
"This document will expire in %d seconds (3rd plural)"
],
"This document will expire in %d minutes.": [
"Документ буде вилучений через %d хвилину.",
"Документ буде вилучений через %d хвилини.",
"Документ буде вилучений через %d хвилин.",
"This document will expire in %d minutes (3rd plural)"
],
"This document will expire in %d hours.": [
"Документ буде вилучений через %d годину.",
"Документ буде вилучений через %d години.",
"Документ буде вилучений через %d годин.",
"This document will expire in %d hours (3rd plural)"
],
"This document will expire in %d days.": [
"Документ буде вилучений через %d день.",
"Документ буде вилучений через %d дні.",
"Документ буде вилучений через %d днів.",
"This document will expire in %d days (3rd plural)"
],
"This document will expire in %d months.": [
"Документ буде вилучений через %d місяць.",
"Документ буде вилучений через %d місяці.",
"Документ буде вилучений через %d місяців.",
"This document will expire in %d months (3rd plural)"
],
"Please enter the password for this paste:": "Будь ласка, введіть пароль від допису:",
"Could not decrypt data (Wrong key?)": "Неможливо розшифрувати дані (Неправильний ключ?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Неможливо вилучити допис, він не був збережений в режимі знищити після прочитання.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "ЛИШЕ ДЛЯ ВАШИХ ОЧЕЙ. Не закривайте це вікно, це повідомлення не може бути показано знову.",
"Could not decrypt comment; Wrong key?": "Неможливо розшифрувати коментар; Неправильний ключ?",
"Reply": "Відповісти",
"Anonymous": "Анонім",
"Avatar generated from IP address": "Аватар зґенерований з IP-адреси",
"Add comment": "Додати коментар",
"Optional nickname…": "Необов’язкове прізвисько…",
"Post comment": "Відправити коментар",
"Sending comment…": "Відправка коментаря…",
"Comment posted.": "Коментар опублікований.",
"Could not refresh display: %s": "Не вдалося оновити екран: %s",
"unknown status": "невідома причина",
"server error or not responding": "помилка на сервері чи немає відповіді",
"Could not post comment: %s": "Не вдалося опублікувати коментар: %s",
"Sending paste…": "Відправка допису…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Посилання на допис <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Тисніть [Ctrl]+[c], щоб скопіювати посилання)</span>",
"Delete data": "Видалити допис",
"Could not create paste: %s": "Не вдалося опублікувати допис: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Неможливо розшифрувати запис: Ключ дешифрування відсутній в посиланні (Можливо, ви використовуєте скорочувач посилань, що видаляє частину посилання?)",
"B": "байт",
"KiB": "Кбайт",
"MiB": "Мбайт",
"GiB": "Гбайт",
"TiB": "Тбайт",
"PiB": "Пбайт",
"EiB": "Ебайт",
"ZiB": "Збайт",
"YiB": "Йбайт",
"Format": "Формат",
"Plain Text": "Звичайний текст",
"Source Code": "Джерельний код",
"Markdown": "Мова розмітки",
"Download attachment": "Звантажити прикріплений файл",
"Cloned: '%s'": "Дубльовано: '%s'",
"The cloned file '%s' was attached to this paste.": "Дублікат файлу '%s' був прикріплений до цього запису.",
"Attach a file": "Прикріпити файл",
"alternatively drag & drop a file or paste an image from the clipboard": "також можна перенести файл у вікно переглядача чи вставити зображення з буфера",
"File too large, to display a preview. Please download the attachment.": "Файл завеликий для відображення передогляду. Будь ласка, звантажте прикріплений файл.",
"Remove attachment": "Видалити вкладення",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш переглядач не підтримує відправлення зашифрованих файлів. Використовуйте сучасніший переглядач.",
"Invalid attachment.": "Невідоме вкладення.",
"Options": "Опції",
"Shorten URL": "Коротке посилання",
"Editor": "Редактор",
"Preview": "Передогляд",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "Змінна PATH необхідна %s в конці \"%s\". Будь ласка, оновіть змінну PATH у вашому index.php.",
"Decrypt": "Розшифрувати",
"Enter password": "Введіть пароль",
"Loading…": "Завантаження…",
"Decrypting paste…": "Розшифровування допису…",
"Preparing new paste…": "Приготування нового допису…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Якщо це повідомлення не зникатиме тривалий час, подивіться <a href=\"%s\">цей FAQ з інформацією про можливе вирішення проблеми</a>.",
"+++ no paste text +++": "+++ у дописі немає тексту +++",
"Could not get paste data: %s": "Не вдалося отримати дані допису: %s",
"QR code": "QR код",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Цей сайт використовує незахищене HTTP підключення! Будь ласка, використовуйте його лише для тестування.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Для подробиць <a href=\"%s\">дивіться інформацію в FAQ</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Ваш переглядач вимагає підключення HTTPS для підтримки WebCrypto API. Спробуйте <a href=\"%s\">перемкнутися на HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Ваш переглядач не підтримує WebAssembly, що використовується для стиснення zlib. Ви можете створювати нестиснені документи, але не зможете читати стиснені.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.",
"Retry": "Retry",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too."
}

View File

@@ -1,138 +1,127 @@
{ {
"PrivateBin": "PrivateBin", "PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.": "%s是一个极简、开源、对粘贴内容毫不知情的在线粘贴板数据<i>在浏览器内</i>进行AES-256加密。更多信息请查看<a href=\"https://privatebin.info/\">项目主页</a>。", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
"Because ignorance is bliss": "因为无知是福", "%s是一个极简、开源、对粘贴内容毫不知情的在线粘贴板数据<i>在浏览器内</i>进行AES-256加密。更多信息请查看<a href=\"https://privatebin.info/\">项目主页</a>。",
"Because ignorance is bliss":
"因为无知是福",
"en": "zh", "en": "zh",
"Paste does not exist, has expired or has been deleted.": "粘贴内容不存在,已过期或已被删除。", "Paste does not exist, has expired or has been deleted.":
"%s requires php %s or above to work. Sorry.": "%s需要PHP %s及以上版本来工作抱歉。", "粘贴内容不存在,已过期或已被删除。",
"%s requires configuration section [%s] to be present in configuration file.": "%s需要设置配置文件中 [%s] 部分。", "%s requires php %s or above to work. Sorry.":
"Please wait %d seconds between each post.": "每 %d 秒只能粘贴一次。", "%s需要PHP %s及以上版本来工作抱歉。",
"Paste is limited to %s of encrypted data.": "粘贴受限于 %s 加密数据。", "%s requires configuration section [%s] to be present in configuration file.":
"Invalid data.": "无效的数据。", "%s需要设置配置文件中 [%s] 部分。",
"You are unlucky. Try again.": "请再试一次。", "Please wait %d seconds between each post.":
"Error saving comment. Sorry.": "保存评论时出现错误,抱歉。", "每 %d 秒只能粘贴一次。",
"Error saving paste. Sorry.": "保存粘贴内容时出现错误,抱歉。", "Paste is limited to %s of encrypted data.":
"Invalid paste ID.": "无效的ID。", "粘贴受限于 %s 加密数据。",
"Paste is not of burn-after-reading type.": "粘贴内容不是阅后即焚类型。", "Invalid data.":
"Wrong deletion token. Paste was not deleted.": "错误的删除token粘贴内容没有被删除。", "无效的数据。",
"Paste was properly deleted.": "粘贴内容已被正确删除。", "You are unlucky. Try again.":
"JavaScript is required for %s to work. Sorry for the inconvenience.": "%s需要JavaScript来进行加解密。 给你带来的不便敬请谅解。", "请再试一次。",
"%s requires a modern browser to work.": "%s需要在现代浏览器上工作。", "Error saving comment. Sorry.":
"New": "新建", "保存评论时出现错误,抱歉。",
"Send": "送出", "Error saving paste. Sorry.":
"Clone": "复制", "保存粘贴内容时出现错误,抱歉。",
"Raw text": "纯文本", "Invalid paste ID.":
"Expires": "有效期", "无效的ID。",
"Burn after reading": "阅后即焚", "Paste is not of burn-after-reading type.":
"Open discussion": "开放讨论", "粘贴内容不是阅后即焚类型。",
"Password (recommended)": "密码(推荐)", "Wrong deletion token. Paste was not deleted.":
"Discussion": "讨论", "错误的删除token粘贴内容没有被删除。",
"Toggle navigation": "切换导航栏", "Paste was properly deleted.":
"%d seconds": [ "粘贴内容已被正确删除。",
"%d 秒", "JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
"%d 秒", "%s需要JavaScript来进行加解密。<br />给你带来的不便敬请谅解。",
"%d seconds (2nd plural)", "%s requires a modern browser to work.":
"%d seconds (3rd plural)" "%s需要在现代浏览器上工作。",
], "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
"%d minutes": [ "还在使用Internet Explorer对自己好点换一个现代浏览器",
"%d 分钟", "New":
"%d 分钟", "新建",
"%d minutes (2nd plural)", "Send":
"%d minutes (3rd plural)" "送出",
], "Clone":
"%d hours": [ "复制",
"%d 小时", "Raw text":
"%d 小时", "纯文本",
"%d hours (2nd plural)", "Expires":
"%d hours (3rd plural)" "有效期",
], "Burn after reading":
"%d days": [ "阅后即焚",
"%d 天", "Open discussion":
"%d 天", "开放讨论",
"%d days (2nd plural)", "Password (recommended)":
"%d days (3rd plural)" "密码(推荐)",
], "Discussion":
"%d weeks": [ "讨论",
"%d 周", "Toggle navigation":
"%d 周", "切换导航栏",
"%d weeks (2nd plural)", "%d seconds": ["%d 秒", "%d 秒"],
"%d weeks (3rd plural)" "%d minutes": ["%d 分钟", "%d 分钟"],
], "%d hours": ["%d 小时", "%d 小时"],
"%d months": [ "%d days": ["%d 天", "%d 天"],
"%d 个月", "%d weeks": ["%d 周", "%d 周"],
"%d 个月", "%d months": ["%d 个月", "%d 个月"],
"%d months (2nd plural)", "%d years": ["%d 年", "%d 年"],
"%d months (3rd plural)" "Never":
], "永不过期",
"%d years": [ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
"%d 年", "注意:这是一个测试服务,数据随时可能被删除。如果你滥用这个服务的话,小猫咪会死的。",
"%d 年", "This document will expire in %d seconds.":
"%d years (2nd plural)", ["这份文档将在一秒后过期。", "这份文档将在 %d 秒后过期"],
"%d years (3rd plural)" "This document will expire in %d minutes.":
], ["这份文档将在一分钟后过期。", "这份文档将在 %d 分钟后过期。"],
"Never": "永不过期", "This document will expire in %d hours.":
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "注意:这是一个测试服务,数据随时可能被删除。如果你滥用这个服务的话,小猫咪会死的。", ["这份文档将在一小时后过期。", "这份文档将在 %d 小时后过期。"],
"This document will expire in %d seconds.": [ "This document will expire in %d days.":
"这份文档将在一后过期。", ["这份文档将在一天后过期。", "这份文档将在 %d 天后过期。"],
"这份文档将在 %d 秒后过期", "This document will expire in %d months.":
"This document will expire in %d seconds (2nd plural)", ["这份文档将在一个月后过期。", "这份文档将在 %d 个月后过期。"],
"This document will expire in %d seconds (3rd plural)" "Please enter the password for this paste:":
], "请输入这份粘贴内容的密码:",
"This document will expire in %d minutes.": [ "Could not decrypt data (Wrong key?)":
"这份文档将在一分钟后过期。", "无法解密数据(密钥错误?)",
"这份文档将在 %d 分钟后过期。", "Could not delete the paste, it was not stored in burn after reading mode.":
"This document will expire in %d minutes (2nd plural)", "无法删除此粘贴内容,它没有以阅后即焚模式保存。",
"This document will expire in %d minutes (3rd plural)" "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
], "看!仔!细!了!不要关闭窗口,否则你再也见不到这条消息了。",
"This document will expire in %d hours.": [ "Could not decrypt comment; Wrong key?":
"这份文档将在一小时后过期。", "无法解密评论; 密钥错误?",
"这份文档将在 %d 小时后过期。", "Reply":
"This document will expire in %d hours (2nd plural)", "回复",
"This document will expire in %d hours (3rd plural)" "Anonymous":
], "匿名",
"This document will expire in %d days.": [ "Avatar generated from IP address":
"这份文档将在一天后过期。", "由IP生成的头像",
"这份文档将在 %d 天后过期。", "Add comment":
"This document will expire in %d days (2nd plural)", "添加评论",
"This document will expire in %d days (3rd plural)" "Optional nickname…":
], "可选昵称…",
"This document will expire in %d months.": [ "Post comment":
"这份文档将在一个月后过期。", "评论",
"这份文档将在 %d 个月后过期。", "Sending comment…":
"This document will expire in %d months (2nd plural)", "评论发送中…",
"This document will expire in %d months (3rd plural)" "Comment posted.":
], "评论已发送。",
"Please enter the password for this paste:": "请输入这份粘贴内容的密码:", "Could not refresh display: %s":
"Could not decrypt data (Wrong key?)": "无法解密数据(密钥错误?)", "无法刷新显示:%s",
"Could not delete the paste, it was not stored in burn after reading mode.": "无法删除此粘贴内容,它没有以阅后即焚模式保存。", "unknown status":
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "看!仔!细!了!不要关闭窗口,否则你再也见不到这条消息了。", "未知状态",
"Could not decrypt comment; Wrong key?": "无法解密评论; 密钥错误?", "server error or not responding":
"Reply": "回复", "服务器错误或无回应",
"Anonymous": "匿名", "Could not post comment: %s":
"Avatar generated from IP address": "由IP生成的头像", "无法发送评论: %s",
"Add comment": "添加评论", "Sending paste…":
"Optional nickname…": "可选昵称…", "粘贴内容提交中…",
"Post comment": "评论", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
"Sending comment…": "评论发送中…", "您粘贴内容的链接是<a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 [Ctrl]+[c] 以复制)</span>",
"Comment posted.": "评论已发送。", "Delete data":
"Could not refresh display: %s": "无法刷新显示:%s", "删除数据",
"unknown status": "未知状态", "Could not create paste: %s":
"server error or not responding": "服务器错误或无回应", "无法创建粘贴:%s",
"Could not post comment: %s": "无法发送评论: %s", "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
"Sending paste…": "粘贴内容提交中…", "无法解密粘贴URL中缺失解密密钥是否使用了重定向或者短链接导致密钥丢失",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "您粘贴内容的链接是<a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 [Ctrl]+[c] 以复制)</span>",
"Delete data": "删除数据",
"Could not create paste: %s": "无法创建粘贴:%s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "无法解密粘贴URL中缺失解密密钥是否使用了重定向或者短链接导致密钥丢失",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "格式", "Format": "格式",
"Plain Text": "纯文本", "Plain Text": "纯文本",
"Source Code": "源代码", "Source Code": "源代码",
@@ -144,38 +133,33 @@
"alternatively drag & drop a file or paste an image from the clipboard": "拖放文件或从剪贴板粘贴图片", "alternatively drag & drop a file or paste an image from the clipboard": "拖放文件或从剪贴板粘贴图片",
"File too large, to display a preview. Please download the attachment.": "文件过大。要显示预览,请下载附件。", "File too large, to display a preview. Please download the attachment.": "文件过大。要显示预览,请下载附件。",
"Remove attachment": "移除附件", "Remove attachment": "移除附件",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "您的浏览器不支持上传加密的文件,请使用更新的浏览器。", "Your browser does not support uploading encrypted files. Please use a newer browser.":
"您的浏览器不支持上传加密的文件,请使用更新的浏览器。",
"Invalid attachment.": "无效的附件", "Invalid attachment.": "无效的附件",
"Options": "选项", "Options": "选项",
"Shorten URL": "缩短链接", "Shorten URL": "缩短链接",
"Editor": "编辑", "Editor": "编辑",
"Preview": "预览", "Preview": "预览",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s 的 PATH 变量必须结束于 \"%s\"。 请修改你的 index.php 中的 PATH 变量。", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
"Decrypt": "解密", "%s 的 PATH 变量必须结束于 \"%s\"。 请修改你的 index.php 中的 PATH 变量。",
"Enter password": "输入密码", "Decrypt":
"解密",
"Enter password":
"输入密码",
"Loading…": "载入中…", "Loading…": "载入中…",
"Decrypting paste…": "正在解密", "Decrypting paste…": "正在解密",
"Preparing new paste…": "正在准备新的粘贴内容", "Preparing new paste…": "正在准备新的粘贴内容",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "如果这个消息一直存在,请参考 <a href=\"%s\">这里的 FAQ (英文版)</a>进行故障排除。", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.":
"如果这个消息一直存在,请参考 <a href=\"%s\">这里的 FAQ (英文版)</a>进行故障排除。",
"+++ no paste text +++": "+++ 没有粘贴内容 +++", "+++ no paste text +++": "+++ 没有粘贴内容 +++",
"Could not get paste data: %s": "无法获取粘贴数据:%s", "Could not get paste data: %s":
"无法获取粘贴数据:%s",
"QR code": "二维码", "QR code": "二维码",
"This website is using an insecure HTTP connection! Please use it only for testing.": "该网站使用了不安全的HTTP连接 请仅将其用于测试。", "I love you too, bot…": "I love you too, bot…",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "有关更多信息,<a href=\"%s\">请参阅此常见问题解答</a>。", "This website is using an insecure HTTP connection! Please use it only for testing.":
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "您的浏览器可能需要HTTPS连接才能支持WebCrypto API。 尝试<a href=\"%s\">切换到HTTPS </a>。", "This website is using an insecure HTTP connection! Please use it only for testing.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "您的浏览器不支持用于zlib压缩的WebAssembly。 您可以创建未压缩的文档,但不能读取压缩的文档。", "For more information <a href=\"%s\">see this FAQ entry</a>.":
"waiting on user to provide a password": "请输入密码", "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "无法解密数据。 您输入了错误的密码吗? 点顶部的按钮重试。", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.":
"Retry": "重试", "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>."
"Showing raw text…": "显示原始文字…",
"Notice:": "注意:",
"This link will expire after %s.": "这个链接将会在 %s 过期。",
"This link can only be accessed once, do not use back or refresh button in your browser.": "这个链接只能被访问一次,请勿使用浏览器中的返回和刷新按钮。",
"Link:": "链接地址:",
"Recipient may become aware of your timezone, convert time to UTC?": "收件人可能会知道您的时区将时间转换为UTC",
"Use Current Timezone": "使用当前时区",
"Convert To UTC": "转换为UTC",
"Close": "关闭",
"Encrypted note on PrivateBin": "PrivateBin上的加密笔记",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "访问这个链接来查看该笔记。 将这个URL发送给任何人即可允许其访问该笔记。"
} }

View File

@@ -1,90 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 490.1 105.6" style="enable-background:new 0 0 490.1 105.6;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F4B960;}
.st1{fill:#E66F32;}
.st2{fill:#E43C41;}
.st3{fill:#BDD041;}
.st4{fill:#6DB54C;}
.st5{fill:#AEDAE6;}
.st6{fill:#56B8DE;}
.st7{fill:#00B1D5;}
.st8{fill:url(#SVGID_1_);}
.st9{fill:#221F1F;}
.st10{fill:#FFFFFF;}
.st11{fill:#000111;}
</style>
<title>Browserstack-logo-white</title>
<circle class="st0" cx="52.8" cy="52.8" r="52.8"/>
<circle class="st1" cx="47.5" cy="47.5" r="47.5"/>
<circle class="st2" cx="53.8" cy="41.1" r="41.1"/>
<circle class="st3" cx="57.1" cy="44.4" r="37.8"/>
<circle class="st4" cx="54.3" cy="47.2" r="35.1"/>
<circle class="st5" cx="48.8" cy="41.7" r="29.5"/>
<circle class="st6" cx="53.6" cy="36.8" r="24.7"/>
<circle class="st7" cx="56.6" cy="39.9" r="21.7"/>
<radialGradient id="SVGID_1_" cx="53.45" cy="63.02" r="18.57" gradientTransform="matrix(1 0 0 -1 0 106)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#797979"/>
<stop offset="1" style="stop-color:#4C4C4C"/>
</radialGradient>
<circle class="st8" cx="53.5" cy="43" r="18.6"/>
<circle class="st9" cx="53.5" cy="43" r="18.6"/>
<ellipse transform="matrix(0.4094 -0.9123 0.9123 0.4094 2.8913 76.9251)" class="st10" cx="60.9" cy="36.2" rx="5.7" ry="3.7"/>
<path class="st11" d="M122.5,32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h16.6c9.5,0,13.9,4.4,13.9,11c0.2,3.7-1.8,7.2-5.2,8.8v0.1
c3.7,1.5,6.1,5.2,6,9.3c0,8.2-5.6,12.2-15.4,12.2h-16c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1L122.5,32.6L122.5,32.6z M139.6,49.1
c3.9,0,6.4-2.2,6.4-5.4s-2.4-5.5-6.4-5.5h-8.9c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.2c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0
H139.6L139.6,49.1z M130.6,66.9h9.3c4.3,0,6.8-2.3,6.8-5.8s-2.4-5.7-6.7-5.7h-9.3c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.7
C130.3,66.8,130.4,66.9,130.6,66.9C130.6,66.9,130.6,66.9,130.6,66.9L130.6,66.9z"/>
<path class="st11" d="M159.9,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
H159.9L159.9,73.3z"/>
<path class="st11" d="M182.9,65.8c-0.8-2.3-1.1-4.8-1.1-7.2c-0.1-2.5,0.3-4.9,1.1-7.2c1.8-5.1,6.6-8.1,13.1-8.1s11.2,3,13,8.1
c0.8,2.3,1.1,4.8,1.1,7.2c0.1,2.5-0.3,4.9-1.1,7.2c-1.8,5.1-6.6,8.1-13,8.1S184.7,71,182.9,65.8z M201.9,64c0.5-1.7,0.8-3.6,0.7-5.4
c0.1-1.8-0.1-3.7-0.7-5.4c-0.9-2.5-3.3-4-5.9-3.8c-2.6-0.2-5.1,1.4-6,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.4
c0.9,2.5,3.4,4,6,3.8C198.6,68,201,66.5,201.9,64L201.9,64z"/>
<path class="st11" d="M241.9,73.3c-0.4,0-0.7-0.3-0.8-0.6L235,53.9h-0.1l-6.2,18.7c-0.1,0.4-0.4,0.6-0.8,0.6h-5.4
c-0.4,0-0.7-0.3-0.8-0.6l-10-28.1c-0.1-0.2,0-0.5,0.2-0.6c0.1,0,0.2-0.1,0.3,0h6.3c0.4,0,0.8,0.2,0.9,0.6l6.1,19.3h0.1l6-19.3
c0.1-0.4,0.5-0.6,0.9-0.6h4.7c0.4,0,0.7,0.2,0.9,0.6l6.4,19.3h0.1l5.8-19.3c0.1-0.4,0.5-0.7,0.9-0.6h6.3c0.2-0.1,0.5,0.1,0.5,0.3
c0,0.1,0,0.2,0,0.3l-10,28.1c-0.1,0.4-0.4,0.6-0.8,0.6L241.9,73.3L241.9,73.3z"/>
<path class="st11" d="M259.3,69.3c-0.2-0.2-0.3-0.6-0.1-0.8c0,0,0,0,0.1-0.1l3.7-3.6c0.3-0.2,0.7-0.2,0.9,0c2.6,2.1,5.9,3.3,9.3,3.3
c3.9,0,5.9-1.5,5.9-3.5c0-1.8-1.1-2.9-5.2-3.2l-3.4-0.3c-6.4-0.6-9.7-3.6-9.7-8.6c0-5.7,4.4-9.2,12.3-9.2c4.2-0.1,8.4,1.2,11.9,3.6
c0.3,0.2,0.3,0.5,0.2,0.8c0,0,0,0,0,0.1l-3.2,3.6c-0.2,0.3-0.6,0.3-0.9,0.1c-2.5-1.5-5.4-2.4-8.3-2.4c-3.1,0-4.8,1.3-4.8,3
s1.1,2.7,5.2,3.1l3.4,0.3c6.6,0.6,9.8,3.8,9.8,8.6c0,5.8-4.6,9.9-13.3,9.9C268,74,263.2,72.4,259.3,69.3z"/>
<path class="st11" d="M291.2,65.8c-0.8-2.3-1.2-4.7-1.1-7.2c-0.1-2.5,0.3-4.9,1-7.2c1.8-5.1,6.6-8.1,12.9-8.1c6.5,0,11.2,3.1,13,8.1
c0.7,2.1,1,4.1,1,8.8c0,0.3-0.3,0.6-0.6,0.6c0,0-0.1,0-0.1,0h-19.5c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1c0,0.8,0.2,1.5,0.5,2.2
c1,2.9,3.5,4.4,7.1,4.4c2.7,0.1,5.4-0.9,7.4-2.8c0.2-0.3,0.7-0.4,1-0.1c0,0,0,0,0,0l3.9,3.2c0.2,0.1,0.3,0.5,0.2,0.7
c0,0.1-0.1,0.1-0.1,0.1c-2.7,2.9-7.2,5-13,5C297.8,73.9,293,70.9,291.2,65.8z M310.4,52.8c-0.9-2.4-3.2-3.8-6.2-3.8
s-5.4,1.4-6.2,3.8c-0.3,0.8-0.4,1.6-0.4,2.5c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h12.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1
C310.8,54.5,310.6,53.6,310.4,52.8L310.4,52.8z"/>
<path class="st11" d="M323.6,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
H323.6L323.6,73.3z"/>
<path class="st11" d="M346.5,68.5c-0.3-0.2-0.4-0.6-0.2-0.9c0,0,0,0,0,0l4.1-4.4c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0
c3.5,2.7,7.7,4.2,12.1,4.4c5.3,0,8.4-2.5,8.4-6c0-3-2-4.9-8.1-5.7l-2.4-0.3c-8.6-1.1-13.5-4.9-13.5-11.8c0-7.5,5.9-12.4,15.1-12.4
c5.1-0.1,10.1,1.4,14.5,4.2c0.3,0.1,0.4,0.4,0.2,0.7c0,0.1-0.1,0.1-0.1,0.2l-3.1,4.5c-0.2,0.3-0.6,0.4-0.9,0.2
c-3.2-2.1-6.9-3.2-10.7-3.2c-4.5,0-7,2.3-7,5.5c0,2.9,2.2,4.8,8.2,5.6l2.4,0.3c8.6,1.1,13.3,4.9,13.3,12c0,7.3-5.7,12.8-16.8,12.8
C356.3,73.9,350,71.5,346.5,68.5z"/>
<path class="st11" d="M393.3,73.8c-6.4,0-8.8-2.9-8.8-8.6V49.8c0-0.2-0.1-0.3-0.3-0.4c0,0,0,0-0.1,0H382c-0.3,0-0.6-0.2-0.7-0.5
c0,0,0,0,0-0.1v-4.1c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h2.1c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-8c0-0.3,0.3-0.6,0.6-0.6
c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v8c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h4.2c0.3,0,0.6,0.2,0.7,0.5
c0,0,0,0,0,0.1v4.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-4.2c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1V65c0,2.1,0.9,2.7,3,2.7h1.6
c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v4.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0L393.3,73.8L393.3,73.8z"/>
<path class="st11" d="M421.2,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1v-2.1h0c-1.5,2-4.5,3.4-8.9,3.4c-5.8,0-10.6-2.8-10.6-8.9
c0-6.4,4.9-9.3,12.7-9.3h6.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-1.4c0-3.3-1.7-4.9-7-4.9c-2.6-0.1-5.1,0.6-7.2,2
c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1l-2.4-4c-0.2-0.2-0.1-0.6,0.1-0.8c0,0,0,0,0,0c2.6-1.7,6-2.9,11.2-2.9
c9.6,0,13.2,3,13.2,10.2v19.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0H421.2L421.2,73.3z M420.4,63.4v-2.2c0-0.2-0.1-0.3-0.3-0.4
c0,0,0,0-0.1,0h-5.2c-4.7,0-6.8,1.2-6.8,3.9c0,2.4,1.9,3.6,5.5,3.6C417.9,68.4,420.4,66.8,420.4,63.4L420.4,63.4z"/>
<path class="st11" d="M433.1,65.8c-0.7-2.3-1.1-4.8-1-7.2c-0.1-2.4,0.3-4.9,1-7.2c1.8-5.2,6.7-8.1,13.1-8.1c4.2-0.2,8.2,1.5,11,4.6
c0.2,0.2,0.2,0.6,0,0.8c0,0,0,0-0.1,0.1l-4.1,3.3c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1c-1.5-1.7-3.6-2.6-5.9-2.5
c-2.8,0-5,1.3-5.9,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.5c0.9,2.5,3.1,3.8,5.9,3.8c2.2,0.1,4.4-0.9,5.9-2.6
c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0l4.1,3.3c0.3,0.2,0.3,0.5,0.1,0.8c0,0,0,0-0.1,0.1c-2.9,3-6.9,4.6-11,4.5
C439.8,73.9,435,71.1,433.1,65.8z"/>
<path class="st11" d="M482.8,73.3c-0.4,0-0.8-0.2-1-0.6l-8-12.3l-4.3,4.6v7.7c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-6
c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v23.8
l10.8-11.8c0.3-0.4,0.8-0.6,1.2-0.6h6.7c0.2,0,0.4,0.1,0.4,0.3c0,0.1,0,0.3-0.1,0.3l-10.1,10.7L490,72.7c0.1,0.2,0.1,0.4,0,0.5
c-0.1,0.1-0.2,0.1-0.3,0.1H482.8L482.8,73.3z"/>
</svg>

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
// change this, if your php files and data is outside of your webservers document root // change this, if your php files and data is outside of your webservers document root

View File

@@ -1,6 +1,5 @@
--- ---
include: include:
- legacy.js
- privatebin.js - privatebin.js
reporter: reporter:
- text - text

151
js/base-x-3.0.5.1.js Normal file
View File

@@ -0,0 +1,151 @@
// base-x encoding / decoding
// based on https://github.com/cryptocoinjs/base-x 3.0.5
// modification: removed Buffer dependency and node.modules entry
// Copyright (c) 2018 base-x contributors
// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
// Distributed under the MIT software license, see the accompanying
// file LICENSE or http://www.opensource.org/licenses/mit-license.php.
(function(){
'use strict';
this.baseX = function base (ALPHABET) {
if (ALPHABET.length >= 255) throw new TypeError('Alphabet too long')
const BASE_MAP = new Uint8Array(256)
BASE_MAP.fill(255)
for (let i = 0; i < ALPHABET.length; i++) {
const x = ALPHABET.charAt(i)
const xc = x.charCodeAt(0)
if (BASE_MAP[xc] !== 255) throw new TypeError(x + ' is ambiguous')
BASE_MAP[xc] = i
}
const BASE = ALPHABET.length
const LEADER = ALPHABET.charAt(0)
const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up
const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up
function encode (source) {
if (source.length === 0) return ''
// Skip & count leading zeroes.
let zeroes = 0
let length = 0
let pbegin = 0
const pend = source.length
while (pbegin !== pend && source[pbegin] === 0) {
pbegin++
zeroes++
}
// Allocate enough space in big-endian base58 representation.
const size = ((pend - pbegin) * iFACTOR + 1) >>> 0
const b58 = new Uint8Array(size)
// Process the bytes.
while (pbegin !== pend) {
let carry = source[pbegin]
// Apply "b58 = b58 * 256 + ch".
let i = 0
for (let it = size - 1; (carry !== 0 || i < length) && (it !== -1); it--, i++) {
carry += (256 * b58[it]) >>> 0
b58[it] = (carry % BASE) >>> 0
carry = (carry / BASE) >>> 0
}
if (carry !== 0) throw new Error('Non-zero carry')
length = i
pbegin++
}
// Skip leading zeroes in base58 result.
let it = size - length
while (it !== size && b58[it] === 0) {
it++
}
// Translate the result into a string.
let str = LEADER.repeat(zeroes)
for (; it < size; ++it) str += ALPHABET.charAt(b58[it])
return str
}
function decodeUnsafe (source) {
if (typeof source !== 'string') throw new TypeError('Expected String')
if (source.length === 0) return ''
let psz = 0
// Skip leading spaces.
if (source[psz] === ' ') return
// Skip and count leading '1's.
let zeroes = 0
let length = 0
while (source[psz] === LEADER) {
zeroes++
psz++
}
// Allocate enough space in big-endian base256 representation.
const size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.
const b256 = new Uint8Array(size)
// Process the characters.
while (source[psz]) {
// Decode character
let carry = BASE_MAP[source.charCodeAt(psz)]
// Invalid character
if (carry === 255) return
let i = 0
for (let it = size - 1; (carry !== 0 || i < length) && (it !== -1); it--, i++) {
carry += (BASE * b256[it]) >>> 0
b256[it] = (carry % 256) >>> 0
carry = (carry / 256) >>> 0
}
if (carry !== 0) throw new Error('Non-zero carry')
length = i
psz++
}
// Skip trailing spaces.
if (source[psz] === ' ') return
// Skip leading zeroes in b256.
let it = size - length
while (it !== size && b256[it] === 0) {
it++
}
var vch = [];
let j = zeroes
while (it !== size) {
vch[j++] = b256[it++]
}
return vch
}
function decode (string) {
const buffer = decodeUnsafe(string)
if (buffer) return buffer
throw new Error('Non-base' + BASE + ' character')
}
return {
encode: encode,
decodeUnsafe: decodeUnsafe,
decode: decode
}
}
}).call(this);

View File

@@ -1,120 +0,0 @@
'use strict';
// base-x encoding / decoding
// based on https://github.com/cryptocoinjs/base-x 3.0.7
// modification: removed Buffer dependency and node.modules entry
// Copyright (c) 2018 base-x contributors
// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
// Distributed under the MIT software license, see the accompanying
// file LICENSE or http://www.opensource.org/licenses/mit-license.php.
(function(){
this.baseX = function base (ALPHABET) {
if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
var BASE_MAP = new Uint8Array(256)
BASE_MAP.fill(255)
for (var i = 0; i < ALPHABET.length; i++) {
var x = ALPHABET.charAt(i)
var xc = x.charCodeAt(0)
if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
BASE_MAP[xc] = i
}
var BASE = ALPHABET.length
var LEADER = ALPHABET.charAt(0)
var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up
var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up
function encode (source) {
if (source.length === 0) { return '' }
// Skip & count leading zeroes.
var zeroes = 0
var length = 0
var pbegin = 0
var pend = source.length
while (pbegin !== pend && source[pbegin] === 0) {
pbegin++
zeroes++
}
// Allocate enough space in big-endian base58 representation.
var size = ((pend - pbegin) * iFACTOR + 1) >>> 0
var b58 = new Uint8Array(size)
// Process the bytes.
while (pbegin !== pend) {
var carry = source[pbegin]
// Apply "b58 = b58 * 256 + ch".
var i = 0
for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
carry += (256 * b58[it1]) >>> 0
b58[it1] = (carry % BASE) >>> 0
carry = (carry / BASE) >>> 0
}
if (carry !== 0) { throw new Error('Non-zero carry') }
length = i
pbegin++
}
// Skip leading zeroes in base58 result.
var it2 = size - length
while (it2 !== size && b58[it2] === 0) {
it2++
}
// Translate the result into a string.
var str = LEADER.repeat(zeroes)
for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) }
return str
}
function decodeUnsafe (source) {
if (typeof source !== 'string') { throw new TypeError('Expected String') }
if (source.length === 0) { return '' }
var psz = 0
// Skip leading spaces.
if (source[psz] === ' ') { return }
// Skip and count leading '1's.
var zeroes = 0
var length = 0
while (source[psz] === LEADER) {
zeroes++
psz++
}
// Allocate enough space in big-endian base256 representation.
var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.
var b256 = new Uint8Array(size)
// Process the characters.
while (source[psz]) {
// Decode character
var carry = BASE_MAP[source.charCodeAt(psz)]
// Invalid character
if (carry === 255) { return }
var i = 0
for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
carry += (BASE * b256[it3]) >>> 0
b256[it3] = (carry % 256) >>> 0
carry = (carry / 256) >>> 0
}
if (carry !== 0) { throw new Error('Non-zero carry') }
length = i
psz++
}
// Skip trailing spaces.
if (source[psz] === ' ') { return }
// Skip leading zeroes in b256.
var it4 = size - length
while (it4 !== size && b256[it4] === 0) {
it4++
}
var vch = []
var j = zeroes
while (it4 !== size) {
vch[j++] = b256[it4++]
}
return vch
}
function decode (string) {
var buffer = decodeUnsafe(string)
if (buffer) { return buffer }
throw new Error('Non-base' + BASE + ' character')
}
return {
encode: encode,
decodeUnsafe: decodeUnsafe,
decode: decode
}
}
}).call(this);

View File

@@ -7,9 +7,7 @@ global.jsdom = require('jsdom-global');
global.cleanup = global.jsdom(); global.cleanup = global.jsdom();
global.URL = require('jsdom-url').URL; global.URL = require('jsdom-url').URL;
global.fs = require('fs'); global.fs = require('fs');
global.WebCrypto = require('@peculiar/webcrypto').Crypto; global.WebCrypto = require('node-webcrypto-ossl');
require('fake-indexeddb/auto');
global.FDBFactory = require('fake-indexeddb/lib/FDBFactory');
// application libraries to test // application libraries to test
global.$ = global.jQuery = require('./jquery-3.4.1'); global.$ = global.jQuery = require('./jquery-3.4.1');
@@ -18,10 +16,9 @@ global.zlib = require('./zlib-1.2.11').zlib;
require('./prettify'); require('./prettify');
global.prettyPrint = window.PR.prettyPrint; global.prettyPrint = window.PR.prettyPrint;
global.prettyPrintOne = window.PR.prettyPrintOne; global.prettyPrintOne = window.PR.prettyPrintOne;
global.showdown = require('./showdown-1.9.1'); global.showdown = require('./showdown-1.9.0');
global.DOMPurify = require('./purify-2.1.1'); global.DOMPurify = require('./purify-1.0.11');
global.baseX = require('./base-x-3.0.7').baseX; global.baseX = require('./base-x-3.0.5.1').baseX;
global.Legacy = require('./legacy').Legacy;
require('./bootstrap-3.3.7'); require('./bootstrap-3.3.7');
require('./privatebin'); require('./privatebin');
@@ -38,10 +35,25 @@ var a2zString = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
return c.toUpperCase(); return c.toUpperCase();
}) })
), ),
schemas = ['ftp','http','https'], schemas = ['ftp','gopher','http','https','ws','wss'],
supportedLanguages = ['de', 'es', 'fr', 'it', 'no', 'pl', 'pt', 'oc', 'ru', 'sl', 'zh'], supportedLanguages = ['de', 'es', 'fr', 'it', 'no', 'pl', 'pt', 'oc', 'ru', 'sl', 'zh'],
mimeTypes = ['image/png', 'application/octet-stream'], mimeTypes = ['image/png', 'application/octet-stream'],
formats = ['plaintext', 'markdown', 'syntaxhighlighting'], formats = ['plaintext', 'markdown', 'syntaxhighlighting'],
/**
* character to HTML entity lookup table
*
* @see {@link https://github.com/janl/mustache.js/blob/master/mustache.js#L60}
*/
entityMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;',
'/': '&#x2F;',
'`': '&#x60;',
'=': '&#x3D;'
},
mimeFile = fs.createReadStream('/etc/mime.types'), mimeFile = fs.createReadStream('/etc/mime.types'),
mimeLine = ''; mimeLine = '';
@@ -84,6 +96,22 @@ function parseMime(line) {
exports.atob = atob; exports.atob = atob;
exports.btoa = btoa; exports.btoa = btoa;
/**
* convert all applicable characters to HTML entities
*
* @see {@link https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content}
* @name htmlEntities
* @function
* @param {string} str
* @return {string} escaped HTML
*/
exports.htmlEntities = function(str) {
return String(str).replace(
/[&<>"'`=\/]/g, function(s) {
return entityMap[s];
});
};
// provides random lowercase characters from a to z // provides random lowercase characters from a to z
exports.jscA2zString = function() { exports.jscA2zString = function() {
return jsc.elements(a2zString); return jsc.elements(a2zString);

View File

@@ -1,311 +0,0 @@
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @see {@link https://github.com/PrivateBin/PrivateBin}
* @copyright 2012 Sébastien SAUVAGE ({@link http://sebsauvage.net})
* @license {@link https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License}
* @version 1.3.1
* @name Legacy
* @namespace
*/
/**
* IMPORTANT NOTICE FOR DEVELOPERS:
* The logic in this file is intended to run in legacy browsers. Avoid any use of:
* - jQuery (doesn't work in older browsers)
* - ES5 or newer in general
* - const/let, use the traditional var declarations instead
* - async/await or Promises, use traditional callbacks
* - shorthand function notation "() => output", use the full "function() {return output;}" style
* - IE doesn't support:
* - URL(), use the traditional window.location object
* - endsWith(), use indexof()
* - yes, this logic needs to support IE 6, to at least display the error message
*/
'use strict';
(function() {
/**
* compatibility check
*
* @name Check
* @class
*/
var Check = (function () {
var me = {};
/**
* Status of the initial check, true means it passed
*
* @private
* @prop {bool}
*/
var status = false;
/**
* Initialization check did run
*
* @private
* @prop {bool}
*/
var init = false;
/**
* blacklist of UserAgents (parts) known to belong to a bot
*
* @private
* @enum {Array}
* @readonly
*/
var badBotUA = [
'Bot',
'bot'
];
/**
* whitelist of top level domains to consider a secure context,
* regardless of protocol
*
* @private
* @enum {Array}
* @readonly
*/
var tld = [
'.onion',
'.i2p'
];
/**
* whitelist of hostnames to consider a secure context,
* regardless of protocol
*
* @private
* @enum {Array}
* @readonly
*/
// whitelists of TLDs & local hostnames
var hostname = [
'localhost',
'127.0.0.1',
'[::1]'
];
/**
* check if the context is secure
*
* @private
* @name Check.isSecureContext
* @function
* @return {bool}
*/
function isSecureContext()
{
// use .isSecureContext if available
if (window.isSecureContext === true || window.isSecureContext === false) {
return window.isSecureContext;
}
// HTTP is obviously insecure
if (window.location.protocol !== 'http:') {
return true;
}
// filter out actually secure connections over HTTP
for (var i = 0; i < tld.length; i++) {
if (
window.location.hostname.indexOf(
tld[i],
window.location.hostname.length - tld[i].length
) !== -1
) {
return true;
}
}
// whitelist localhost for development
for (var j = 0; j < hostname.length; j++) {
if (window.location.hostname === hostname[j]) {
return true;
}
}
// totally INSECURE http protocol!
return false;
}
/**
* checks whether this is a bot we dislike
*
* @private
* @name Check.isBadBot
* @function
* @return {bool}
*/
function isBadBot() {
// check whether a bot user agent part can be found in the current
// user agent
for (var i = 0; i < badBotUA.length; i++) {
if (navigator.userAgent.indexOf(badBotUA[i]) !== -1) {
return true;
}
}
return false;
}
/**
* checks whether this is an unsupported browser, via feature detection
*
* @private
* @name Check.isOldBrowser
* @function
* @return {bool}
*/
function isOldBrowser() {
// webcrypto support
if (!(
'crypto' in window &&
'getRandomValues' in window.crypto &&
'subtle' in window.crypto &&
'encrypt' in window.crypto.subtle &&
'decrypt' in window.crypto.subtle &&
'Uint8Array' in window &&
'Uint32Array' in window
)) {
return true;
}
// async & ES6 support
try {
eval('async () => {}');
} catch (e) {
if (e instanceof SyntaxError) {
return true;
} else {
throw e; // throws CSP error
}
}
return false;
}
/**
* shows an error message
*
* @private
* @name Check.showError
* @param {string} message
* @function
*/
function showError(message)
{
var element = document.getElementById('errormessage');
if (message.indexOf('<a') === -1) {
element.appendChild(
document.createTextNode(message)
);
} else {
element.innerHTML = message;
}
removeHiddenFromId('errormessage');
}
/**
* removes "hidden" CSS class from element with given ID
*
* @private
* @name Check.removeHiddenFromId
* @param {string} id
* @function
*/
function removeHiddenFromId(id)
{
var element = document.getElementById(id);
if (element) {
element.className = element.className.replace(/\bhidden\b/g, '');
}
}
/**
* returns if the check has concluded
*
* @name Check.getInit
* @function
* @return {bool}
*/
me.getInit = function()
{
return init;
};
/**
* returns the current status of the check
*
* @name Check.getStatus
* @function
* @return {bool}
*/
me.getStatus = function()
{
return status;
};
/**
* init on application start, returns an all-clear signal
*
* @name Check.init
* @function
*/
me.init = function()
{
// prevent bots from viewing a paste and potentially deleting data
// when burn-after-reading is set
if (isBadBot()) {
showError('I love you too, bot…');
init = true;
return;
}
if (isOldBrowser()) {
// some browsers (Chrome based ones) would have webcrypto support if using HTTPS
if (!isSecureContext()) {
removeHiddenFromId('insecurecontextnotice');
}
removeHiddenFromId('oldnotice');
init = true;
return;
}
if (!isSecureContext()) {
removeHiddenFromId('httpnotice');
}
init = true;
// only if everything passed, we set the status to true
status = true;
};
return me;
})();
// main application start, called when DOM is fully loaded
if (document.readyState === 'complete' || (!document.attachEvent && document.readyState === 'interactive')) {
Check.init();
} else {
if (document.addEventListener) {
// first choice is DOMContentLoaded event
document.addEventListener('DOMContentLoaded', Check.init, false);
// backup is window load event
window.addEventListener('load', Check.init, false);
} else {
// must be IE
document.attachEvent('onreadystatechange', Check.init);
window.attachEvent('onload', Check.init);
}
}
this.Legacy = {
Check: Check
};
}).call(this);

View File

@@ -1,6 +1,6 @@
{ {
"name": "privatebin", "name": "privatebin",
"version": "1.3.0", "version": "1.2.1",
"description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bit AES in Galois Counter mode (GCM).", "description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bit AES in Galois Counter mode (GCM).",
"main": "privatebin.js", "main": "privatebin.js",
"directories": { "directories": {
@@ -8,12 +8,11 @@
}, },
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"@peculiar/webcrypto": "^1.1.1",
"fake-indexeddb": "^3.0.2",
"jsdom": "^9.12.0", "jsdom": "^9.12.0",
"jsdom-global": "^2.1.1", "jsdom-global": "^2.1.1",
"jsdom-url": "^2.2.1", "jsdom-url": "^2.2.1",
"jsverify": "^0.8.3" "jsverify": "^0.8.3",
"node-webcrypto-ossl": "^1.0.37"
}, },
"scripts": { "scripts": {
"test": "mocha" "test": "mocha"

View File

@@ -26,6 +26,9 @@
}, },
"time_to_live": { "time_to_live": {
"@type": "pb:RemainingSeconds" "@type": "pb:RemainingSeconds"
},
"challenge": {
"@type": "pb:Challenge"
} }
} }
} }

File diff suppressed because it is too large Load Diff

1
js/purify-1.0.11.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,55 +4,16 @@ var common = require('../common');
describe('Alert', function () { describe('Alert', function () {
describe('showStatus', function () { describe('showStatus', function () {
jsc.property( jsc.property(
'shows a status message (basic)', 'shows a status message',
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
function (icon, message) { function (icon, message) {
icon = icon.join(''); icon = icon.join('');
message = message.join(''); message = message.join('');
const expected = '<div id="status">' + message + '</div>'; var expected = '<div id="status" role="alert" ' +
$('body').html(
'<div id="status"></div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showStatus(message, icon);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows a status message (bootstrap)',
jsc.array(common.jscAlnumString()),
function (message) {
message = message.join('');
const expected = '<div id="status" role="alert" ' +
'class="statusmessage alert alert-info"><span ' +
'class="glyphicon glyphicon-info-sign" ' +
'aria-hidden="true"></span> <span>' + message + '</span></div>';
$('body').html(
'<div id="status" role="alert" class="statusmessage ' +
'alert alert-info hidden"><span class="glyphicon ' +
'glyphicon-info-sign" aria-hidden="true"></span> </div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showStatus(message);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows a status message (bootstrap, custom icon)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (icon, message) {
icon = icon.join('');
message = message.join('');
const expected = '<div id="status" role="alert" ' +
'class="statusmessage alert alert-info"><span ' + 'class="statusmessage alert alert-info"><span ' +
'class="glyphicon glyphicon-' + icon + 'class="glyphicon glyphicon-' + icon +
'" aria-hidden="true"></span> <span>' + message + '</span></div>'; '" aria-hidden="true"></span> ' + message + '</div>';
$('body').html( $('body').html(
'<div id="status" role="alert" class="statusmessage ' + '<div id="status" role="alert" class="statusmessage ' +
'alert alert-info hidden"><span class="glyphicon ' + 'alert alert-info hidden"><span class="glyphicon ' +
@@ -60,129 +21,28 @@ describe('Alert', function () {
); );
$.PrivateBin.Alert.init(); $.PrivateBin.Alert.init();
$.PrivateBin.Alert.showStatus(message, icon); $.PrivateBin.Alert.showStatus(message, icon);
const result = $('body').html(); var result = $('body').html();
return expected === result;
}
);
});
describe('showWarning', function () {
jsc.property(
'shows a warning message (basic)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (icon, message) {
icon = icon.join('');
message = message.join('');
const expected = '<div id="errormessage">' + message + '</div>';
$('body').html(
'<div id="errormessage"></div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showWarning(message, icon);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows a warning message (bootstrap)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (message) {
message = message.join('');
const expected = '<div id="errormessage" role="alert" ' +
'class="statusmessage alert alert-danger"><span ' +
'class="glyphicon glyphicon-warning-sign" ' +
'aria-hidden="true"></span> <span>' + message + '</span></div>';
$('body').html(
'<div id="errormessage" role="alert" class="statusmessage ' +
'alert alert-danger hidden"><span class="glyphicon ' +
'glyphicon-alert" aria-hidden="true"></span> </div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showWarning(message);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows a warning message (bootstrap, custom icon)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (icon, message) {
icon = icon.join('');
message = message.join('');
const expected = '<div id="errormessage" role="alert" ' +
'class="statusmessage alert alert-danger"><span ' +
'class="glyphicon glyphicon-' + icon +
'" aria-hidden="true"></span> <span>' + message + '</span></div>';
$('body').html(
'<div id="errormessage" role="alert" class="statusmessage ' +
'alert alert-danger hidden"><span class="glyphicon ' +
'glyphicon-alert" aria-hidden="true"></span> </div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showWarning(message, icon);
const result = $('body').html();
return expected === result; return expected === result;
} }
); );
}); });
describe('showError', function () { describe('showError', function () {
before(function () {
cleanup();
});
jsc.property( jsc.property(
'shows an error message (basic)', 'shows an error message',
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
function (icon, message) { function (icon, message) {
icon = icon.join(''); icon = icon.join('');
message = message.join(''); message = message.join('');
const expected = '<div id="errormessage">' + message + '</div>'; var expected = '<div id="errormessage" role="alert" ' +
$('body').html(
'<div id="errormessage"></div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showError(message, icon);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows an error message (bootstrap)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (icon, message) {
message = message.join('');
const expected = '<div id="errormessage" role="alert" ' +
'class="statusmessage alert alert-danger"><span ' +
'class="glyphicon glyphicon-alert" ' +
'aria-hidden="true"></span> <span>' + message + '</span></div>';
$('body').html(
'<div id="errormessage" role="alert" class="statusmessage ' +
'alert alert-danger hidden"><span class="glyphicon ' +
'glyphicon-alert" aria-hidden="true"></span> </div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showError(message);
const result = $('body').html();
return expected === result;
}
);
jsc.property(
'shows an error message (bootstrap, custom icon)',
jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()),
function (icon, message) {
icon = icon.join('');
message = message.join('');
const expected = '<div id="errormessage" role="alert" ' +
'class="statusmessage alert alert-danger"><span ' + 'class="statusmessage alert alert-danger"><span ' +
'class="glyphicon glyphicon-' + icon + 'class="glyphicon glyphicon-' + icon +
'" aria-hidden="true"></span> <span>' + message + '</span></div>'; '" aria-hidden="true"></span> ' + message + '</div>';
$('body').html( $('body').html(
'<div id="errormessage" role="alert" class="statusmessage ' + '<div id="errormessage" role="alert" class="statusmessage ' +
'alert alert-danger hidden"><span class="glyphicon ' + 'alert alert-danger hidden"><span class="glyphicon ' +
@@ -190,44 +50,29 @@ describe('Alert', function () {
); );
$.PrivateBin.Alert.init(); $.PrivateBin.Alert.init();
$.PrivateBin.Alert.showError(message, icon); $.PrivateBin.Alert.showError(message, icon);
const result = $('body').html(); var result = $('body').html();
return expected === result; return expected === result;
} }
); );
}); });
describe('showRemaining', function () { describe('showRemaining', function () {
jsc.property( before(function () {
'shows remaining time (basic)', cleanup();
jsc.array(common.jscAlnumString()), });
jsc.array(common.jscAlnumString()),
'integer',
function (message, string, number) {
message = message.join('');
string = string.join('');
const expected = '<div id="remainingtime" class="">' + string + message + number + '</div>';
$('body').html(
'<div id="remainingtime" class="hidden"></div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]);
const result = $('body').html();
return expected === result;
}
);
jsc.property( jsc.property(
'shows remaining time (bootstrap)', 'shows remaining time',
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
'integer', 'integer',
function (message, string, number) { function (message, string, number) {
message = message.join(''); message = message.join('');
string = string.join(''); string = string.join('');
const expected = '<div id="remainingtime" role="alert" ' + var expected = '<div id="remainingtime" role="alert" ' +
'class="alert alert-info"><span ' + 'class="alert alert-info"><span ' +
'class="glyphicon glyphicon-fire" aria-hidden="true">' + 'class="glyphicon glyphicon-fire" aria-hidden="true">' +
'</span> <span>' + string + message + number + '</span></div>'; '</span> ' + string + message + number + '</div>';
$('body').html( $('body').html(
'<div id="remainingtime" role="alert" class="hidden ' + '<div id="remainingtime" role="alert" class="hidden ' +
'alert alert-info"><span class="glyphicon ' + 'alert alert-info"><span class="glyphicon ' +
@@ -235,50 +80,32 @@ describe('Alert', function () {
); );
$.PrivateBin.Alert.init(); $.PrivateBin.Alert.init();
$.PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]); $.PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]);
const result = $('body').html(); var result = $('body').html();
return expected === result; return expected === result;
} }
); );
}); });
describe('showLoading', function () { describe('showLoading', function () {
jsc.property( before(function () {
'shows a loading message (basic)', cleanup();
jsc.array(common.jscAlnumString()), });
jsc.array(common.jscAlnumString()),
function (message, icon) {
message = message.join('');
icon = icon.join('');
const defaultMessage = 'Loading…';
if (message.length === 0) {
message = defaultMessage;
}
const expected = '<div id="loadingindicator" class="">' + message + '</div>';
$('body').html(
'<div id="loadingindicator" class="hidden">' + defaultMessage + '</div>'
);
$.PrivateBin.Alert.init();
$.PrivateBin.Alert.showLoading(message, icon);
const result = $('body').html();
return expected === result;
}
);
jsc.property( jsc.property(
'shows a loading message (bootstrap)', 'shows a loading message',
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
function (message, icon) { function (message, icon) {
message = message.join(''); message = message.join('');
icon = icon.join(''); icon = icon.join('');
const defaultMessage = 'Loading…'; var defaultMessage = 'Loading…';
if (message.length === 0) { if (message.length === 0) {
message = defaultMessage; message = defaultMessage;
} }
const expected = '<ul class="nav navbar-nav"><li ' + var expected = '<ul class="nav navbar-nav"><li ' +
'id="loadingindicator" class="navbar-text"><span ' + 'id="loadingindicator" class="navbar-text"><span ' +
'class="glyphicon glyphicon-' + icon + 'class="glyphicon glyphicon-' + icon +
'" aria-hidden="true"></span> <span>' + message + '</span></li></ul>'; '" aria-hidden="true"></span> ' + message + '</li></ul>';
$('body').html( $('body').html(
'<ul class="nav navbar-nav"><li id="loadingindicator" ' + '<ul class="nav navbar-nav"><li id="loadingindicator" ' +
'class="navbar-text hidden"><span class="glyphicon ' + 'class="navbar-text hidden"><span class="glyphicon ' +
@@ -287,13 +114,17 @@ describe('Alert', function () {
); );
$.PrivateBin.Alert.init(); $.PrivateBin.Alert.init();
$.PrivateBin.Alert.showLoading(message, icon); $.PrivateBin.Alert.showLoading(message, icon);
const result = $('body').html(); var result = $('body').html();
return expected === result; return expected === result;
} }
); );
}); });
describe('hideLoading', function () { describe('hideLoading', function () {
before(function () {
cleanup();
});
it( it(
'hides the loading message', 'hides the loading message',
function() { function() {
@@ -315,6 +146,10 @@ describe('Alert', function () {
}); });
describe('hideMessages', function () { describe('hideMessages', function () {
before(function () {
cleanup();
});
it( it(
'hides all messages', 'hides all messages',
function() { function() {
@@ -337,13 +172,17 @@ describe('Alert', function () {
}); });
describe('setCustomHandler', function () { describe('setCustomHandler', function () {
before(function () {
cleanup();
});
jsc.property( jsc.property(
'calls a given handler function', 'calls a given handler function',
'nat 3', 'nat 3',
jsc.array(common.jscAlnumString()), jsc.array(common.jscAlnumString()),
function (trigger, message) { function (trigger, message) {
message = message.join(''); message = message.join('');
let handlerCalled = false, var handlerCalled = false,
defaultMessage = 'Loading…', defaultMessage = 'Loading…',
functions = [ functions = [
$.PrivateBin.Alert.showStatus, $.PrivateBin.Alert.showStatus,

View File

@@ -13,7 +13,7 @@ describe('AttachmentViewer', function () {
'string', 'string',
'string', 'string',
function (mimeType, rawdata, filename, prefix, postfix) { function (mimeType, rawdata, filename, prefix, postfix) {
let clean = jsdom(), var clean = jsdom(),
data = 'data:' + mimeType + ';base64,' + btoa(rawdata), data = 'data:' + mimeType + ';base64,' + btoa(rawdata),
previewSupported = ( previewSupported = (
mimeType.substring(0, 6) === 'image/' || mimeType.substring(0, 6) === 'image/' ||
@@ -21,9 +21,8 @@ describe('AttachmentViewer', function () {
mimeType.substring(0, 6) === 'video/' || mimeType.substring(0, 6) === 'video/' ||
mimeType.match(/\/pdf/i) mimeType.match(/\/pdf/i)
), ),
results = [], results = [];
result = ''; prefix = prefix.replace(/%(s|d)/g, '%%');
prefix = prefix.replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, '%%'); postfix = postfix.replace(/%(s|d)/g, '%%');
$('body').html( $('body').html(
'<div id="attachment" role="alert" class="hidden alert ' + '<div id="attachment" role="alert" class="hidden alert ' +
@@ -55,7 +54,7 @@ describe('AttachmentViewer', function () {
} }
// beyond this point we will get the blob URL instead of the data // beyond this point we will get the blob URL instead of the data
data = window.URL.createObjectURL(data); data = window.URL.createObjectURL(data);
const attachment = $.PrivateBin.AttachmentViewer.getAttachment(); var attachment = $.PrivateBin.AttachmentViewer.getAttachment();
results.push( results.push(
$.PrivateBin.AttachmentViewer.hasAttachment() && $.PrivateBin.AttachmentViewer.hasAttachment() &&
$('#attachment').hasClass('hidden') && $('#attachment').hasClass('hidden') &&
@@ -82,24 +81,13 @@ describe('AttachmentViewer', function () {
!$('#attachment').hasClass('hidden') && !$('#attachment').hasClass('hidden') &&
(previewSupported ? !$('#attachmentPreview').hasClass('hidden') : $('#attachmentPreview').hasClass('hidden')) (previewSupported ? !$('#attachmentPreview').hasClass('hidden') : $('#attachmentPreview').hasClass('hidden'))
); );
let element = $('<div>'); var element = $('<div></div>');
$.PrivateBin.AttachmentViewer.moveAttachmentTo(element, prefix + '%s' + postfix); $.PrivateBin.AttachmentViewer.moveAttachmentTo(element, prefix + '%s' + postfix);
// messageIDs with links get a relaxed treatment
if (prefix.indexOf('<a') === -1 && postfix.indexOf('<a') === -1) {
result = $('<textarea>').text((prefix + filename + postfix)).text();
} else {
result = DOMPurify.sanitize(
prefix + $.PrivateBin.Helper.htmlEntities(filename) + postfix, {
ALLOWED_TAGS: ['a', 'i', 'span'],
ALLOWED_ATTR: ['href', 'id']
}
);
}
if (filename.length) { if (filename.length) {
results.push( results.push(
element.children()[0].href === data && element.children()[0].href === data &&
element.children()[0].getAttribute('download') === filename && element.children()[0].getAttribute('download') === filename &&
element.children()[0].text === result element.children()[0].text === prefix + filename + postfix
); );
} else { } else {
results.push(element.children()[0].href === data); results.push(element.children()[0].href === data);

View File

@@ -1,80 +0,0 @@
'use strict';
var common = require('../common');
/* global Legacy, WebCrypto */
describe('Check', function () {
describe('init', function () {
this.timeout(30000);
it('returns false and shows error, if a bot UA is detected', function () {
jsc.assert(jsc.forall(
'string',
jsc.elements(['Bot', 'bot']),
'string',
function (prefix, botBit, suffix) {
const clean = jsdom(
'<html><body><div id="errormessage" class="hidden"></div>' +
'</body></html>', {
'userAgent': prefix + botBit + suffix
}
);
Legacy.Check.init();
const result1 = Legacy.Check.getInit() && !Legacy.Check.getStatus(),
result2 = (document.getElementById('errormessage').className !== 'hidden');
clean();
return result1 && result2;
}
),
{tests: 10});
});
jsc.property(
'shows error, if no webcrypto is detected',
'bool',
jsc.elements(['localhost', '127.0.0.1', '[::1]', '']),
jsc.nearray(common.jscA2zString()),
jsc.elements(['.onion', '.i2p', '']),
function (secureProtocol, localhost, domain, tld) {
const isDomain = localhost === '',
isSecureContext = secureProtocol || !isDomain || tld.length > 0,
clean = jsdom(
'<html><body><div id="errormessage" class="hidden"></div>' +
'<div id="oldnotice" class="hidden"></div>' +
'<div id="insecurecontextnotice" class="hidden"></div></body></html>',
{
'url': (secureProtocol ? 'https' : 'http' ) + '://' +
(isDomain ? domain.join('') + tld : localhost) + '/'
}
);
Legacy.Check.init();
const result1 = Legacy.Check.getInit() && !Legacy.Check.getStatus(),
result2 = isSecureContext === (document.getElementById('insecurecontextnotice').className === 'hidden'),
result3 = (document.getElementById('oldnotice').className !== 'hidden');
clean();
return result1 && result2 && result3;
}
);
jsc.property(
'shows error, if HTTP only site is detected',
'bool',
jsc.nearray(common.jscA2zString()),
function (secureProtocol, domain) {
const clean = jsdom(
'<html><body><div id="httpnotice" class="hidden"></div>' +
'</body></html>',
{
'url': (secureProtocol ? 'https' : 'http' ) + '://' + domain.join('') + '/'
}
);
window.crypto = new WebCrypto();
Legacy.Check.init();
const result1 = Legacy.Check.getInit() && Legacy.Check.getStatus(),
result2 = secureProtocol === (document.getElementById('httpnotice').className === 'hidden');
clean();
return result1 && result2;
}
);
});
});

View File

@@ -18,15 +18,13 @@ describe('CryptTool', function () {
// pause to let async functions conclude // pause to let async functions conclude
await new Promise(resolve => setTimeout(resolve, 300)); await new Promise(resolve => setTimeout(resolve, 300));
let clean = jsdom(); let clean = jsdom();
// ensure zlib is getting loaded
$.PrivateBin.Controller.initZ();
window.crypto = new WebCrypto(); window.crypto = new WebCrypto();
message = message.trim(); message = message.trim();
let cipherMessage = await $.PrivateBin.CryptTool.cipher( let cipherMessage = await $.PrivateBin.CryptTool.cipher(
key, password, message, [] key, password, message, []
), ),
plaintext = await $.PrivateBin.CryptTool.decipher( plaintext = await $.PrivateBin.CryptTool.decipher(
key, password, cipherMessage key, password, cipherMessage
); );
clean(); clean();
return message === plaintext; return message === plaintext;
@@ -181,8 +179,6 @@ describe('CryptTool', function () {
let message = fs.readFileSync('test/compression-sample.txt', 'utf8'), let message = fs.readFileSync('test/compression-sample.txt', 'utf8'),
clean = jsdom(); clean = jsdom();
window.crypto = new WebCrypto(); window.crypto = new WebCrypto();
// ensure zlib is getting loaded
$.PrivateBin.Controller.initZ();
let cipherMessage = await $.PrivateBin.CryptTool.cipher( let cipherMessage = await $.PrivateBin.CryptTool.cipher(
'foo', 'bar', message, [] 'foo', 'bar', message, []
), ),
@@ -226,8 +222,6 @@ isWhile : interp (while expr sBody) (MemElem mem) =
conseq_or_bottom inv (interp (nth_iterate sBody n) (MemElem mem)) conseq_or_bottom inv (interp (nth_iterate sBody n) (MemElem mem))
`; `;
let clean = jsdom(); let clean = jsdom();
// ensure zlib is getting loaded
$.PrivateBin.Controller.initZ();
window.crypto = new WebCrypto(); window.crypto = new WebCrypto();
let cipherMessage = await $.PrivateBin.CryptTool.cipher( let cipherMessage = await $.PrivateBin.CryptTool.cipher(
key, password, message, [] key, password, message, []
@@ -243,19 +237,48 @@ conseq_or_bottom inv (interp (nth_iterate sBody n) (MemElem mem))
}); });
}); });
describe('getCredentials', function () {
it('generates credentials with password', async function () {
const clean = jsdom();
window.crypto = new WebCrypto();
// choosen by fair dice roll
const key = atob('EqueAutxlrekNNEvJWB1uaaiwbk/GGpn4++cdk+uDMc='),
// -- "That's amazing. I've got the same combination on my luggage."
password = Array.apply(0, Array(6)).map((_,b) => b + 1).join('');
const credentials = await $.PrivateBin.CryptTool.getCredentials(
key, password
);
clean();
assert.strictEqual(credentials, 'JS8bJWFx1bAPI2LMxfWrw4AQ7cedNVl8UmjUd/pW7Yg=');
});
it('generates credentials without password', async function () {
const clean = jsdom();
window.crypto = new WebCrypto();
// choosen by fair dice roll
const key = atob('U844LK1y2uUPthTgMvPECwGyQzwScCwkaEI/+qLfQSE='),
password = '';
const credentials = await $.PrivateBin.CryptTool.getCredentials(
key, password
);
clean();
assert.strictEqual(credentials, 'VfAvY7T9rm3K3JKtiOeb+B+rXnE6yZ4bYQTaD9jwjEk=');
});
});
describe('getSymmetricKey', function () { describe('getSymmetricKey', function () {
this.timeout(30000); this.timeout(30000);
var keys = []; let keys = [];
// the parameter is used to ensure the test is run more then one time // the parameter is used to ensure the test is run more then one time
jsc.property( jsc.property(
'returns random, non-empty keys', 'returns random, non-empty keys',
'integer', 'integer',
function(counter) { function(counter) {
var clean = jsdom(); const clean = jsdom();
window.crypto = new WebCrypto(); window.crypto = new WebCrypto();
var key = $.PrivateBin.CryptTool.getSymmetricKey(), const key = $.PrivateBin.CryptTool.getSymmetricKey(),
result = (key !== '' && keys.indexOf(key) === -1); result = (key !== '' && keys.indexOf(key) === -1);
keys.push(key); keys.push(key);
clean(); clean();
return result; return result;

View File

@@ -4,6 +4,9 @@ var common = require('../common');
describe('DiscussionViewer', function () { describe('DiscussionViewer', function () {
describe('handleNotification, prepareNewDiscussion, addComment, finishDiscussion, getReplyMessage, getReplyNickname, getReplyCommentId & highlightComment', function () { describe('handleNotification, prepareNewDiscussion, addComment, finishDiscussion, getReplyMessage, getReplyNickname, getReplyCommentId & highlightComment', function () {
this.timeout(30000); this.timeout(30000);
before(function () {
cleanup();
});
jsc.property( jsc.property(
'displays & hides comments as requested', 'displays & hides comments as requested',

View File

@@ -4,6 +4,9 @@ require('../common');
describe('Editor', function () { describe('Editor', function () {
describe('show, hide, getText, setText & isPreview', function () { describe('show, hide, getText, setText & isPreview', function () {
this.timeout(30000); this.timeout(30000);
before(function () {
cleanup();
});
jsc.property( jsc.property(
'returns text fed into the textarea, handles editor tabs', 'returns text fed into the textarea, handles editor tabs',

View File

@@ -3,6 +3,10 @@ var common = require('../common');
describe('Helper', function () { describe('Helper', function () {
describe('secondsToHuman', function () { describe('secondsToHuman', function () {
after(function () {
cleanup();
});
jsc.property('returns an array with a number and a word', 'integer', function (number) { jsc.property('returns an array with a number and a word', 'integer', function (number) {
var result = $.PrivateBin.Helper.secondsToHuman(number); var result = $.PrivateBin.Helper.secondsToHuman(number);
return Array.isArray(result) && return Array.isArray(result) &&
@@ -53,11 +57,11 @@ describe('Helper', function () {
'nearray string', 'nearray string',
function (ids, contents) { function (ids, contents) {
var html = '', var html = '',
result = true, result = true;
clean = jsdom(html);
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
html += '<div id="' + item.join('') + '">' + $.PrivateBin.Helper.htmlEntities(contents[i] || contents[0]) + '</div>'; html += '<div id="' + item.join('') + '">' + common.htmlEntities(contents[i] || contents[0]) + '</div>';
}); });
var clean = jsdom(html);
// TODO: As per https://github.com/tmpvar/jsdom/issues/321 there is no getSelection in jsdom, yet. // TODO: As per https://github.com/tmpvar/jsdom/issues/321 there is no getSelection in jsdom, yet.
// Once there is one, uncomment the block below to actually check the result. // Once there is one, uncomment the block below to actually check the result.
/* /*
@@ -73,24 +77,15 @@ describe('Helper', function () {
}); });
describe('urls2links', function () { describe('urls2links', function () {
this.timeout(30000); after(function () {
before(function () { cleanup();
cleanup = jsdom();
}); });
jsc.property( jsc.property(
'ignores non-URL content', 'ignores non-URL content',
'string', 'string',
function (content) { function (content) {
content = content.replace(/\r|\f/g, '\n').replace(/\u0000/g, '').replace(/\u000b/g, ''); return content === $.PrivateBin.Helper.urls2links(content);
let clean = jsdom();
$('body').html('<div id="foo"></div>');
let e = $('#foo');
e.text(content);
$.PrivateBin.Helper.urls2links(e);
let result = e.text();
clean();
return content === result;
} }
); );
jsc.property( jsc.property(
@@ -102,14 +97,11 @@ describe('Helper', function () {
jsc.array(common.jscHashString()), jsc.array(common.jscHashString()),
'string', 'string',
function (prefix, schema, address, query, fragment, postfix) { function (prefix, schema, address, query, fragment, postfix) {
query = query.join(''); var query = query.join(''),
fragment = fragment.join(''); fragment = fragment.join(''),
prefix = prefix.replace(/\r|\f/g, '\n').replace(/\u0000/g, '').replace(/\u000b/g, ''); url = schema + '://' + address.join('') + '/?' + query + '#' + fragment,
postfix = ' ' + postfix.replace(/\r/g, '\n').replace(/\u0000/g, ''); prefix = common.htmlEntities(prefix),
let url = schema + '://' + address.join('') + '/?' + query + '#' + fragment, postfix = ' ' + common.htmlEntities(postfix);
clean = jsdom();
$('body').html('<div id="foo"></div>');
let e = $('#foo');
// special cases: When the query string and fragment imply the beginning of an HTML entity, eg. &#0 or &#x // special cases: When the query string and fragment imply the beginning of an HTML entity, eg. &#0 or &#x
if ( if (
@@ -120,12 +112,8 @@ describe('Helper', function () {
url = schema + '://' + address.join('') + '/?' + query.substring(0, query.length - 1); url = schema + '://' + address.join('') + '/?' + query.substring(0, query.length - 1);
postfix = ''; postfix = '';
} }
e.text(prefix + url + postfix);
$.PrivateBin.Helper.urls2links(e); return prefix + '<a href="' + url + '" rel="nofollow">' + url + '</a>' + postfix === $.PrivateBin.Helper.urls2links(prefix + url + postfix);
let result = e.html();
clean();
url = $('<div />').text(url).html();
return $('<div />').text(prefix).html() + '<a href="' + url + '" target="_blank" rel="nofollow noopener noreferrer">' + url + '</a>' + $('<div />').text(postfix).html() === result;
} }
); );
jsc.property( jsc.property(
@@ -134,23 +122,19 @@ describe('Helper', function () {
jsc.array(common.jscQueryString()), jsc.array(common.jscQueryString()),
'string', 'string',
function (prefix, query, postfix) { function (prefix, query, postfix) {
prefix = prefix.replace(/\r|\f/g, '\n').replace(/\u0000/g, '').replace(/\u000b/g, ''); var url = 'magnet:?' + query.join('').replace(/^&+|&+$/gm,''),
postfix = ' ' + postfix.replace(/\r/g, '\n').replace(/\u0000/g, ''); prefix = common.htmlEntities(prefix),
let url = 'magnet:?' + query.join('').replace(/^&+|&+$/gm,''), postfix = common.htmlEntities(postfix);
clean = jsdom(); return prefix + '<a href="' + url + '" rel="nofollow">' + url + '</a> ' + postfix === $.PrivateBin.Helper.urls2links(prefix + url + ' ' + postfix);
$('body').html('<div id="foo"></div>');
let e = $('#foo');
e.text(prefix + url + postfix);
$.PrivateBin.Helper.urls2links(e);
let result = e.html();
clean();
url = $('<div />').text(url).html();
return $('<div />').text(prefix).html() + '<a href="' + url + '" target="_blank" rel="nofollow noopener noreferrer">' + url + '</a>' + $('<div />').text(postfix).html() === result;
} }
); );
}); });
describe('sprintf', function () { describe('sprintf', function () {
after(function () {
cleanup();
});
jsc.property( jsc.property(
'replaces %s in strings with first given parameter', 'replaces %s in strings with first given parameter',
'string', 'string',
@@ -199,9 +183,9 @@ describe('Helper', function () {
'string', 'string',
'string', 'string',
function (prefix, uint, middle, string, postfix) { function (prefix, uint, middle, string, postfix) {
prefix = prefix.replace(/%(s|d)/g, ''); prefix = prefix.replace(/%(s|d)/g, '%%');
middle = middle.replace(/%(s|d)/g, ''); middle = middle.replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, ''); postfix = postfix.replace(/%(s|d)/g, '%%');
var params = [prefix + '%d' + middle + '%s' + postfix, uint, string], var params = [prefix + '%d' + middle + '%s' + postfix, uint, string],
result = prefix + uint + middle + string + postfix; result = prefix + uint + middle + string + postfix;
return result === $.PrivateBin.Helper.sprintf.apply(this, params); return result === $.PrivateBin.Helper.sprintf.apply(this, params);
@@ -215,9 +199,9 @@ describe('Helper', function () {
'string', 'string',
'string', 'string',
function (prefix, uint, middle, string, postfix) { function (prefix, uint, middle, string, postfix) {
prefix = prefix.replace(/%(s|d)/g, ''); prefix = prefix.replace(/%(s|d)/g, '%%');
middle = middle.replace(/%(s|d)/g, ''); middle = middle.replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, ''); postfix = postfix.replace(/%(s|d)/g, '%%');
var params = [prefix + '%s' + middle + '%d' + postfix, string, uint], var params = [prefix + '%s' + middle + '%d' + postfix, string, uint],
result = prefix + string + middle + uint + postfix; result = prefix + string + middle + uint + postfix;
return result === $.PrivateBin.Helper.sprintf.apply(this, params); return result === $.PrivateBin.Helper.sprintf.apply(this, params);
@@ -227,7 +211,7 @@ describe('Helper', function () {
describe('getCookie', function () { describe('getCookie', function () {
this.timeout(30000); this.timeout(30000);
before(function () { after(function () {
cleanup(); cleanup();
}); });
@@ -279,16 +263,16 @@ describe('Helper', function () {
}); });
describe('htmlEntities', function () { describe('htmlEntities', function () {
before(function () { after(function () {
cleanup = jsdom(); cleanup();
}); });
jsc.property( jsc.property(
'removes all HTML entities from any given string', 'removes all HTML entities from any given string',
'string', 'string',
function (string) { function (string) {
var result = $.PrivateBin.Helper.htmlEntities(string); var result = common.htmlEntities(string);
return !(/[<>]/.test(result)) && !(string.indexOf('&') > -1 && !(/&amp;/.test(result))); return !(/[<>"'`=\/]/.test(result)) && !(string.indexOf('&') > -1 && !(/&amp;/.test(result)));
} }
); );
}); });

View File

@@ -3,7 +3,6 @@ var common = require('../common');
describe('I18n', function () { describe('I18n', function () {
describe('translate', function () { describe('translate', function () {
this.timeout(30000);
before(function () { before(function () {
$.PrivateBin.I18n.reset(); $.PrivateBin.I18n.reset();
}); });
@@ -33,41 +32,13 @@ describe('I18n', function () {
var fakeAlias = $.PrivateBin.I18n._(fake); var fakeAlias = $.PrivateBin.I18n._(fake);
$.PrivateBin.I18n.reset(); $.PrivateBin.I18n.reset();
if (messageId.indexOf('<a') === -1) {
messageId = $.PrivateBin.Helper.htmlEntities(messageId);
} else {
messageId = DOMPurify.sanitize(
messageId, {
ALLOWED_TAGS: ['a', 'i', 'span'],
ALLOWED_ATTR: ['href', 'id']
}
);
}
return messageId === result && messageId === alias && return messageId === result && messageId === alias &&
messageId === pluralResult && messageId === pluralAlias && messageId === pluralResult && messageId === pluralAlias &&
messageId === fakeResult && messageId === fakeAlias; messageId === fakeResult && messageId === fakeAlias;
} }
); );
jsc.property( jsc.property(
'replaces %s in strings with first given parameter, encoding all, when no link is in the messageID', 'replaces %s in strings with first given parameter',
'string',
'(small nearray) string',
'string',
function (prefix, params, postfix) {
prefix = prefix.replace(/%(s|d)/g, '%%').replace(/<a/g, '');
params[0] = params[0].replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, '%%').replace(/<a/g, '');
const translation = $.PrivateBin.Helper.htmlEntities(prefix + params[0] + postfix);
params.unshift(prefix + '%s' + postfix);
const result = $.PrivateBin.I18n.translate.apply(this, params);
$.PrivateBin.I18n.reset();
const alias = $.PrivateBin.I18n._.apply(this, params);
$.PrivateBin.I18n.reset();
return translation === result && translation === alias;
}
);
jsc.property(
'replaces %s in strings with first given parameter, encoding params only, when a link is part of the messageID',
'string', 'string',
'(small nearray) string', '(small nearray) string',
'string', 'string',
@@ -75,83 +46,15 @@ describe('I18n', function () {
prefix = prefix.replace(/%(s|d)/g, '%%'); prefix = prefix.replace(/%(s|d)/g, '%%');
params[0] = params[0].replace(/%(s|d)/g, '%%'); params[0] = params[0].replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, '%%'); postfix = postfix.replace(/%(s|d)/g, '%%');
const translation = DOMPurify.sanitize( var translation = prefix + params[0] + postfix;
prefix + '<a href="' + params[0] + '"></a>' + postfix, { params.unshift(prefix + '%s' + postfix);
ALLOWED_TAGS: ['a', 'i', 'span'], var result = $.PrivateBin.I18n.translate.apply(this, params);
ALLOWED_ATTR: ['href', 'id']
}
);
params.unshift(prefix + '<a href="%s"></a>' + postfix);
const result = $.PrivateBin.I18n.translate.apply(this, params);
$.PrivateBin.I18n.reset(); $.PrivateBin.I18n.reset();
const alias = $.PrivateBin.I18n._.apply(this, params); var alias = $.PrivateBin.I18n._.apply(this, params);
$.PrivateBin.I18n.reset(); $.PrivateBin.I18n.reset();
return translation === result && translation === alias; return translation === result && translation === alias;
} }
); );
jsc.property(
'replaces %s in strings with first given parameter into an element, encoding all, when no link is in the messageID',
'string',
'(small nearray) string',
'string',
function (prefix, params, postfix) {
prefix = prefix.replace(/%(s|d)/g, '%%').replace(/<a/g, '');
params[0] = params[0].replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, '%%').replace(/<a/g, '');
const translation = $('<textarea>').text((prefix + params[0] + postfix)).text();
let args = Array.prototype.slice.call(params);
args.unshift(prefix + '%s' + postfix);
let clean = jsdom();
$('body').html('<div id="i18n"></div>');
args.unshift($('#i18n'));
$.PrivateBin.I18n.translate.apply(this, args);
const result = $('#i18n').text();
$.PrivateBin.I18n.reset();
clean();
clean = jsdom();
$('body').html('<div id="i18n"></div>');
args[0] = $('#i18n');
$.PrivateBin.I18n._.apply(this, args);
const alias = $('#i18n').text();
$.PrivateBin.I18n.reset();
clean();
return translation === result && translation === alias;
}
);
jsc.property(
'replaces %s in strings with first given parameter into an element, encoding params only, when a link is part of the messageID inserted',
'string',
'(small nearray) string',
'string',
function (prefix, params, postfix) {
prefix = prefix.replace(/%(s|d)/g, '%%').trim();
params[0] = params[0].replace(/%(s|d)/g, '%%').trim();
postfix = postfix.replace(/%(s|d)/g, '%%').trim();
const translation = DOMPurify.sanitize(
prefix + '<a href="' + params[0] + '"></a>' + postfix, {
ALLOWED_TAGS: ['a', 'i', 'span'],
ALLOWED_ATTR: ['href', 'id']
}
);
let args = Array.prototype.slice.call(params);
args.unshift(prefix + '<a href="%s"></a>' + postfix);
let clean = jsdom();
$('body').html('<div id="i18n"></div>');
args.unshift($('#i18n'));
$.PrivateBin.I18n.translate.apply(this, args);
const result = $('#i18n').html();
$.PrivateBin.I18n.reset();
clean();
clean = jsdom();
$('body').html('<div id="i18n"></div>');
args[0] = $('#i18n');
$.PrivateBin.I18n._.apply(this, args);
const alias = $('#i18n').html();
$.PrivateBin.I18n.reset();
clean();
return translation === result && translation === alias;
}
);
}); });
describe('getPluralForm', function () { describe('getPluralForm', function () {

88
js/test/InitialCheck.js Normal file
View File

@@ -0,0 +1,88 @@
'use strict';
var common = require('../common');
describe('InitialCheck', function () {
describe('init', function () {
this.timeout(30000);
before(function () {
cleanup();
});
it('returns false and shows error, if a bot UA is detected', function () {
jsc.assert(jsc.forall(
'string',
jsc.elements(['Bot', 'bot']),
'string',
function (prefix, botBit, suffix) {
const clean = jsdom('', {
'userAgent': prefix + botBit + suffix
});
$('body').html(
'<html><body><div id="errormessage" class="hidden"></div>' +
'</body></html>'
);
$.PrivateBin.Alert.init();
window.crypto = new WebCrypto();
const result1 = !$.PrivateBin.InitialCheck.init(),
result2 = !$('#errormessage').hasClass('hidden');
clean();
return result1 && result2;
}
),
{tests: 10});
});
jsc.property(
'shows error, if no webcrypto is detected',
'bool',
jsc.elements(['localhost', '127.0.0.1', '[::1]', '']),
jsc.nearray(common.jscA2zString()),
jsc.elements(['.onion', '.i2p', '']),
function (secureProtocol, localhost, domain, tld) {
const isDomain = localhost === '',
isSecureContext = secureProtocol || !isDomain || tld.length > 0,
clean = jsdom('', {
'url': (secureProtocol ? 'https' : 'http' ) + '://' +
(isDomain ? domain.join('') + tld : localhost) + '/'
});
$('body').html(
'<html><body><div id="errormessage" class="hidden"></div>'+
'<div id="oldnotice" class="hidden"></div></body></html>'
);
$.PrivateBin.Alert.init();
const result1 = !$.PrivateBin.InitialCheck.init(),
result2 = isSecureContext === $('#errormessage').hasClass('hidden'),
result3 = !$('#oldnotice').hasClass('hidden');
clean();
return result1 && result2 && result3;
}
);
jsc.property(
'shows error, if HTTP only site is detected',
'bool',
jsc.elements(['localhost', '127.0.0.1', '[::1]', '']),
jsc.nearray(common.jscA2zString()),
jsc.elements(['.onion', '.i2p', '']),
function (secureProtocol, localhost, domain, tld) {
const isDomain = localhost === '',
isSecureContext = secureProtocol || !isDomain || tld.length > 0,
clean = jsdom('', {
'url': (secureProtocol ? 'https' : 'http' ) + '://' +
(isDomain ? domain.join('') + tld : localhost) + '/'
});
$('body').html(
'<html><body><div id="httpnotice" class="hidden"></div>'+
'</body></html>'
);
$.PrivateBin.Alert.init();
window.crypto = new WebCrypto();
const result1 = $.PrivateBin.InitialCheck.init(),
result2 = isSecureContext === $('#httpnotice').hasClass('hidden');
clean();
return result1 && result2;
}
);
});
});

View File

@@ -1,60 +0,0 @@
'use strict';
const common = require('../common');
describe('Memory', function () {
describe('add & refreshList', function () {
this.timeout(30000);
jsc.property(
'allows adding valid paste URLs',
common.jscSchemas(),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
'string',
function (schema, address, query, fragment) {
const expectedQuery = encodeURI(
query.join('').replace(/^&+|&+$/gm,'')
),
expected = schema + '://' + address.join('') + '/?' +
expectedQuery + '#' + fragment,
clean = jsdom();
$('body').html(
'<main><div id="sidebar-wrapper"><table><tbody>' +
'</tbody></table></div></main>'
);
// clear cache, then the first cell will match what we add
$.PrivateBin.Memory.init();
$.PrivateBin.Memory.add(expected);
$.PrivateBin.Memory.refreshList();
const result = $('#sidebar-wrapper table tbody tr td')[3].textContent;
clean();
return result === expectedQuery;
}
);
});
describe('init', function () {
it(
'enables toggling the memory sidebar',
function() {
$('body').html(
'<main><div id="sidebar-wrapper"></div>' +
'<button id="menu-toggle"></button></main>'
);
assert.ok(!$('main').hasClass('toggled'));
$('#menu-toggle').click();
assert.ok(!$('main').hasClass('toggled'));
$.PrivateBin.Memory.init();
assert.ok(!$('main').hasClass('toggled'));
$('#menu-toggle').click();
assert.ok($('main').hasClass('toggled'));
$('#menu-toggle').click();
assert.ok(!$('main').hasClass('toggled'));
}
);
});
});

View File

@@ -5,18 +5,18 @@ describe('Model', function () {
describe('getExpirationDefault', function () { describe('getExpirationDefault', function () {
before(function () { before(function () {
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
cleanup = jsdom(); cleanup();
}); });
jsc.property( jsc.property(
'returns the contents of the element with id "pasteExpiration"', 'returns the contents of the element with id "pasteExpiration"',
'nearray asciinestring', 'array asciinestring',
'string', 'string',
'small nat', 'small nat',
function (keys, value, key) { function (keys, value, key) {
keys = keys.map($.PrivateBin.Helper.htmlEntities); keys = keys.map(common.htmlEntities);
value = $.PrivateBin.Helper.htmlEntities(value); value = common.htmlEntities(value);
var content = keys.length > key ? keys[key] : keys[0], var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'),
contents = '<select id="pasteExpiration" name="pasteExpiration">'; contents = '<select id="pasteExpiration" name="pasteExpiration">';
keys.forEach(function(item) { keys.forEach(function(item) {
contents += '<option value="' + item + '"'; contents += '<option value="' + item + '"';
@@ -27,7 +27,7 @@ describe('Model', function () {
}); });
contents += '</select>'; contents += '</select>';
$('body').html(contents); $('body').html(contents);
var result = $.PrivateBin.Helper.htmlEntities( var result = common.htmlEntities(
$.PrivateBin.Model.getExpirationDefault() $.PrivateBin.Model.getExpirationDefault()
); );
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
@@ -39,20 +39,18 @@ describe('Model', function () {
describe('getFormatDefault', function () { describe('getFormatDefault', function () {
before(function () { before(function () {
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
});
after(function () {
cleanup(); cleanup();
}); });
jsc.property( jsc.property(
'returns the contents of the element with id "pasteFormatter"', 'returns the contents of the element with id "pasteFormatter"',
'nearray asciinestring', 'array asciinestring',
'string', 'string',
'small nat', 'small nat',
function (keys, value, key) { function (keys, value, key) {
keys = keys.map($.PrivateBin.Helper.htmlEntities); keys = keys.map(common.htmlEntities);
value = $.PrivateBin.Helper.htmlEntities(value); value = common.htmlEntities(value);
var content = keys.length > key ? keys[key] : keys[0], var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'),
contents = '<select id="pasteFormatter" name="pasteFormatter">'; contents = '<select id="pasteFormatter" name="pasteFormatter">';
keys.forEach(function(item) { keys.forEach(function(item) {
contents += '<option value="' + item + '"'; contents += '<option value="' + item + '"';
@@ -63,7 +61,7 @@ describe('Model', function () {
}); });
contents += '</select>'; contents += '</select>';
$('body').html(contents); $('body').html(contents);
var result = $.PrivateBin.Helper.htmlEntities( var result = common.htmlEntities(
$.PrivateBin.Model.getFormatDefault() $.PrivateBin.Model.getFormatDefault()
); );
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
@@ -76,6 +74,7 @@ describe('Model', function () {
this.timeout(30000); this.timeout(30000);
beforeEach(function () { beforeEach(function () {
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
cleanup();
}); });
jsc.property( jsc.property(
@@ -131,6 +130,7 @@ describe('Model', function () {
this.timeout(30000); this.timeout(30000);
beforeEach(function () { beforeEach(function () {
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
cleanup();
}); });
jsc.property( jsc.property(
@@ -238,6 +238,7 @@ describe('Model', function () {
describe('getTemplate', function () { describe('getTemplate', function () {
beforeEach(function () { beforeEach(function () {
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
cleanup();
}); });
jsc.property( jsc.property(

View File

@@ -36,6 +36,9 @@ describe('PasteStatus', function () {
describe('showRemainingTime', function () { describe('showRemainingTime', function () {
this.timeout(30000); this.timeout(30000);
before(function () {
cleanup();
});
jsc.property( jsc.property(
'shows burn after reading message or remaining time v1', 'shows burn after reading message or remaining time v1',
@@ -118,6 +121,10 @@ describe('PasteStatus', function () {
}); });
describe('hideMessages', function () { describe('hideMessages', function () {
before(function () {
cleanup();
});
it( it(
'hides all messages', 'hides all messages',
function() { function() {

View File

@@ -4,6 +4,9 @@ var common = require('../common');
describe('PasteViewer', function () { describe('PasteViewer', function () {
describe('run, hide, getText, setText, getFormat, setFormat & isPrettyPrinted', function () { describe('run, hide, getText, setText, getFormat, setFormat & isPrettyPrinted', function () {
this.timeout(30000); this.timeout(30000);
before(function () {
cleanup();
});
jsc.property( jsc.property(
'displays text according to format', 'displays text according to format',

View File

@@ -6,6 +6,10 @@ describe('Prompt', function () {
// in nodejs -> replace the prompt in the "page" template with a modal // in nodejs -> replace the prompt in the "page" template with a modal
describe('requestPassword & getPassword', function () { describe('requestPassword & getPassword', function () {
this.timeout(30000); this.timeout(30000);
before(function () {
$.PrivateBin.Model.reset();
cleanup();
});
jsc.property( jsc.property(
'returns the password fed into the dialog', 'returns the password fed into the dialog',
@@ -22,7 +26,6 @@ describe('Prompt', function () {
'password"></div><button type="submit">Decrypt</button>' + 'password"></div><button type="submit">Decrypt</button>' +
'</form></div></div></div></div>' '</form></div></div></div></div>'
); );
$.PrivateBin.Model.reset();
$.PrivateBin.Model.init(); $.PrivateBin.Model.init();
$.PrivateBin.Prompt.init(); $.PrivateBin.Prompt.init();
$.PrivateBin.Prompt.requestPassword(); $.PrivateBin.Prompt.requestPassword();

View File

@@ -118,6 +118,62 @@ describe('TopNav', function () {
); );
}); });
describe('showNewPasteButton', function () {
before(function () {
cleanup();
});
it(
'displays the button for creating a paste',
function () {
var results = [];
$('body').html(
'<nav><div id="navbar"><ul><li><button id="newbutton" type=' +
'"button" class="hidden">New</button></li></ul></div></nav>'
);
$.PrivateBin.TopNav.init();
results.push(
$('#newbutton').hasClass('hidden')
);
$.PrivateBin.TopNav.showNewPasteButton();
results.push(
!$('#newbutton').hasClass('hidden')
);
cleanup();
assert.ok(results.every(element => element));
}
);
});
describe('hideCloneButton', function () {
before(function () {
cleanup();
});
it(
'hides the button for cloning a paste',
function () {
var results = [];
$('body').html(
'<nav><div id="navbar"><ul><li><button id="clonebutton" ' +
'type="button" class="btn btn-warning navbar-btn">' +
'<span class="glyphicon glyphicon-duplicate" aria-hidden=' +
'"true"></span> Clone</button></li></ul></div></nav>'
);
$.PrivateBin.TopNav.init();
results.push(
!$('#clonebutton').hasClass('hidden')
);
$.PrivateBin.TopNav.hideCloneButton();
results.push(
$('#clonebutton').hasClass('hidden')
);
cleanup();
assert.ok(results.every(element => element));
}
);
});
describe('hideRawButton', function () { describe('hideRawButton', function () {
before(function () { before(function () {
cleanup(); cleanup();
@@ -270,7 +326,7 @@ describe('TopNav', function () {
'returns the currently selected expiration date', 'returns the currently selected expiration date',
function () { function () {
$.PrivateBin.TopNav.init(); $.PrivateBin.TopNav.init();
assert.ok($.PrivateBin.TopNav.getExpiration() === null); assert.ok($.PrivateBin.TopNav.getExpiration() === '1week');
} }
); );
}); });

View File

@@ -92,6 +92,9 @@
"@type": "dp:Second", "@type": "dp:Second",
"@minimum": 1 "@minimum": 1
}, },
"Challenge": {
"@type": "pb:Base64"
},
"CipherParameters": { "CipherParameters": {
"@container": "@list", "@container": "@list",
"@value": [ "@value": [

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -38,7 +38,6 @@ class Configuration
private static $_defaults = array( private static $_defaults = array(
'main' => array( 'main' => array(
'name' => 'PrivateBin', 'name' => 'PrivateBin',
'basepath' => '',
'discussion' => true, 'discussion' => true,
'opendiscussion' => false, 'opendiscussion' => false,
'password' => true, 'password' => true,
@@ -46,7 +45,7 @@ class Configuration
'burnafterreadingselected' => false, 'burnafterreadingselected' => false,
'defaultformatter' => 'plaintext', 'defaultformatter' => 'plaintext',
'syntaxhighlightingtheme' => null, 'syntaxhighlightingtheme' => null,
'sizelimit' => 10485760, 'sizelimit' => 2097152,
'template' => 'bootstrap', 'template' => 'bootstrap',
'notice' => '', 'notice' => '',
'languageselection' => false, 'languageselection' => false,
@@ -54,7 +53,7 @@ class Configuration
'urlshortener' => '', 'urlshortener' => '',
'qrcode' => true, 'qrcode' => true,
'icon' => 'identicon', 'icon' => 'identicon',
'cspheader' => 'default-src \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'unsafe-eval\' resource:; style-src \'self\'; font-src \'self\'; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-downloads', 'cspheader' => 'default-src \'none\'; manifest-src \'self\'; connect-src *; script-src \'self\' \'unsafe-eval\'; style-src \'self\'; font-src \'self\'; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals',
'zerobincompatibility' => false, 'zerobincompatibility' => false,
'httpwarning' => true, 'httpwarning' => true,
'compression' => 'zlib', 'compression' => 'zlib',
@@ -103,9 +102,8 @@ class Configuration
public function __construct() public function __construct()
{ {
$config = array(); $config = array();
$basePath = (getenv('CONFIG_PATH') !== false ? getenv('CONFIG_PATH') : PATH . 'cfg') . DIRECTORY_SEPARATOR; $configFile = PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.php';
$configIni = $basePath . 'conf.ini'; $configIni = PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini';
$configFile = $basePath . 'conf.php';
// rename INI files to avoid configuration leakage // rename INI files to avoid configuration leakage
if (is_readable($configIni)) { if (is_readable($configIni)) {
@@ -114,7 +112,7 @@ class Configuration
// cleanup sample, too // cleanup sample, too
$configIniSample = $configIni . '.sample'; $configIniSample = $configIni . '.sample';
if (is_readable($configIniSample)) { if (is_readable($configIniSample)) {
DataStore::prependRename($configIniSample, $basePath . 'conf.sample.php', ';'); DataStore::prependRename($configIniSample, PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.sample.php', ';');
} }
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -28,14 +28,14 @@ class Controller
* *
* @const string * @const string
*/ */
const VERSION = '1.3.4'; const VERSION = '1.2.1';
/** /**
* minimal required PHP version * minimal required PHP version
* *
* @const string * @const string
*/ */
const MIN_PHP_VERSION = '5.6.0'; const MIN_PHP_VERSION = '5.5.0';
/** /**
* show the same error message if the paste expired or does not exist * show the same error message if the paste expired or does not exist
@@ -196,20 +196,15 @@ class Controller
*/ */
private function _create() private function _create()
{ {
try { // Ensure last paste from visitors IP address was more than configured amount of seconds ago.
// Ensure last paste from visitors IP address was more than configured amount of seconds ago. TrafficLimiter::setConfiguration($this->_conf);
TrafficLimiter::setConfiguration($this->_conf); if (!TrafficLimiter::canPass()) {
if (!TrafficLimiter::canPass()) { $this->_return_message(
$this->_return_message( 1, I18n::_(
1, I18n::_( 'Please wait %d seconds between each post.',
'Please wait %d seconds between each post.', $this->_conf->getKey('limit', 'traffic')
$this->_conf->getKey('limit', 'traffic') )
) );
);
return;
}
} catch (Exception $e) {
$this->_return_message(1, I18n::_($e->getMessage()));
return; return;
} }
@@ -281,7 +276,7 @@ class Controller
// accessing this method ensures that the paste would be // accessing this method ensures that the paste would be
// deleted if it has already expired // deleted if it has already expired
$paste->get(); $paste->get();
if (hash_equals($paste->getDeleteToken(), $deletetoken)) { if ($paste->isDeleteTokenCorrect($deletetoken)) {
// Paste exists and deletion token is valid: Delete the paste. // Paste exists and deletion token is valid: Delete the paste.
$paste->delete(); $paste->delete();
$this->_status = 'Paste was properly deleted.'; $this->_status = 'Paste was properly deleted.';
@@ -318,9 +313,20 @@ class Controller
try { try {
$paste = $this->_model->getPaste($dataid); $paste = $this->_model->getPaste($dataid);
if ($paste->exists()) { if ($paste->exists()) {
// handle challenge response
if (!$paste->isTokenCorrect($this->_request->getParam('token'))) {
// we send a generic error to avoid leaking information
// about the existance of a burn after reading pastes
// this avoids an attacker being able to poll, if it has
// been read by the intended recipient or not
$this->_return_message(1, self::GENERIC_ERROR);
return;
}
$data = $paste->get(); $data = $paste->get();
if (array_key_exists('salt', $data['meta'])) { foreach (array('salt', 'challenge') as $key) {
unset($data['meta']['salt']); if (array_key_exists($key, $data['meta'])) {
unset($data['meta'][$key]);
}
} }
$this->_return_message(0, $dataid, (array) $data); $this->_return_message(0, $dataid, (array) $data);
} else { } else {
@@ -369,7 +375,6 @@ class Controller
$page = new View; $page = new View;
$page->assign('NAME', $this->_conf->getKey('name')); $page->assign('NAME', $this->_conf->getKey('name'));
$page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath')));
$page->assign('ERROR', I18n::_($this->_error)); $page->assign('ERROR', I18n::_($this->_error));
$page->assign('STATUS', I18n::_($this->_status)); $page->assign('STATUS', I18n::_($this->_status));
$page->assign('VERSION', self::VERSION); $page->assign('VERSION', self::VERSION);
@@ -392,7 +397,6 @@ class Controller
$page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener')); $page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener'));
$page->assign('QRCODE', $this->_conf->getKey('qrcode')); $page->assign('QRCODE', $this->_conf->getKey('qrcode'));
$page->assign('HTTPWARNING', $this->_conf->getKey('httpwarning')); $page->assign('HTTPWARNING', $this->_conf->getKey('httpwarning'));
$page->assign('HTTPSLINK', 'https://' . $this->_request->getHost() . $this->_request->getRequestUri());
$page->assign('COMPRESSION', $this->_conf->getKey('compression')); $page->assign('COMPRESSION', $this->_conf->getKey('compression'));
$page->draw($this->_conf->getKey('template')); $page->draw($this->_conf->getKey('template'));
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;
@@ -597,8 +597,6 @@ class Database extends AbstractData
/** /**
* get the data type, depending on the database driver * get the data type, depending on the database driver
* *
* PostgreSQL uses a different API for BLOBs then SQL, hence we use TEXT
*
* @access private * @access private
* @static * @static
* @return string * @return string
@@ -611,8 +609,6 @@ class Database extends AbstractData
/** /**
* get the attachment type, depending on the database driver * get the attachment type, depending on the database driver
* *
* PostgreSQL uses a different API for BLOBs then SQL, hence we use TEXT
*
* @access private * @access private
* @static * @static
* @return string * @return string
@@ -632,17 +628,16 @@ class Database extends AbstractData
{ {
list($main_key, $after_key) = self::_getPrimaryKeyClauses(); list($main_key, $after_key) = self::_getPrimaryKeyClauses();
$dataType = self::_getDataType(); $dataType = self::_getDataType();
$attachmentType = self::_getAttachmentType();
self::$_db->exec( self::$_db->exec(
'CREATE TABLE ' . self::_sanitizeIdentifier('paste') . ' ( ' . 'CREATE TABLE ' . self::_sanitizeIdentifier('paste') . ' ( ' .
"dataid CHAR(16) NOT NULL$main_key, " . "dataid CHAR(16) NOT NULL$main_key, " .
"data $attachmentType, " . "data $dataType, " .
'postdate INT, ' . 'postdate INT, ' .
'expiredate INT, ' . 'expiredate INT, ' .
'opendiscussion INT, ' . 'opendiscussion INT, ' .
'burnafterreading INT, ' . 'burnafterreading INT, ' .
'meta TEXT, ' . 'meta TEXT, ' .
"attachment $attachmentType, " . 'attachment ' . self::_getAttachmentType() . ', ' .
"attachmentname $dataType$after_key );" "attachmentname $dataType$after_key );"
); );
} }
@@ -715,8 +710,7 @@ class Database extends AbstractData
*/ */
private static function _upgradeDatabase($oldversion) private static function _upgradeDatabase($oldversion)
{ {
$dataType = self::_getDataType(); $dataType = self::_getDataType();
$attachmentType = self::_getAttachmentType();
switch ($oldversion) { switch ($oldversion) {
case '0.21': case '0.21':
// create the meta column if necessary (pre 0.21 change) // create the meta column if necessary (pre 0.21 change)
@@ -728,7 +722,7 @@ class Database extends AbstractData
// SQLite only allows one ALTER statement at a time... // SQLite only allows one ALTER statement at a time...
self::$_db->exec( self::$_db->exec(
'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') .
" ADD COLUMN attachment $attachmentType;" ' ADD COLUMN attachment ' . self::_getAttachmentType() . ';'
); );
self::$_db->exec( self::$_db->exec(
'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . " ADD COLUMN attachmentname $dataType;" 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . " ADD COLUMN attachmentname $dataType;"
@@ -738,7 +732,7 @@ class Database extends AbstractData
if (self::$_type !== 'sqlite') { if (self::$_type !== 'sqlite') {
self::$_db->exec( self::$_db->exec(
'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') .
" ADD PRIMARY KEY (dataid), MODIFY COLUMN data $dataType;" ' ADD PRIMARY KEY (dataid), MODIFY COLUMN data $dataType;'
); );
self::$_db->exec( self::$_db->exec(
'ALTER TABLE ' . self::_sanitizeIdentifier('comment') . 'ALTER TABLE ' . self::_sanitizeIdentifier('comment') .
@@ -760,17 +754,6 @@ class Database extends AbstractData
self::_sanitizeIdentifier('comment') . '(pasteid);' self::_sanitizeIdentifier('comment') . '(pasteid);'
); );
// no break, continue with updates for 0.22 and later // no break, continue with updates for 0.22 and later
case '1.3':
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB and PostgreSQL uses TEXT, so there is no need
// to change it there
if (self::$_type !== 'sqlite' && self::$_type !== 'pgsql') {
self::$_db->exec(
'ALTER TABLE ' . self::_sanitizeIdentifier('paste') .
" MODIFY COLUMN data $attachmentType;"
);
}
// no break, continue with updates for all newer versions
default: default:
self::_exec( self::_exec(
'UPDATE ' . self::_sanitizeIdentifier('config') . 'UPDATE ' . self::_sanitizeIdentifier('config') .

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -68,4 +68,24 @@ class Filter
} }
return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]); return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]);
} }
/**
* fixed time string comparison operation to prevent timing attacks
* https://crackstation.net/hashing-security.htm?=rd#slowequals
* can be replaced with hash_equals() after we drop PHP 5.5 support
*
* @access public
* @static
* @param string $a
* @param string $b
* @return bool
*/
public static function slowEquals($a, $b)
{
$diff = strlen($a) ^ strlen($b);
for ($i = 0; $i < strlen($a) && $i < strlen($b); ++$i) {
$diff |= ord($a[$i]) ^ ord($b[$i]);
}
return $diff === 0;
}
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -67,6 +67,13 @@ class FormatV2
if (!($ct = base64_decode($message['ct'], true))) { if (!($ct = base64_decode($message['ct'], true))) {
return false; return false;
} }
// - (optional) challenge
if (
!$isComment && array_key_exists('challenge', $message['meta']) &&
!base64_decode($message['meta']['challenge'], true)
) {
return false;
}
// Make sure some fields have a reasonable size: // Make sure some fields have a reasonable size:
// - initialization vector // - initialization vector
@@ -116,8 +123,7 @@ class FormatV2
// require only the key 'expire' in the metadata of pastes // require only the key 'expire' in the metadata of pastes
if (!$isComment && ( if (!$isComment && (
count($message['meta']) === 0 || count($message['meta']) === 0 ||
!array_key_exists('expire', $message['meta']) || !array_key_exists('expire', $message['meta'])
count($message['meta']) > 1
)) { )) {
return false; return false;
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -125,31 +125,9 @@ class I18n
} else { } else {
$args[0] = self::$_translations[$messageId]; $args[0] = self::$_translations[$messageId];
} }
// encode any non-integer arguments and the message ID, if it doesn't contain a link
$argsCount = count($args);
if ($argsCount > 1) {
for ($i = 0; $i < $argsCount; ++$i) {
if (($i > 0 && !is_int($args[$i])) || strpos($args[0], '<a') === false) {
$args[$i] = self::encode($args[$i]);
}
}
}
return call_user_func_array('sprintf', $args); return call_user_func_array('sprintf', $args);
} }
/**
* encode HTML entities for output into an HTML5 document
*
* @access public
* @static
* @param string $string
* @return string
*/
public static function encode($string)
{
return htmlspecialchars($string, ENT_QUOTES | ENT_HTML5 | ENT_DISALLOWED, 'UTF-8', false);
}
/** /**
* loads translations * loads translations
* *
@@ -199,6 +177,7 @@ class I18n
self::$_availableLanguages[] = $match[1]; self::$_availableLanguages[] = $match[1];
} }
} }
self::$_availableLanguages[] = 'en';
} }
return self::$_availableLanguages; return self::$_availableLanguages;
} }
@@ -324,11 +303,10 @@ class I18n
case 'pl': case 'pl':
return $n == 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); return $n == 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'ru': case 'ru':
case 'uk':
return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'sl': case 'sl':
return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0)); return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0));
// bg, de, en, es, hu, it, nl, no, pt // de, en, es, hu, it, nl, no, pt
default: default:
return $n != 1 ? 1 : 0; return $n != 1 ? 1 : 0;
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;

View File

@@ -7,13 +7,14 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;
use Exception; use Exception;
use PrivateBin\Controller; use PrivateBin\Controller;
use PrivateBin\Filter;
use PrivateBin\Persistence\ServerSalt; use PrivateBin\Persistence\ServerSalt;
/** /**
@@ -23,6 +24,14 @@ use PrivateBin\Persistence\ServerSalt;
*/ */
class Paste extends AbstractModel class Paste extends AbstractModel
{ {
/**
* Token for challenge/response.
*
* @access protected
* @var string
*/
protected $_token = '';
/** /**
* Get paste data. * Get paste data.
* *
@@ -32,6 +41,11 @@ class Paste extends AbstractModel
*/ */
public function get() public function get()
{ {
// return cached result if one is found
if (array_key_exists('adata', $this->_data) || array_key_exists('data', $this->_data)) {
return $this->_data;
}
$data = $this->_store->read($this->getId()); $data = $this->_store->read($this->getId());
if ($data === false) { if ($data === false) {
throw new Exception(Controller::GENERIC_ERROR, 64); throw new Exception(Controller::GENERIC_ERROR, 64);
@@ -48,10 +62,16 @@ class Paste extends AbstractModel
unset($data['meta']['expire_date']); unset($data['meta']['expire_date']);
} }
// check if non-expired burn after reading paste needs to be deleted // check if non-expired burn after reading paste needs to be deleted,
// but don't delete it if an incorrect token was sent
if ( if (
(array_key_exists('adata', $data) && $data['adata'][3] === 1) || (
(array_key_exists('burnafterreading', $data['meta']) && $data['meta']['burnafterreading']) (array_key_exists('adata', $data) && $data['adata'][3] === 1) ||
(array_key_exists('burnafterreading', $data['meta']) && $data['meta']['burnafterreading'])
) && (
!array_key_exists('challenge', $data['meta']) ||
$this->_token === $data['meta']['challenge']
)
) { ) {
$this->delete(); $this->delete();
} }
@@ -94,6 +114,12 @@ class Paste extends AbstractModel
$this->_data['meta']['created'] = time(); $this->_data['meta']['created'] = time();
$this->_data['meta']['salt'] = serversalt::generate(); $this->_data['meta']['salt'] = serversalt::generate();
// if a challenge was sent, we store the HMAC of paste ID & challenge
if (array_key_exists('challenge', $this->_data['meta'])) {
$this->_data['meta']['challenge'] = base64_encode(hash_hmac(
'sha256', $this->getId(), base64_decode($this->_data['meta']['challenge']), true
));
}
// store paste // store paste
if ( if (
@@ -201,6 +227,40 @@ class Paste extends AbstractModel
(array_key_exists('opendiscussion', $this->_data['meta']) && $this->_data['meta']['opendiscussion']); (array_key_exists('opendiscussion', $this->_data['meta']) && $this->_data['meta']['opendiscussion']);
} }
/**
* Check if paste challenge matches provided token.
*
* @access public
* @param string $token
* @throws Exception
* @return bool
*/
public function isTokenCorrect($token)
{
$this->_token = $token;
if (!array_key_exists('challenge', $this->_data['meta'])) {
$this->get();
}
if (array_key_exists('challenge', $this->_data['meta'])) {
return Filter::slowEquals($token, $this->_data['meta']['challenge']);
}
// paste created without challenge, accept every token sent
return true;
}
/**
* Check if paste salt based HMAC matches provided delete token.
*
* @access public
* @param string $deletetoken
* @throws Exception
* @return bool
*/
public function isDeleteTokenCorrect($deletetoken)
{
return Filter::slowEquals($deletetoken, $this->getDeleteToken());
}
/** /**
* Sanitizes data to conform with current configuration. * Sanitizes data to conform with current configuration.
* *

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@@ -193,19 +193,6 @@ class Request
$this->_params[$param] : $default; $this->_params[$param] : $default;
} }
/**
* Get host as requested by the client
*
* @access public
* @return string
*/
public function getHost()
{
return array_key_exists('HTTP_HOST', $_SERVER) ?
htmlspecialchars($_SERVER['HTTP_HOST']) :
'localhost';
}
/** /**
* Get request URI * Get request URI
* *
@@ -215,8 +202,8 @@ class Request
public function getRequestUri() public function getRequestUri()
{ {
return array_key_exists('REQUEST_URI', $_SERVER) ? return array_key_exists('REQUEST_URI', $_SERVER) ?
htmlspecialchars( htmlspecialchars(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
) : '/'; ) : '/';
} }

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.3.4 * @version 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@@ -8,7 +8,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd * @link http://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.0.5 beta PrivateBin 1.3.4 * @version 0.0.5 beta PrivateBin 1.2.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@@ -5,9 +5,5 @@
# directory. # directory.
User-agent: * User-agent: *
Allow: /index.php
Disallow: / Disallow: /
# If you don't want this instance to be listed on https://privatebin.info/directory/
# uncomment the following lines:
#User-agent: PrivateBinDirectoryBot
#Disallow: /

View File

@@ -4,7 +4,7 @@ $isCpct = substr($template, 9, 8) === '-compact';
$isDark = substr($template, 9, 5) === '-dark'; $isDark = substr($template, 9, 5) === '-dark';
$isPage = substr($template, -5) === '-page'; $isPage = substr($template, -5) === '-page';
?><!DOCTYPE html> ?><!DOCTYPE html>
<html lang="<?php echo I18n::_('en'); ?>"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -13,7 +13,7 @@ $isPage = substr($template, -5) === '-page';
<meta name="google" content="notranslate"> <meta name="google" content="notranslate">
<title><?php echo I18n::_($NAME); ?></title> <title><?php echo I18n::_($NAME); ?></title>
<?php <?php
if (!$isDark) : if (!$isDark):
?> ?>
<link type="text/css" rel="stylesheet" href="css/bootstrap/bootstrap-3.4.1.css" /> <link type="text/css" rel="stylesheet" href="css/bootstrap/bootstrap-3.4.1.css" />
<?php <?php
@@ -21,7 +21,7 @@ endif;
?> ?>
<link type="text/css" rel="stylesheet" href="css/bootstrap/bootstrap-theme-3.4.1.css" /> <link type="text/css" rel="stylesheet" href="css/bootstrap/bootstrap-theme-3.4.1.css" />
<?php <?php
if ($isDark) : if ($isDark):
?> ?>
<link type="text/css" rel="stylesheet" href="css/bootstrap/darkstrap-0.9.3.css" /> <link type="text/css" rel="stylesheet" href="css/bootstrap/darkstrap-0.9.3.css" />
<?php <?php
@@ -29,11 +29,11 @@ endif;
?> ?>
<link type="text/css" rel="stylesheet" href="css/bootstrap/privatebin.css?<?php echo rawurlencode($VERSION); ?>" /> <link type="text/css" rel="stylesheet" href="css/bootstrap/privatebin.css?<?php echo rawurlencode($VERSION); ?>" />
<?php <?php
if ($SYNTAXHIGHLIGHTING) : if ($SYNTAXHIGHLIGHTING):
?> ?>
<link type="text/css" rel="stylesheet" href="css/prettify/prettify.css?<?php echo rawurlencode($VERSION); ?>" /> <link type="text/css" rel="stylesheet" href="css/prettify/prettify.css?<?php echo rawurlencode($VERSION); ?>" />
<?php <?php
if (strlen($SYNTAXHIGHLIGHTINGTHEME)) : if (strlen($SYNTAXHIGHLIGHTINGTHEME)):
?> ?>
<link type="text/css" rel="stylesheet" href="css/prettify/<?php echo rawurlencode($SYNTAXHIGHLIGHTINGTHEME); ?>.css?<?php echo rawurlencode($VERSION); ?>" /> <link type="text/css" rel="stylesheet" href="css/prettify/<?php echo rawurlencode($SYNTAXHIGHLIGHTINGTHEME); ?>.css?<?php echo rawurlencode($VERSION); ?>" />
<?php <?php
@@ -43,57 +43,46 @@ endif;
<noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript> <noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript>
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.4.1.js" integrity="sha512-bnIvzh6FU75ZKxp0GXLH9bewza/OIw6dLVh9ICg0gogclmYGguQJWl8U30WpbsGTqbIiAwxTsbe76DErLq5EDQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/jquery-3.4.1.js" integrity="sha512-bnIvzh6FU75ZKxp0GXLH9bewza/OIw6dLVh9ICg0gogclmYGguQJWl8U30WpbsGTqbIiAwxTsbe76DErLq5EDQ==" crossorigin="anonymous"></script>
<?php <?php
if ($QRCODE) : if ($QRCODE):
?> ?>
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.6.0.js" integrity="sha512-GEEIHvphDt1NmaxzX8X1ZkBiGKXCv+Ofzwi8SMEH5wQVWqdGIvBO/fnxxKZ90RU1bVp6srS68nHIpZo6iVcG9g==" crossorigin="anonymous"></script> <script async type="text/javascript" data-cfasync="false" src="js/kjua-0.6.0.js" integrity="sha512-GEEIHvphDt1NmaxzX8X1ZkBiGKXCv+Ofzwi8SMEH5wQVWqdGIvBO/fnxxKZ90RU1bVp6srS68nHIpZo6iVcG9g==" crossorigin="anonymous"></script>
<?php <?php
endif; endif;
if ($ZEROBINCOMPATIBILITY) : if ($ZEROBINCOMPATIBILITY):
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
<?php <?php
endif; endif;
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/zlib-1.2.11.js" integrity="sha512-Yey/0yoaVmSbqMEyyff3DIu8kCPwpHvHf7tY1AuZ1lrX9NPCMg87PwzngMi+VNbe4ilCApmePeuKT869RTcyCQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/zlib-1.2.11.js" integrity="sha512-Yey/0yoaVmSbqMEyyff3DIu8kCPwpHvHf7tY1AuZ1lrX9NPCMg87PwzngMi+VNbe4ilCApmePeuKT869RTcyCQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/base-x-3.0.7.js" integrity="sha512-/Bi1AJIP0TtxEB+Jh6Hk809H1G7vn4iJV80qagslf0+Hm0UjUi1s3qNrn1kZULjzUYuaf6ck0ndLGJ7MxWLmgQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/base-x-3.0.5.1.js" integrity="sha512-/zL3MWKMtl1IBF0URx3laql2jUw+rWfFFabNlILY/Qm+hUsQR/XULjUyNHkW/FkrV7A0sMQ7tsppH7sj5ht8wA==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/bootstrap-3.3.7.js" integrity="sha512-iztkobsvnjKfAtTNdHkGVjAYTrrtlC7mGp/54c40wowO7LhURYl3gVzzcEqGl/qKXQltJ2HwMrdLcNUdo+N/RQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/bootstrap-3.3.7.js" integrity="sha512-iztkobsvnjKfAtTNdHkGVjAYTrrtlC7mGp/54c40wowO7LhURYl3gVzzcEqGl/qKXQltJ2HwMrdLcNUdo+N/RQ==" crossorigin="anonymous"></script>
<?php <?php
if ($SYNTAXHIGHLIGHTING) : if ($SYNTAXHIGHLIGHTING):
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
<?php <?php
endif; endif;
if ($MARKDOWN) : if ($MARKDOWN):
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/showdown-1.9.1.js" integrity="sha512-nRri7kqh3iRLdHbhtjfe8w9eAQPmt+ubH5U88UZyKbz6O9Q0q4haaXF0krOUclKmRJou/kKZYulgBHvHXPqOvg==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/showdown-1.9.0.js" integrity="sha512-Kv8oAge9h2QmRyzb52jUomyXAvSMrpE9kWF3QRMFajo1a/TXjtY8u71vUA6t4+LE7huz4TSVH8VLJBEmcZiPRA==" crossorigin="anonymous"></script>
<?php <?php
endif; endif;
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/purify-2.1.1.js" integrity="sha512-0RqB620aQhcT40T4kxf/vx3J4DOmFsqcGu2mPha21ZqufRsth3MsiU35ffSHX0OIJbE92XSKyvNcL1I6sYhh4w==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/purify-1.0.11.js" integrity="sha512-p7UyJuyBkhMcMgE4mDsgK0Lz70OvetLefua1oXs1OujWv9gOxh4xy8InFux7bZ4/DAZsTmO4rgVwZW9BHKaTaw==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/legacy.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-r9MutKcgP/igbs8aUbENyJEie7LMyJ22f2On0RwGL0Hq0seJnmnPo4avDfhR0E/TZWDoux2arzxYHneH2/Ltmw==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-9cJdKFvcsrk3G411+Wp5Y6ZvFE6UUMKVzCB6LLXhg1BaN/jkviL01Ox+4HzbYNflFuSYK0USVFLeCW89774A6w==" crossorigin="anonymous"></script> <!--[if IE]>
<!-- icon --> <style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;}</style>
<link rel="apple-touch-icon" href="<?php echo I18n::encode($BASEPATH); ?>img/apple-touch-icon.png" sizes="180x180" /> <![endif]-->
<link rel="icon" type="image/png" href="img/favicon-32x32.png" sizes="32x32" /> <link rel="apple-touch-icon" href="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" sizes="180x180" />
<link rel="icon" type="image/png" href="img/favicon-16x16.png" sizes="16x16" /> <link rel="icon" type="image/png" href="img/favicon-32x32.png?<?php echo rawurlencode($VERSION); ?>" sizes="32x32" />
<link rel="icon" type="image/png" href="img/favicon-16x16.png?<?php echo rawurlencode($VERSION); ?>" sizes="16x16" />
<link rel="manifest" href="manifest.json?<?php echo rawurlencode($VERSION); ?>" /> <link rel="manifest" href="manifest.json?<?php echo rawurlencode($VERSION); ?>" />
<link rel="mask-icon" href="img/safari-pinned-tab.svg" color="#ffcc00" /> <link rel="mask-icon" href="img/safari-pinned-tab.svg?<?php echo rawurlencode($VERSION); ?>" color="#ffcc00" />
<link rel="shortcut icon" href="img/favicon.ico"> <link rel="shortcut icon" href="img/favicon.ico">
<meta name="msapplication-config" content="browserconfig.xml"> <meta name="msapplication-config" content="browserconfig.xml">
<meta name="theme-color" content="#ffe57e" /> <meta name="theme-color" content="#ffe57e" />
<!-- Twitter/social media cards -->
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="<?php echo I18n::_('Encrypted note on PrivateBin') ?>" />
<meta name="twitter:description" content="<?php echo I18n::_('Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.') ?>" />
<meta name="twitter:image" content="<?php echo I18n::encode($BASEPATH); ?>img/apple-touch-icon.png" />
<meta property="og:title" content="<?php echo I18n::_($NAME); ?>" />
<meta property="og:site_name" content="<?php echo I18n::_($NAME); ?>" />
<meta property="og:description" content="<?php echo I18n::_('Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.') ?>" />
<meta property="og:image" content="<?php echo I18n::encode($BASEPATH); ?>img/apple-touch-icon.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="180" />
<meta property="og:image:height" content="180" />
</head> </head>
<body role="document" data-compression="<?php echo rawurlencode($COMPRESSION); ?>"<?php <body role="document" data-compression="<?php echo rawurlencode($COMPRESSION); ?>"<?php
$class = array(); $class = array();
@@ -123,7 +112,7 @@ if (count($class)) {
</div> </div>
</div> </div>
<?php <?php
if ($QRCODE) : if ($QRCODE):
?> ?>
<div id="qrcodemodal" tabindex="-1" class="modal fade" aria-labelledby="qrcodemodalTitle" role="dialog" aria-hidden="true"> <div id="qrcodemodal" tabindex="-1" class="modal fade" aria-labelledby="qrcodemodalTitle" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
@@ -131,43 +120,15 @@ if ($QRCODE) :
<div class="modal-body"> <div class="modal-body">
<div class="mx-auto" id="qrcode-display"></div> <div class="mx-auto" id="qrcode-display"></div>
</div> </div>
<div class="row"> <button type="button" class="btn btn-primary btn-block" data-dismiss="modal"><?php echo I18n::_('Close') ?></button>
<div class="btn-group col-xs-12">
<span class="col-xs-12">
<button type="button" class="btn btn-primary btn-block" data-dismiss="modal"><?php echo I18n::_('Close') ?></button>
</span>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<?php <?php
endif; endif;
?> ?>
<div id="emailconfirmmodal" tabindex="-1" class="modal fade" aria-labelledby="emailconfirmmodalTitle" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<div id="emailconfirm-display"></div>
</div>
<div class="row">
<div class="btn-group col-xs-12" data-toggle="buttons">
<span class="col-xs-12 col-md-4">
<button id="emailconfirm-timezone-current" type="button" class="btn btn-danger btn-block" data-dismiss="modal"><?php echo I18n::_('Use Current Timezone') ?></button>
</span>
<span class="col-xs-12 col-md-4">
<button id="emailconfirm-timezone-utc" type="button" class="btn btn-default btn-block" data-dismiss="modal"><?php echo I18n::_('Convert To UTC') ?></button>
</span>
<span class="col-xs-12 col-md-4">
<button type="button" class="btn btn-primary btn-block" data-dismiss="modal"><?php echo I18n::_('Close') ?></button>
</span>
</div>
</div>
</div>
</div>
</div>
<nav class="navbar navbar-<?php echo $isDark ? 'inverse' : 'default'; ?> navbar-<?php echo $isCpct ? 'fixed' : 'static'; ?>-top"><?php <nav class="navbar navbar-<?php echo $isDark ? 'inverse' : 'default'; ?> navbar-<?php echo $isCpct ? 'fixed' : 'static'; ?>-top"><?php
if ($isCpct) : if ($isCpct):
?><div class="container"><?php ?><div class="container"><?php
endif; endif;
?> ?>
@@ -195,11 +156,11 @@ endif;
</li> </li>
<li> <li>
<?php <?php
if ($isPage) : if ($isPage):
?> ?>
<button id="sendbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> navbar-btn"> <button id="sendbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> navbar-btn">
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL; <span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL;
else : else:
?> ?>
<button id="newbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn"> <button id="newbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL; <span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL;
@@ -212,11 +173,8 @@ endif;
<button id="rawtextbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn"> <button id="rawtextbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> <?php echo I18n::_('Raw text'), PHP_EOL; ?> <span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> <?php echo I18n::_('Raw text'), PHP_EOL; ?>
</button> </button>
<button id="emaillink" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> <?php echo I18n::_('Email'), PHP_EOL; ?>
</button>
<?php <?php
if ($QRCODE) : if ($QRCODE):
?> ?>
<button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn"> <button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span> <?php echo I18n::_('QR code'), PHP_EOL; ?> <span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span> <?php echo I18n::_('QR code'), PHP_EOL; ?>
@@ -224,17 +182,14 @@ if ($QRCODE) :
<?php <?php
endif; endif;
?> ?>
<button id="rememberbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-star" aria-hidden="true"></span> <?php echo I18n::_('Remember'), PHP_EOL; ?>
</button>
</li> </li>
<li class="dropdown"> <li class="dropdown">
<select id="pasteExpiration" name="pasteExpiration" class="hidden"> <select id="pasteExpiration" name="pasteExpiration" class="hidden">
<?php <?php
foreach ($EXPIRE as $key => $value) : foreach ($EXPIRE as $key => $value):
?> ?>
<option value="<?php echo $key; ?>"<?php <option value="<?php echo $key; ?>"<?php
if ($key == $EXPIREDEFAULT) : if ($key == $EXPIREDEFAULT):
?> selected="selected"<?php ?> selected="selected"<?php
endif; endif;
?>><?php echo $value; ?></option> ?>><?php echo $value; ?></option>
@@ -245,7 +200,7 @@ endforeach;
<a id="expiration" href="#" class="hidden dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Expires'); ?>: <span id="pasteExpirationDisplay"><?php echo $EXPIRE[$EXPIREDEFAULT]; ?></span> <span class="caret"></span></a> <a id="expiration" href="#" class="hidden dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Expires'); ?>: <span id="pasteExpirationDisplay"><?php echo $EXPIRE[$EXPIREDEFAULT]; ?></span> <span class="caret"></span></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<?php <?php
foreach ($EXPIRE as $key => $value) : foreach ($EXPIRE as $key => $value):
?> ?>
<li> <li>
<a href="#" data-expiration="<?php echo $key; ?>"> <a href="#" data-expiration="<?php echo $key; ?>">
@@ -258,7 +213,7 @@ endforeach;
</ul> </ul>
</li> </li>
<?php <?php
if ($isCpct) : if ($isCpct):
?> ?>
<li class="dropdown"> <li class="dropdown">
<a id="formatter" href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Options'); ?> <span class="caret"></span></a> <a id="formatter" href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Options'); ?> <span class="caret"></span></a>
@@ -266,7 +221,7 @@ if ($isCpct) :
<li id="burnafterreadingoption" class="checkbox hidden"> <li id="burnafterreadingoption" class="checkbox hidden">
<label> <label>
<input type="checkbox" id="burnafterreading" name="burnafterreading"<?php <input type="checkbox" id="burnafterreading" name="burnafterreading"<?php
if ($BURNAFTERREADINGSELECTED) : if ($BURNAFTERREADINGSELECTED):
?> checked="checked"<?php ?> checked="checked"<?php
endif; endif;
?> /> ?> />
@@ -274,12 +229,12 @@ if ($isCpct) :
</label> </label>
</li> </li>
<?php <?php
if ($DISCUSSION) : if ($DISCUSSION):
?> ?>
<li id="opendiscussionoption" class="checkbox hidden"> <li id="opendiscussionoption" class="checkbox hidden">
<label> <label>
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php <input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
if ($OPENDISCUSSION) : if ($OPENDISCUSSION):
?> checked="checked"<?php ?> checked="checked"<?php
endif; endif;
?> /> ?> />
@@ -296,7 +251,7 @@ if ($isCpct) :
</div> </div>
</li> </li>
<?php <?php
foreach ($FORMATTER as $key => $value) : foreach ($FORMATTER as $key => $value):
?> ?>
<li> <li>
<a href="#" data-format="<?php echo $key; ?>"> <a href="#" data-format="<?php echo $key; ?>">
@@ -309,10 +264,10 @@ if ($isCpct) :
</ul> </ul>
<select id="pasteFormatter" name="pasteFormatter" class="hidden"> <select id="pasteFormatter" name="pasteFormatter" class="hidden">
<?php <?php
foreach ($FORMATTER as $key => $value) : foreach ($FORMATTER as $key => $value):
?> ?>
<option value="<?php echo $key; ?>"<?php <option value="<?php echo $key; ?>"<?php
if ($key == $FORMATTERDEFAULT) : if ($key == $FORMATTERDEFAULT):
?> selected="selected"<?php ?> selected="selected"<?php
endif; endif;
?>><?php echo $value; ?></option> ?>><?php echo $value; ?></option>
@@ -322,13 +277,13 @@ if ($isCpct) :
</select> </select>
</li> </li>
<?php <?php
else : else:
?> ?>
<li> <li>
<div id="burnafterreadingoption" class="navbar-text checkbox hidden"> <div id="burnafterreadingoption" class="navbar-text checkbox hidden">
<label> <label>
<input type="checkbox" id="burnafterreading" name="burnafterreading"<?php <input type="checkbox" id="burnafterreading" name="burnafterreading"<?php
if ($BURNAFTERREADINGSELECTED) : if ($BURNAFTERREADINGSELECTED):
?> checked="checked"<?php ?> checked="checked"<?php
endif; endif;
?> /> ?> />
@@ -337,13 +292,13 @@ else :
</div> </div>
</li> </li>
<?php <?php
if ($DISCUSSION) : if ($DISCUSSION):
?> ?>
<li> <li>
<div id="opendiscussionoption" class="navbar-text checkbox hidden"> <div id="opendiscussionoption" class="navbar-text checkbox hidden">
<label> <label>
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php <input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
if ($OPENDISCUSSION) : if ($OPENDISCUSSION):
?> checked="checked"<?php ?> checked="checked"<?php
endif; endif;
?> /> ?> />
@@ -354,7 +309,7 @@ else :
<?php <?php
endif; endif;
endif; endif;
if ($PASSWORD) : if ($PASSWORD):
?> ?>
<li> <li>
<div id="password" class="navbar-form hidden"> <div id="password" class="navbar-form hidden">
@@ -363,7 +318,7 @@ if ($PASSWORD) :
</li> </li>
<?php <?php
endif; endif;
if ($FILEUPLOAD) : if ($FILEUPLOAD):
?> ?>
<li id="attach" class="hidden dropdown"> <li id="attach" class="hidden dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Attach a file'); ?> <span class="caret"></span></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Attach a file'); ?> <span class="caret"></span></a>
@@ -384,15 +339,15 @@ if ($FILEUPLOAD) :
</li> </li>
<?php <?php
endif; endif;
if (!$isCpct) : if (!$isCpct):
?> ?>
<li class="dropdown"> <li class="dropdown">
<select id="pasteFormatter" name="pasteFormatter" class="hidden"> <select id="pasteFormatter" name="pasteFormatter" class="hidden">
<?php <?php
foreach ($FORMATTER as $key => $value) : foreach ($FORMATTER as $key => $value):
?> ?>
<option value="<?php echo $key; ?>"<?php <option value="<?php echo $key; ?>"<?php
if ($key == $FORMATTERDEFAULT) : if ($key == $FORMATTERDEFAULT):
?> selected="selected"<?php ?> selected="selected"<?php
endif; endif;
?>><?php echo $value; ?></option> ?>><?php echo $value; ?></option>
@@ -403,7 +358,7 @@ if (!$isCpct) :
<a id="formatter" href="#" class="hidden dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Format'); ?>: <span id="pasteFormatterDisplay"><?php echo $FORMATTER[$FORMATTERDEFAULT]; ?></span> <span class="caret"></span></a> <a id="formatter" href="#" class="hidden dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo I18n::_('Format'); ?>: <span id="pasteFormatterDisplay"><?php echo $FORMATTER[$FORMATTERDEFAULT]; ?></span> <span class="caret"></span></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<?php <?php
foreach ($FORMATTER as $key => $value) : foreach ($FORMATTER as $key => $value):
?> ?>
<li> <li>
<a href="#" data-format="<?php echo $key; ?>"> <a href="#" data-format="<?php echo $key; ?>">
@@ -421,13 +376,13 @@ endif;
</ul> </ul>
<ul class="nav navbar-nav pull-right"> <ul class="nav navbar-nav pull-right">
<?php <?php
if (strlen($LANGUAGESELECTION)) : if (strlen($LANGUAGESELECTION)):
?> ?>
<li id="language" class="dropdown"> <li id="language" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> <?php echo $LANGUAGES[$LANGUAGESELECTION][0]; ?> <span class="caret"></span></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> <?php echo $LANGUAGES[$LANGUAGESELECTION][0]; ?> <span class="caret"></span></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<?php <?php
foreach ($LANGUAGES as $key => $value) : foreach ($LANGUAGES as $key => $value):
?> ?>
<li> <li>
<a href="#" data-lang="<?php echo $key; ?>"> <a href="#" data-lang="<?php echo $key; ?>">
@@ -442,43 +397,35 @@ if (strlen($LANGUAGESELECTION)) :
<?php <?php
endif; endif;
?> ?>
<li>
<?php
if ($isPage):
?>
<button id="newbutton" type="button" class="reloadlink hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL;
else:
?>
<button id="sendbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> navbar-btn">
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL;
endif;
?>
</button>
</li>
</ul> </ul>
</div> </div>
<?php <?php
if ($isCpct) : if ($isCpct):
?></div><?php ?></div><?php
endif; endif;
?></nav> ?></nav>
<main> <main>
<div id="sidebar-wrapper">
<h4><?php echo I18n::_('Memory'); ?></h4>
<p><?php echo I18n::_('The memory lets you remember different paste links. The memory is unique to each website and device.'); ?></p>
<table class="table<?php echo $isDark ? '' : ' table-striped'; ?>">
<thead>
<tr>
<th title="<?php echo I18n::_('Select all'); ?>"><input type="checkbox" id="memoryselectall" /></th>
<th title="<?php echo I18n::_('HTTPS'); ?>">🔒</th>
<th><?php echo I18n::_('Service'); ?></th>
<th><?php echo I18n::_('ID'); ?></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<p>
<button id="forgetbutton" type="button" class="btn btn-danger navbar-btn">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> <?php echo I18n::_('Forget'), PHP_EOL; ?>
</button>
</p>
</div>
<section class="container"> <section class="container">
<?php <?php
if (strlen($NOTICE)) : if (strlen($NOTICE)):
?> ?>
<div role="alert" class="alert alert-info"> <div role="alert" class="alert alert-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<?php echo I18n::encode($NOTICE), PHP_EOL; ?> <?php echo htmlspecialchars($NOTICE), PHP_EOL; ?>
</div> </div>
<?php <?php
endif; endif;
@@ -487,95 +434,68 @@ endif;
<span class="glyphicon glyphicon-fire" aria-hidden="true"></span> <span class="glyphicon glyphicon-fire" aria-hidden="true"></span>
</div> </div>
<?php <?php
if ($FILEUPLOAD) : if ($FILEUPLOAD):
?> ?>
<div id="attachment" role="alert" class="hidden alert alert-info"> <div id="attachment" role="alert" class="hidden alert alert-info">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> <span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
<a class="alert-link"><?php echo I18n::_('Download attachment'); ?></a> <a class="alert-link"><?php echo I18n::_('Download attachment'), PHP_EOL; ?></a>
</div> </div>
<?php <?php
endif; endif;
?> ?>
<div id="status" role="alert" class="alert alert-info<?php echo empty($STATUS) ? ' hidden' : '' ?>"> <div id="status" role="alert" class="alert alert-info<?php echo empty($STATUS) ? ' hidden' : '' ?>">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<?php echo I18n::encode($STATUS), PHP_EOL; ?> <?php echo htmlspecialchars($STATUS), PHP_EOL; ?>
</div> </div>
<div id="errormessage" role="alert" class="<?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger"> <div id="errormessage" role="alert" class="<?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger">
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span> <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
<?php echo I18n::encode($ERROR), PHP_EOL; ?> <?php echo htmlspecialchars($ERROR), PHP_EOL; ?>
</div> </div>
<noscript> <noscript>
<div id="noscript" role="alert" class="alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>"> <div id="noscript" role="alert" class="alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<?php echo I18n::_('JavaScript is required for %s to work. Sorry for the inconvenience.', I18n::_($NAME)), PHP_EOL; ?> <?php echo I18n::_('JavaScript is required for %s to work.<br />Sorry for the inconvenience.', I18n::_($NAME)), PHP_EOL; ?>
</div> </div>
</noscript> </noscript>
<div id="oldnotice" role="alert" class="hidden alert alert-danger"> <div id="oldnotice" role="alert" class="hidden alert alert-danger">
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span> <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
<?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)), PHP_EOL; ?> <?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)), PHP_EOL; ?>
</div>
<div id="ienotice" role="alert" class="hidden alert alert-danger">
<span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>
<?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
<a href="https://www.mozilla.org/firefox/">Firefox</a>, <a href="https://www.mozilla.org/firefox/">Firefox</a>,
<a href="https://www.opera.com/">Opera</a>, <a href="https://www.opera.com/">Opera</a>,
<a href="https://www.google.com/chrome">Chrome</a>…<br /> <a href="https://www.google.com/chrome">Chrome</a>…
<span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-the-error-privatebin-requires-a-modern-browser-to-work'); ?></span>
</div> </div>
<?php <?php
if ($HTTPWARNING) : if ($HTTPWARNING):
?> ?>
<div id="httpnotice" role="alert" class="hidden alert alert-danger"> <div id="httpnotice" role="alert" class="hidden alert alert-danger">
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span> <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
<?php echo I18n::_('This website is using an insecure connection! Please only use it for testing.'), PHP_EOL; ?><br /> <?php echo I18n::_('This website is using an insecure connection! Please only use it for testing.'), PHP_EOL; ?><br />
<span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-an-error-about-an-insecure-connection'); ?></span> <span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-an-error-about-an-insecure-connection'); ?></span>
</div> </div>
<div id="insecurecontextnotice" role="alert" class="hidden alert alert-danger">
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
<?php echo I18n::_('Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href="%s">switching to HTTPS</a>.', $HTTPSLINK); ?>
</div>
<?php <?php
endif; endif;
?> ?>
<div id="pastesuccess" class="hidden"> <div id="pastesuccess" role="alert" class="hidden alert alert-success">
<div role="alert" class="alert alert-success"> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <div id="deletelink"></div>
<div id="deletelink"></div> <div id="pastelink"></div>
<div id="pastelink"></div>
</div>
<?php <?php
if (strlen($URLSHORTENER)) : if (strlen($URLSHORTENER)):
?> ?>
<p> <button id="shortenbutton" data-shortener="<?php echo htmlspecialchars($URLSHORTENER); ?>" type="button" class="btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?>">
<button id="shortenbutton" data-shortener="<?php echo I18n::encode($URLSHORTENER); ?>" type="button" class="btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> btn-block">
<span class="glyphicon glyphicon-send" aria-hidden="true"></span> <?php echo I18n::_('Shorten URL'), PHP_EOL; ?> <span class="glyphicon glyphicon-send" aria-hidden="true"></span> <?php echo I18n::_('Shorten URL'), PHP_EOL; ?>
</button> </button>
</p>
<div role="alert" class="alert alert-danger">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<?php echo I18n::_('URL shortener may expose your decrypt key in URL.'), PHP_EOL; ?>
</div>
<?php <?php
endif; endif;
?> ?>
</div> </div>
<button id="menu-toggle" class="btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> btn-xs">
<span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span>
<?php echo I18n::_('Memory'); ?>
</button>
<ul id="editorTabs" class="nav nav-tabs hidden"> <ul id="editorTabs" class="nav nav-tabs hidden">
<li role="presentation" class="active"><a role="tab" aria-selected="true" aria-controls="editorTabs" id="messageedit" href="#"><?php echo I18n::_('Editor'); ?></a></li> <li role="presentation" class="active"><a id="messageedit" href="#"><?php echo I18n::_('Editor'); ?></a></li>
<li role="presentation"><a role="tab" aria-selected="false" aria-controls="editorTabs" id="messagepreview" href="#"><?php echo I18n::_('Preview'); ?></a></li> <li role="presentation"><a id="messagepreview" href="#"><?php echo I18n::_('Preview'); ?></a></li>
<li role="presentation" class="pull-right">
<?php
if ($isPage) :
?>
<button id="newbutton" type="button" class="reloadlink hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?>">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL;
else :
?>
<button id="sendbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?>">
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL;
endif;
?>
</button>
</li>
</ul> </ul>
</section> </section>
<section class="container"> <section class="container">
@@ -599,7 +519,7 @@ endif;
<div id="noscript" role="alert" class="alert alert-info noscript-hide"> <div id="noscript" role="alert" class="alert alert-info noscript-hide">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<?php echo I18n::_('Loading…'); ?><br /> <?php echo I18n::_('Loading…'); ?><br />
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="%s">this FAQ for information to troubleshoot</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-the-loading-message-not-go-away'); ?></span> <span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="%s">this FAQ for information to troubleshoot</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away'); ?></span>
</div> </div>
</section> </section>
<footer class="container"> <footer class="container">
@@ -613,7 +533,7 @@ endif;
</footer> </footer>
</main> </main>
<?php <?php
if ($DISCUSSION) : if ($DISCUSSION):
?> ?>
<div id="serverdata" class="hidden" aria-hidden="true"> <div id="serverdata" class="hidden" aria-hidden="true">
<div id="templates"> <div id="templates">
@@ -624,13 +544,6 @@ if ($DISCUSSION) :
</div> </div>
<?php <?php
endif; endif;
?>
<?php
if ($FILEUPLOAD) :
?>
<div id="dropzone" class="hidden" tabindex="-1" aria-hidden="true"></div>
<?php
endif;
?> ?>
</body> </body>
</html> </html>

View File

@@ -1,7 +1,7 @@
<?php <?php
use PrivateBin\I18n; use PrivateBin\I18n;
?><!DOCTYPE html> ?><!DOCTYPE html>
<html lang="<?php echo I18n::_('en'); ?>"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
@@ -34,7 +34,7 @@ if ($ZEROBINCOMPATIBILITY):
endif; endif;
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/zlib-1.2.11.js" integrity="sha512-Yey/0yoaVmSbqMEyyff3DIu8kCPwpHvHf7tY1AuZ1lrX9NPCMg87PwzngMi+VNbe4ilCApmePeuKT869RTcyCQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/zlib-1.2.11.js" integrity="sha512-Yey/0yoaVmSbqMEyyff3DIu8kCPwpHvHf7tY1AuZ1lrX9NPCMg87PwzngMi+VNbe4ilCApmePeuKT869RTcyCQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/base-x-3.0.7.js" integrity="sha512-/Bi1AJIP0TtxEB+Jh6Hk809H1G7vn4iJV80qagslf0+Hm0UjUi1s3qNrn1kZULjzUYuaf6ck0ndLGJ7MxWLmgQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/base-x-3.0.5.1.js" integrity="sha512-/zL3MWKMtl1IBF0URx3laql2jUw+rWfFFabNlILY/Qm+hUsQR/XULjUyNHkW/FkrV7A0sMQ7tsppH7sj5ht8wA==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
<?php <?php
if ($SYNTAXHIGHLIGHTING): if ($SYNTAXHIGHLIGHTING):
@@ -44,14 +44,15 @@ if ($SYNTAXHIGHLIGHTING):
endif; endif;
if ($MARKDOWN): if ($MARKDOWN):
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/showdown-1.9.1.js" integrity="sha512-nRri7kqh3iRLdHbhtjfe8w9eAQPmt+ubH5U88UZyKbz6O9Q0q4haaXF0krOUclKmRJou/kKZYulgBHvHXPqOvg==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/showdown-1.9.0.js" integrity="sha512-Kv8oAge9h2QmRyzb52jUomyXAvSMrpE9kWF3QRMFajo1a/TXjtY8u71vUA6t4+LE7huz4TSVH8VLJBEmcZiPRA==" crossorigin="anonymous"></script>
<?php <?php
endif; endif;
?> ?>
<script type="text/javascript" data-cfasync="false" src="js/purify-2.1.1.js" integrity="sha512-0RqB620aQhcT40T4kxf/vx3J4DOmFsqcGu2mPha21ZqufRsth3MsiU35ffSHX0OIJbE92XSKyvNcL1I6sYhh4w==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/purify-1.0.11.js" integrity="sha512-p7UyJuyBkhMcMgE4mDsgK0Lz70OvetLefua1oXs1OujWv9gOxh4xy8InFux7bZ4/DAZsTmO4rgVwZW9BHKaTaw==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/legacy.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==" crossorigin="anonymous"></script> <script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-r9MutKcgP/igbs8aUbENyJEie7LMyJ22f2On0RwGL0Hq0seJnmnPo4avDfhR0E/TZWDoux2arzxYHneH2/Ltmw==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-9cJdKFvcsrk3G411+Wp5Y6ZvFE6UUMKVzCB6LLXhg1BaN/jkviL01Ox+4HzbYNflFuSYK0USVFLeCW89774A6w==" crossorigin="anonymous"></script> <!--[if IE]>
<!-- icon --> <style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;}</style>
<![endif]-->
<link rel="apple-touch-icon" href="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" sizes="180x180" /> <link rel="apple-touch-icon" href="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" sizes="180x180" />
<link rel="icon" type="image/png" href="img/favicon-32x32.png?<?php echo rawurlencode($VERSION); ?>" sizes="32x32" /> <link rel="icon" type="image/png" href="img/favicon-32x32.png?<?php echo rawurlencode($VERSION); ?>" sizes="32x32" />
<link rel="icon" type="image/png" href="img/favicon-16x16.png?<?php echo rawurlencode($VERSION); ?>" sizes="16x16" /> <link rel="icon" type="image/png" href="img/favicon-16x16.png?<?php echo rawurlencode($VERSION); ?>" sizes="16x16" />
@@ -60,18 +61,6 @@ endif;
<link rel="shortcut icon" href="img/favicon.ico"> <link rel="shortcut icon" href="img/favicon.ico">
<meta name="msapplication-config" content="browserconfig.xml"> <meta name="msapplication-config" content="browserconfig.xml">
<meta name="theme-color" content="#ffe57e" /> <meta name="theme-color" content="#ffe57e" />
<!-- Twitter/social media cards -->
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="<?php echo I18n::_('Encrypted note on PrivateBin') ?>" />
<meta name="twitter:description" content="<?php echo I18n::_('Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.') ?>" />
<meta name="twitter:image" content="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" />
<meta property="og:title" content="<?php echo I18n::_($NAME); ?>" />
<meta property="og:site_name" content="<?php echo I18n::_($NAME); ?>" />
<meta property="og:description" content="<?php echo I18n::_('Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.') ?>" />
<meta property="og:image" content="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="180" />
<meta property="og:image:height" content="180" />
</head> </head>
<body data-compression="<?php echo rawurlencode($COMPRESSION); ?>"> <body data-compression="<?php echo rawurlencode($COMPRESSION); ?>">
<header> <header>
@@ -80,31 +69,27 @@ endif;
<?php <?php
if (strlen($NOTICE)): if (strlen($NOTICE)):
?> ?>
<span class="blink">▶</span> <?php echo I18n::encode($NOTICE); <span class="blink">▶</span> <?php echo htmlspecialchars($NOTICE);
endif; endif;
?> ?>
</div> </div>
<h1 class="title reloadlink"><?php echo I18n::_($NAME); ?></h1><br /> <h1 class="title reloadlink"><?php echo I18n::_($NAME); ?></h1><br />
<h2 class="title"><?php echo I18n::_('Because ignorance is bliss'); ?></h2><br /> <h2 class="title"><?php echo I18n::_('Because ignorance is bliss'); ?></h2><br />
<h3 class="title"><?php echo $VERSION; ?></h3> <h3 class="title"><?php echo $VERSION; ?></h3>
<noscript><div id="noscript" class="nonworking"><?php echo I18n::_('JavaScript is required for %s to work. Sorry for the inconvenience.', I18n::_($NAME)); ?></div></noscript> <noscript><div id="noscript" class="nonworking"><?php echo I18n::_('JavaScript is required for %s to work.<br />Sorry for the inconvenience.', I18n::_($NAME)); ?></div></noscript>
<div id="oldnotice" class="nonworking hidden"> <div id="oldnotice" class="nonworking"><?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)); ?></div>
<?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)), PHP_EOL; ?> <div id="ienotice" class="nonworking"><?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
<a href="https://www.mozilla.org/firefox/">Firefox</a>, <a href="https://www.mozilla.org/firefox/">Firefox</a>,
<a href="https://www.opera.com/">Opera</a>, <a href="https://www.opera.com/">Opera</a>,
<a href="https://www.google.com/chrome">Chrome</a>…<br /> <a href="https://www.google.com/chrome">Chrome</a>…
<span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-the-error-privatebin-requires-a-modern-browser-to-work'); ?></span>
</div> </div>
<?php <?php
if ($HTTPWARNING): if ($HTTPWARNING):
?> ?>
<div id="httpnotice" class="errorMessage hidden"> <div id="httpnotice" class="errorMessage">
<?php echo I18n::_('This website is using an insecure connection! Please only use it for testing.'); ?><br /> <?php echo I18n::_('This website is using an insecure connection! Please only use it for testing.'); ?>
<span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-an-error-about-an-insecure-connection'); ?></span> <span class="small"><?php echo I18n::_('For more information <a href="%s">see this FAQ entry</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-it-show-me-an-error-about-an-insecure-connection'); ?></span>
</div> </div>
<div id="insecurecontextnotice" class="errorMessage hidden">
<?php echo I18n::_('Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href="%s">switching to HTTPS</a>.', $HTTPSLINK); ?>
</div>
<?php <?php
endif; endif;
?> ?>
@@ -112,15 +97,14 @@ endif;
<section> <section>
<article> <article>
<div id="loadingindicator" class="hidden"><?php echo I18n::_('Loading…'); ?></div> <div id="loadingindicator" class="hidden"><?php echo I18n::_('Loading…'); ?></div>
<div id="status"><?php echo I18n::encode($STATUS); ?></div> <div id="status"><?php echo htmlspecialchars($STATUS); ?></div>
<div id="errormessage" class="hidden"><?php echo I18n::encode($ERROR); ?></div> <div id="errormessage" class="hidden"><?php echo htmlspecialchars($ERROR); ?></div>
<div id="toolbar"> <div id="toolbar">
<button id="newbutton" class="reloadlink hidden"><img src="img/icon_new.png" width="11" height="15" alt="" /><?php echo I18n::_('New'); ?></button> <button id="newbutton" class="reloadlink hidden"><img src="img/icon_new.png" width="11" height="15" alt="" /><?php echo I18n::_('New'); ?></button>
<button id="retrybutton" class="reloadlink hidden"><?php echo I18n::_('Retry'), PHP_EOL; ?></button> <button id="retrybutton" class="reloadlink hidden"><?php echo I18n::_('Retry'), PHP_EOL; ?></button>
<button id="sendbutton" class="hidden"><img src="img/icon_send.png" width="18" height="15" alt="" /><?php echo I18n::_('Send'); ?></button> <button id="sendbutton" class="hidden"><img src="img/icon_send.png" width="18" height="15" alt="" /><?php echo I18n::_('Send'); ?></button>
<button id="clonebutton" class="hidden"><img src="img/icon_clone.png" width="15" height="17" alt="" /><?php echo I18n::_('Clone'); ?></button> <button id="clonebutton" class="hidden"><img src="img/icon_clone.png" width="15" height="17" alt="" /><?php echo I18n::_('Clone'); ?></button>
<button id="rawtextbutton" class="hidden"><img src="img/icon_raw.png" width="15" height="15" alt="" /><?php echo I18n::_('Raw text'); ?></button> <button id="rawtextbutton" class="hidden"><img src="img/icon_raw.png" width="15" height="15" alt="" /><?php echo I18n::_('Raw text'); ?></button>
<button id="emaillink" class="hidden"><img src="img/icon_email.png" width="15" height="15" alt="" /><?php echo I18n::_('Email'); ?></button>
<?php <?php
if ($QRCODE): if ($QRCODE):
?> ?>
@@ -222,7 +206,7 @@ endif;
<?php <?php
if (strlen($URLSHORTENER)): if (strlen($URLSHORTENER)):
?> ?>
<button id="shortenbutton" data-shortener="<?php echo I18n::encode($URLSHORTENER); ?>"><img src="img/icon_shorten.png" width="13" height="15" /><?php echo I18n::_('Shorten URL'); ?></button> <button id="shortenbutton" data-shortener="<?php echo htmlspecialchars($URLSHORTENER); ?>"><img src="img/icon_shorten.png" width="13" height="15" /><?php echo I18n::_('Shorten URL'); ?></button>
<?php <?php
endif; endif;
?> ?>
@@ -270,18 +254,11 @@ if ($DISCUSSION):
</div> </div>
<?php <?php
endif; endif;
?>
<?php
if ($FILEUPLOAD):
?>
<div id="dropzone" class="hidden" tabindex="-1" aria-hidden="true"></div>
<?php
endif;
?> ?>
<section class="container"> <section class="container">
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"> <div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">
<span> <?php echo I18n::_('Loading…'); ?></span><br> <span> <?php echo I18n::_('Loading…'); ?></span><br>
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="%s">this FAQ for information to troubleshoot</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-the-loading-message-not-go-away'); ?></span> <span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
</div> </div>
</section> </section>
</body> </body>

View File

@@ -155,7 +155,7 @@ class Helper
public static function getPastePost($version = 2, array $meta = array()) public static function getPastePost($version = 2, array $meta = array())
{ {
$example = self::getPaste($version, $meta); $example = self::getPaste($version, $meta);
$example['meta'] = array('expire' => $example['meta']['expire']); $example['meta'] = array_merge(array('expire' => $example['meta']['expire']), $meta);
return $example; return $example;
} }

View File

@@ -4,31 +4,24 @@ use PrivateBin\Configuration;
class ConfigurationTest extends PHPUnit_Framework_TestCase class ConfigurationTest extends PHPUnit_Framework_TestCase
{ {
private $_minimalConfig;
private $_options; private $_options;
private $_path; private $_minimalConfig;
public function setUp() public function setUp()
{ {
/* Setup Routine */ /* Setup Routine */
Helper::confBackup(); Helper::confBackup();
$this->_minimalConfig = '[main]' . PHP_EOL . '[model]' . PHP_EOL . '[model_options]';
$this->_options = Configuration::getDefaults(); $this->_options = Configuration::getDefaults();
$this->_options['model_options']['dir'] = PATH . $this->_options['model_options']['dir']; $this->_options['model_options']['dir'] = PATH . $this->_options['model_options']['dir'];
$this->_options['traffic']['dir'] = PATH . $this->_options['traffic']['dir']; $this->_options['traffic']['dir'] = PATH . $this->_options['traffic']['dir'];
$this->_options['purge']['dir'] = PATH . $this->_options['purge']['dir']; $this->_options['purge']['dir'] = PATH . $this->_options['purge']['dir'];
$this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'privatebin_cfg'; $this->_minimalConfig = '[main]' . PHP_EOL . '[model]' . PHP_EOL . '[model_options]';
if (!is_dir($this->_path)) {
mkdir($this->_path);
}
} }
public function tearDown() public function tearDown()
{ {
/* Tear Down Routine */ /* Tear Down Routine */
Helper::rmDir($this->_path);
if (is_file(CONF)) { if (is_file(CONF)) {
unlink(CONF); unlink(CONF);
} }
@@ -184,49 +177,4 @@ class ConfigurationTest extends PHPUnit_Framework_TestCase
$this->assertFileExists(CONF, 'old configuration file gets converted'); $this->assertFileExists(CONF, 'old configuration file gets converted');
$this->assertFileNotExists(PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini', 'old configuration file gets removed'); $this->assertFileNotExists(PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini', 'old configuration file gets removed');
} }
public function testConfigPath()
{
// setup
$configFile = $this->_path . DIRECTORY_SEPARATOR . 'conf.php';
$options = $this->_options;
$options['main']['name'] = 'OtherBin';
Helper::createIniFile($configFile, $options);
// test
putenv('CONFIG_PATH=' . $this->_path);
$conf = new Configuration;
$this->assertEquals('OtherBin', $conf->getKey('name'), 'changing config path is supported');
// cleanup environment
if (is_file($configFile)) {
unlink($configFile);
}
putenv('CONFIG_PATH');
}
public function testConfigPathIni()
{
// setup
$configFile = $this->_path . DIRECTORY_SEPARATOR . 'conf.ini';
$configMigrated = $this->_path . DIRECTORY_SEPARATOR . 'conf.php';
$options = $this->_options;
$options['main']['name'] = 'OtherBin';
Helper::createIniFile($configFile, $options);
$this->assertFileNotExists(CONF, 'configuration in the default location is non existing');
// test
putenv('CONFIG_PATH=' . $this->_path);
$conf = new Configuration;
$this->assertEquals('OtherBin', $conf->getKey('name'), 'changing config path is supported for ini files as well');
$this->assertFileExists($configMigrated, 'old configuration file gets converted');
$this->assertFileNotExists($configFile, 'old configuration file gets removed');
$this->assertFileNotExists(CONF, 'configuration is not created in the default location');
// cleanup environment
if (is_file($configFile)) {
unlink($configFile);
}
putenv('CONFIG_PATH');
}
} }

View File

@@ -387,7 +387,7 @@ class ConfigurationTestGenerator
} }
} }
$code .= $this->_getFunction( $code .= $this->_getFunction(
ucfirst($step), $key, $options, $preCode, $testCode, $fullOptions['main']['discussion'] ucfirst($step), $key, $options, $preCode, $testCode
); );
} }
} }
@@ -408,11 +408,10 @@ class ConfigurationTestGenerator
* DO NOT EDIT: This file is generated automatically using configGenerator.php * DO NOT EDIT: This file is generated automatically using configGenerator.php
*/ */
use PrivateBin\Controller; use PrivateBin\PrivateBin;
use PrivateBin\Data\Filesystem; use PrivateBin\Data\Filesystem;
use PrivateBin\Persistence\ServerSalt; use PrivateBin\Persistence\ServerSalt;
use PrivateBin\Persistence\TrafficLimiter; use PrivateBin\Persistence\TrafficLimiter;
use PrivateBin\Request;
class ConfigurationCombinationsTest extends PHPUnit_Framework_TestCase class ConfigurationCombinationsTest extends PHPUnit_Framework_TestCase
{ {
@@ -449,8 +448,8 @@ class ConfigurationCombinationsTest extends PHPUnit_Framework_TestCase
if ($this->_model->exists(Helper::getPasteId())) if ($this->_model->exists(Helper::getPasteId()))
$this->_model->delete(Helper::getPasteId()); $this->_model->delete(Helper::getPasteId());
$configuration['model_options']['dir'] = $this->_path; $configuration['model_options']['dir'] = $this->_path;
$configuration['traffic']['dir'] = $this->_path; $configuration['traffic']['dir'] = $this->_path;
$configuration['purge']['dir'] = $this->_path; $configuration['purge']['dir'] = $this->_path;
Helper::createIniFile(CONF, $configuration); Helper::createIniFile(CONF, $configuration);
} }
@@ -468,7 +467,7 @@ EOT;
* @param array $testCode * @param array $testCode
* @return string * @return string
*/ */
private function _getFunction($step, $key, &$options, $preCode, $testCode, $discussionEnabled) private function _getFunction($step, $key, &$options, $preCode, $testCode)
{ {
if (count($testCode) == 0) { if (count($testCode) == 0) {
echo "skipping creation of test$step$key, no valid tests found for configuration: $options" . PHP_EOL; echo "skipping creation of test$step$key, no valid tests found for configuration: $options" . PHP_EOL;
@@ -496,31 +495,18 @@ EOT;
// step specific initialization // step specific initialization
switch ($step) { switch ($step) {
case 'Create': case 'Create':
if ($discussionEnabled) {
$code .= PHP_EOL . <<<'EOT'
$paste = Helper::getPasteJson();
EOT;
} else {
$code .= PHP_EOL . <<<'EOT'
$paste = json_decode(Helper::getPasteJson(), true);
$paste['adata'][2] = 0;
$paste = json_encode($paste);
EOT;
}
$code .= PHP_EOL . <<<'EOT' $code .= PHP_EOL . <<<'EOT'
$file = tempnam(sys_get_temp_dir(), 'FOO'); $_POST = Helper::getPaste();
file_put_contents($file, $paste);
Request::setInputStream($file);
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest'; $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$_SERVER['REQUEST_METHOD'] = 'POST'; $_SERVER['REQUEST_METHOD'] = 'POST';
$_SERVER['REMOTE_ADDR'] = '::1'; $_SERVER['REMOTE_ADDR'] = '::1';
TrafficLimiter::canPass(); TrafficLimiter::canPass();
EOT; EOT;
break; break;
case 'Read': case 'Read':
$code .= PHP_EOL . <<<'EOT' $code .= PHP_EOL . <<<'EOT'
$this->_model->create(Helper::getPasteId(), Helper::getPaste()); $this->_model->create(Helper::getPasteId(), Helper::getPaste());
$_SERVER['QUERY_STRING'] = Helper::getPasteId(); $_SERVER['QUERY_STRING'] = Helper::getPasteId();
$_GET[Helper::getPasteId()] = ''; $_GET[Helper::getPasteId()] = '';
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest'; $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
EOT; EOT;
@@ -539,7 +525,7 @@ EOT;
$code .= PHP_EOL . $preString; $code .= PHP_EOL . $preString;
$code .= <<<'EOT' $code .= <<<'EOT'
ob_start(); ob_start();
new Controller; new PrivateBin;
$content = ob_get_contents(); $content = ob_get_contents();
ob_end_clean(); ob_end_clean();
EOT; EOT;

View File

@@ -366,6 +366,30 @@ class ControllerTest extends PHPUnit_Framework_TestCase
$this->assertEquals(1, $paste['adata'][2], 'discussion is enabled'); $this->assertEquals(1, $paste['adata'][2], 'discussion is enabled');
} }
/**
* @runInSeparateProcess
*/
public function testCreateInvalidFormat()
{
$options = parse_ini_file(CONF, true);
$options['traffic']['limit'] = 0;
Helper::createIniFile(CONF, $options);
$paste = Helper::getPasteJson(2, array('challenge' => '$'));
$file = tempnam(sys_get_temp_dir(), 'FOO');
file_put_contents($file, $paste);
Request::setInputStream($file);
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$_SERVER['REQUEST_METHOD'] = 'POST';
$_SERVER['REMOTE_ADDR'] = '::1';
ob_start();
new Controller;
$content = ob_get_contents();
ob_end_clean();
$response = json_decode($content, true);
$this->assertEquals(1, $response['status'], 'outputs error status');
$this->assertFalse($this->_data->exists(Helper::getPasteId()), 'paste exists after posting data');
}
/** /**
* @runInSeparateProcess * @runInSeparateProcess
*/ */
@@ -784,6 +808,56 @@ class ControllerTest extends PHPUnit_Framework_TestCase
$this->assertFalse($this->_data->exists(Helper::getPasteId()), 'paste successfully deleted'); $this->assertFalse($this->_data->exists(Helper::getPasteId()), 'paste successfully deleted');
} }
/**
* @runInSeparateProcess
*/
public function testReadBurnAfterReadingWithToken()
{
$token = base64_encode(hash_hmac(
'sha256', Helper::getPasteId(), random_bytes(32), true
));
$burnPaste = Helper::getPaste(2, array('challenge' => $token));
$burnPaste['adata'][3] = 1;
$this->_data->create(Helper::getPasteId(), $burnPaste);
$this->assertTrue($this->_data->exists(Helper::getPasteId()), 'paste exists before deleting data');
$_SERVER['QUERY_STRING'] = Helper::getPasteId() . '&token=' . $token;
$_GET[Helper::getPasteId()] = '';
$_GET['token'] = $token;
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
ob_start();
new Controller;
$content = ob_get_contents();
ob_end_clean();
$response = json_decode($content, true);
$this->assertEquals(0, $response['status'], 'outputs status');
$this->assertFalse($this->_data->exists(Helper::getPasteId()), 'paste successfully deleted');
}
/**
* @runInSeparateProcess
*/
public function testReadBurnAfterReadingWithIncorrectToken()
{
$token = base64_encode(hash_hmac(
'sha256', Helper::getPasteId(), random_bytes(32), true
));
$burnPaste = Helper::getPaste(2, array('challenge' => base64_encode(random_bytes(32))));
$burnPaste['adata'][3] = 1;
$this->_data->create(Helper::getPasteId(), $burnPaste);
$this->assertTrue($this->_data->exists(Helper::getPasteId()), 'paste exists before deleting data');
$_SERVER['QUERY_STRING'] = Helper::getPasteId() . '&token=' . $token;
$_GET[Helper::getPasteId()] = '';
$_GET['token'] = $token;
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
ob_start();
new Controller;
$content = ob_get_contents();
ob_end_clean();
$response = json_decode($content, true);
$this->assertEquals(1, $response['status'], 'outputs status');
$this->assertTrue($this->_data->exists(Helper::getPasteId()), 'paste not deleted');
}
/** /**
* @runInSeparateProcess * @runInSeparateProcess
*/ */

View File

@@ -56,4 +56,18 @@ class FilterTest extends PHPUnit_Framework_TestCase
$this->assertEquals('1.00 YiB', Filter::formatHumanReadableSize(1024 * $exponent)); $this->assertEquals('1.00 YiB', Filter::formatHumanReadableSize(1024 * $exponent));
$this->assertEquals('1.21 YiB', Filter::formatHumanReadableSize(1234 * $exponent)); $this->assertEquals('1.21 YiB', Filter::formatHumanReadableSize(1234 * $exponent));
} }
public function testSlowEquals()
{
$this->assertTrue(Filter::slowEquals('foo', 'foo'), 'same string');
$this->assertFalse(Filter::slowEquals('foo', true), 'string and boolean');
$this->assertFalse(Filter::slowEquals('foo', 0), 'string and integer');
$this->assertFalse(Filter::slowEquals('123foo', 123), 'string and integer');
$this->assertFalse(Filter::slowEquals('123foo', '123'), 'different strings');
$this->assertFalse(Filter::slowEquals('6', ' 6'), 'strings with space');
$this->assertFalse(Filter::slowEquals('4.2', '4.20'), 'floats as strings');
$this->assertFalse(Filter::slowEquals('1e3', '1000'), 'integers as strings');
$this->assertFalse(Filter::slowEquals('9223372036854775807', '9223372036854775808'), 'large integers as strings');
$this->assertFalse(Filter::slowEquals('61529519452809720693702583126814', '61529519452809720000000000000000'), 'larger integers as strings');
}
} }

View File

@@ -21,6 +21,10 @@ class FormatV2Test extends PHPUnit_Framework_TestCase
$paste['ct'] = '$'; $paste['ct'] = '$';
$this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of ct'); $this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of ct');
$paste = Helper::getPastePost();
$paste['meta']['challenge'] = '$';
$this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of ct');
$paste = Helper::getPastePost(); $paste = Helper::getPastePost();
$paste['ct'] = 'bm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhCg=='; $paste['ct'] = 'bm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhCg==';
$this->assertFalse(FormatV2::isValid($paste), 'low ct entropy'); $this->assertFalse(FormatV2::isValid($paste), 'low ct entropy');
@@ -67,6 +71,8 @@ class FormatV2Test extends PHPUnit_Framework_TestCase
$paste['adata'][0][7] = '!#@'; $paste['adata'][0][7] = '!#@';
$this->assertFalse(FormatV2::isValid($paste), 'invalid compression'); $this->assertFalse(FormatV2::isValid($paste), 'invalid compression');
$this->assertFalse(FormatV2::isValid(Helper::getPaste()), 'invalid meta key'); $paste = Helper::getPastePost();
unset($paste['meta']['expire']);
$this->assertFalse(FormatV2::isValid($paste), 'invalid missing meta key');
} }
} }

Some files were not shown because too many files have changed in this diff Show More