Compare commits

..

567 Commits
1.4.0 ... 1.6.0

Author SHA1 Message Date
El RIDO
bbc5b627c2 hide github codepages artifacts from release archive 2023-09-11 19:42:18 +02:00
El RIDO
f56907bd38 increment version 2023-09-11 19:36:45 +02:00
El RIDO
e534a2f6a6 document changes 2023-09-11 19:36:09 +02:00
El RIDO
9a3bfd7f5b Merge pull request #1164 from sergiorgiraldo/master
feat: make the email button optional.
2023-09-10 19:42:23 +02:00
Sergio Giraldo
bf090fabb8 refactor: removed unnecessary php tag
::by sergio giraldo
@ 20230910T1650CEST, gpg signed
2023-09-10 16:50:00 +02:00
Sergio Giraldo
6728053ab0 test: default value for email configuration item;nit necessary to close php comment
::by sergio giraldo
@ 20230910T0958CEST, gpg signed
2023-09-10 09:58:04 +02:00
Sergio Giraldo
c665385ff6 feat: make the email button optional. Issue #1031
::by sergio giraldo
@ 20230909T2226CEST, gpg signed
2023-09-09 22:26:11 +02:00
El RIDO
c3baeab5aa Merge pull request #1163 from voidquark/doc-installation-ansible
Doc installation ansible
2023-09-08 06:59:57 +02:00
voidquark
42cf45542f consistency 2023-09-07 20:50:58 +02:00
voidquark
172efafb81 modify ansible installation part 2023-09-07 20:49:10 +02:00
rugk
73f8a1d4ae Merge pull request #1161 from PrivateBin/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2023-09-05 21:02:31 +02:00
dependabot[bot]
5bd2eb97e6 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-05 11:13:01 +00:00
El RIDO
9b8bee82cf Merge pull request #1160 from PrivateBin/r4sas-issue-template
Fix comment in bug report issue template
2023-09-04 06:26:24 +02:00
R4SAS
617b421d8f Fix comment in bug report issue template 2023-09-03 19:30:32 +03:00
El RIDO
e6f2ad0ff4 Merge pull request #1157 from PrivateBin/securitybutton
Remove custom security button as GitHub added own
2023-08-28 20:42:07 +02:00
rugk
876a59cedc Apprently GitHub
Apparently GitHub now adds a security policy button by default (this is new, is not it?)?
Also they have a policy report form behind that button. So reports can apparently now be made online at GitHub? (IMHO that is fine, just need to be aware of that)

As such, IMHO two buttons would be confusing, so let's remove our custom one here?
2023-08-28 18:49:27 +02:00
El RIDO
5e42b4f242 Merge pull request #1136 from PrivateBin/codespaces/init-files
chore: commit all files initiated by coddespaces
2023-08-25 06:53:06 +02:00
rugk
664a8fff08 feat: also open doc readme by default 2023-08-25 06:49:19 +02:00
rugk
b2e4920aa2 feat: add basic support for debugging and working with devcontainer
For GitHub Codespaces e.g.
2023-08-25 06:49:19 +02:00
El RIDO
4c9c5b2941 Merge pull request #1155 from PrivateBin/betterqwaagain
QA template: remove prefilled title
2023-08-25 06:14:21 +02:00
rugk
1470b0cb9c QA tenplate: remove prefilled title
Let's remove that.

1. With label and A&A category we have more than enough options for filtering such requests.
2. Actually, as you can see in https://github.com/orgs/PrivateBin/discussions/1152, as it is a required field, but already filled out… we want them to write proper titles.
2023-08-24 22:14:15 +02:00
rugk
f8ce73b46e Merge pull request #1154 from PrivateBin/betterqa
Make QA template more strict and helpful
2023-08-24 22:10:33 +02:00
rugk
61457c46c0 doc: link FAQ in option too
The doc says MD is supported for that here, too.
2023-08-24 21:35:42 +02:00
rugk
11fd21f8a8 doc: improve wording/grammar 2023-08-24 21:32:42 +02:00
rugk
906c115a97 Make QA template more strict and helpful
1. Require to fill out STRs.
2. Add more fields for client stuff, i.e. web browser and OS.
3. Add more placeholders and descriptions to guide users.
4. Adjust the reproducibility thing to be more clear. I.e. before the result was sth. like "Issue reproducibility: Yes" - this could be confused with "Is it always reproducible? Yes", and not "It is reproducible on our test instance."
2023-08-24 21:30:25 +02:00
El RIDO
b0869c3280 Merge pull request #1151 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.11
Bump phpunit/phpunit from 9.6.10 to 9.6.11
2023-08-23 06:31:38 +02:00
dependabot[bot]
e14b55bd27 Bump phpunit/phpunit from 9.6.10 to 9.6.11
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.10 to 9.6.11.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.11/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.10...9.6.11)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-21 11:06:57 +00:00
El RIDO
5047e6c550 Merge pull request #1149 from PrivateBin/delete-shifleft
Delete shiftleft-analysis.yml
2023-08-18 06:33:12 +02:00
El RIDO
f0615d561f Merge pull request #1150 from PrivateBin/r4sas-templ-qa
[GH] update discussion q-a template (#1143)
2023-08-17 07:35:55 +02:00
R4SAS
1c42576575 [GH] update discussion q-a template (#1143) 2023-08-17 03:05:39 +03:00
El RIDO
81ae359dfc Delete shiftleft-analysis.yml
Development on this stopped in 2021 and apart from the (false positive) secret scan, dev suggests CodeQL replaces it, feature wise: https://github.com/ShiftLeftSecurity/sast-scan/issues/352
2023-08-17 00:00:30 +02:00
El RIDO
ad35c30d45 Update q-a.yml, one more try
body[12]: options must not include booleans. Please wrap values such as 'yes', and 'true' in quotes.
2023-08-16 23:14:07 +02:00
El RIDO
0f9aee5335 Merge pull request #1147 from PrivateBin/r4sas-discus-templ
Update discussion template
2023-08-16 23:09:04 +02:00
R4SAS
7f28e8cc0c Update discussion template
Try to fix #1143.
2023-08-16 23:21:46 +03:00
rugk
a0a9147e63 Merge pull request #1145 from PrivateBin/template-tweaks
Template tweaks
2023-08-15 23:37:30 +02:00
El RIDO
15bf1fcf38 Merge pull request #1144 from idarlund/master
reverted Markdown
2023-08-11 21:01:53 +02:00
El RIDO
0e582e8934 fix syntax, standardize form attributes
radio buttons are not supported, checkboxes would allow selecting
multiple things, so dropdown it is
2023-08-11 20:53:06 +02:00
El RIDO
e89593b4fc comment fix, kudos @r4sas 2023-08-11 20:51:12 +02:00
Idar Lund
0697a514ca Merge pull request #1 from idarlund/idarlund-patch-1
Idarlund patch 1
2023-08-11 13:08:19 +02:00
Idar Lund
79386027fb reverted Markdown
Markdown is a name of a language and not something that should be translated.
2023-08-11 13:07:48 +02:00
El RIDO
33285aeaf4 Merge pull request #1142 from PrivateBin/rugk-patch-1
Remove markdown from issue selector
2023-08-10 06:50:09 +02:00
rugk
1bb23ef9ca Remove markdown from issue selector
Was worth a try, but apparently markdown is not supported there.
2023-08-09 23:11:35 +02:00
El RIDO
b2926357d3 Merge pull request #1140 from PrivateBin/better-issue-templates
Fix potential syntax error in YAML
2023-08-09 20:08:48 +02:00
rugk
991ec6ca22 Fix potential syntax error in YAML
Likely that online VSCode did a stupid line wrapping here, let's see whether that works.
2023-08-09 18:19:33 +02:00
El RIDO
3513d18029 Merge pull request #1063 from PrivateBin/restructure-doc
Restructure documentation
2023-08-08 20:24:20 +02:00
El RIDO
e83f51b547 Merge pull request #1138 from PrivateBin/dependabot/github_actions/github/codeql-action-2
Bump github/codeql-action from 1 to 2
2023-08-08 20:19:02 +02:00
El RIDO
41e4072899 Merge pull request #1137 from PrivateBin/dependabot/github_actions/actions/checkout-3
Bump actions/checkout from 2 to 3
2023-08-08 20:18:00 +02:00
dependabot[bot]
cbff1c8488 Bump github/codeql-action from 1 to 2
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-08 11:13:15 +00:00
dependabot[bot]
5f71c9de10 Bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-08 11:13:08 +00:00
El RIDO
be6eadd7c6 needs to get incremented on releases as well
contains the sample SQL schema with version string
2023-08-07 20:52:02 +02:00
El RIDO
a5a888a225 Merge branch 'master' into restructure-doc 2023-08-07 20:47:55 +02:00
El RIDO
4796c7ff02 Merge pull request #807 from PrivateBin/siftleft-scan
Add Shiftleft scan
2023-08-07 20:46:43 +02:00
El RIDO
771d7a3df8 Merge pull request #1134 from PrivateBin/better-issue-templates
Update and create new issue templates for better catgeorisation
2023-08-07 20:31:17 +02:00
rugk
a22b96b7fc style: fix typo 2023-08-07 20:02:36 +02:00
rugk
204d1756c9 refactor: redirect support questions to discussions including form + more links
Discussions apparently onyl support forms see,
so I quickly used ChatGPT to convert the Markdown file into the YAMl format
and after telling the format it seems to have done that in a good eay:
https://chat.openai.com/share/99718495-28d0-4382-ab5e-6a4a733c1ccb

(maybe GitHub introduced that after end of 2021 hehe, so the LLM could not know that)
2023-08-07 17:59:07 +00:00
rugk
8deb68c2da chore: remove old issue template 2023-08-07 17:26:26 +00:00
rugk
1a37f7b865 Update and create new issue templates for better ctageorisation
[128 of 600 issues are just questions and support and this is getting out of hand IMHO](https://github.com/PrivateBin/PrivateBin/issues?q=is%3Aissue+is%3Aopen+label%3Aquestion%2Fsupport), so I thought we need to do something while of course IMHO keeping support in some sense that is vital to an open-source project.

Anyway, this here now:
* Converts the "one and only issue template" to multiple ones with the new GitHub way, see https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/
  Note this uses mostly the templates they have, modifies them to use proper headers (sorry but I don't get why they always want to use **bold text** as headers, when you have real markdown headings) and adjusts/ports the
* We could use even more elaborate issue forms, but that  was too much for me to do now and is also beta, so maybe when they have a visual editor for that or so 😉 https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-forms

The aim:
* is to get support requests and stuff directly sorted and tagged, so they are out the way
* is to nudge people to improve the quality of issues/reports by providing a more useful template or their use case
* is to redirect people to the appropriate resource (give me a moment)
2023-08-07 19:24:13 +02:00
El RIDO
48079483be Merge pull request #1131 from PrivateBin/crowdin-translation
New Crowdin updates
2023-08-06 15:19:16 +02:00
PrivateBin Translator Bot
222ebd06a9 New translations en.json (Dutch) 2023-08-06 13:36:40 +02:00
PrivateBin Translator Bot
d8f2d01c1e New translations en.json (Lojban) 2023-08-06 12:19:09 +02:00
PrivateBin Translator Bot
1050fa303f New translations en.json (Dutch) 2023-08-06 12:19:08 +02:00
PrivateBin Translator Bot
94d07039b6 New translations en.json (French) 2023-08-06 12:19:07 +02:00
PrivateBin Translator Bot
e3e500cb2d New translations en.json (Corsican) 2023-08-06 11:17:05 +02:00
PrivateBin Translator Bot
5faa09f83e New translations en.json (Occitan) 2023-08-06 11:17:04 +02:00
PrivateBin Translator Bot
66f2a4b6f5 New translations en.json (Estonian) 2023-08-06 11:17:04 +02:00
PrivateBin Translator Bot
39ad584a52 New translations en.json (Thai) 2023-08-06 11:17:03 +02:00
PrivateBin Translator Bot
dc790cb2e0 New translations en.json (Indonesian) 2023-08-06 11:17:02 +02:00
PrivateBin Translator Bot
18189a148a New translations en.json (Chinese Simplified) 2023-08-06 11:17:01 +02:00
PrivateBin Translator Bot
d20a09c3d6 New translations en.json (Ukrainian) 2023-08-06 11:17:00 +02:00
PrivateBin Translator Bot
f9a5891072 New translations en.json (Turkish) 2023-08-06 11:16:59 +02:00
PrivateBin Translator Bot
4aefd56e96 New translations en.json (Slovenian) 2023-08-06 11:16:58 +02:00
PrivateBin Translator Bot
5aab567d94 New translations en.json (Slovak) 2023-08-06 11:16:57 +02:00
PrivateBin Translator Bot
7c25ce2b6f New translations en.json (Russian) 2023-08-06 11:16:56 +02:00
PrivateBin Translator Bot
8ede9a4e08 New translations en.json (Portuguese) 2023-08-06 11:16:56 +02:00
PrivateBin Translator Bot
728d38a89d New translations en.json (Polish) 2023-08-06 11:16:55 +02:00
PrivateBin Translator Bot
04ab3ccea9 New translations en.json (Norwegian) 2023-08-06 11:16:54 +02:00
PrivateBin Translator Bot
b3bbb91987 New translations en.json (Dutch) 2023-08-06 11:16:53 +02:00
PrivateBin Translator Bot
0fea8c44a4 New translations en.json (Lithuanian) 2023-08-06 11:16:52 +02:00
PrivateBin Translator Bot
b7604b57ab New translations en.json (Japanese) 2023-08-06 11:16:51 +02:00
PrivateBin Translator Bot
cc46b74705 New translations en.json (Italian) 2023-08-06 11:16:50 +02:00
PrivateBin Translator Bot
e2c71290cf New translations en.json (Hungarian) 2023-08-06 11:16:49 +02:00
PrivateBin Translator Bot
0ce8d7dfd0 New translations en.json (Hebrew) 2023-08-06 11:16:48 +02:00
PrivateBin Translator Bot
a357c7f34d New translations en.json (Finnish) 2023-08-06 11:16:47 +02:00
PrivateBin Translator Bot
941b0bdce8 New translations en.json (Greek) 2023-08-06 11:16:47 +02:00
PrivateBin Translator Bot
0b2939bb94 New translations en.json (German) 2023-08-06 11:16:46 +02:00
PrivateBin Translator Bot
9ce0878db2 New translations en.json (Czech) 2023-08-06 11:16:45 +02:00
PrivateBin Translator Bot
45b52ee895 New translations en.json (Catalan) 2023-08-06 11:16:44 +02:00
PrivateBin Translator Bot
d91848de2d New translations en.json (Bulgarian) 2023-08-06 11:16:43 +02:00
PrivateBin Translator Bot
d5f8bef276 New translations en.json (Spanish) 2023-08-06 11:16:42 +02:00
PrivateBin Translator Bot
63dabced9a New translations en.json (French) 2023-08-06 11:16:41 +02:00
PrivateBin Translator Bot
5aa06e5b26 New translations en.json (Corsican) 2023-08-06 09:37:07 +02:00
PrivateBin Translator Bot
68aeef687d New translations en.json (Occitan) 2023-08-06 09:37:06 +02:00
PrivateBin Translator Bot
e261167ea5 New translations en.json (Lojban) 2023-08-06 09:37:04 +02:00
PrivateBin Translator Bot
0211a27a24 New translations en.json (Estonian) 2023-08-06 09:37:03 +02:00
PrivateBin Translator Bot
21157a2ad9 New translations en.json (Thai) 2023-08-06 09:37:02 +02:00
PrivateBin Translator Bot
20dc8d7c21 New translations en.json (Indonesian) 2023-08-06 09:37:01 +02:00
PrivateBin Translator Bot
5bc5295e60 New translations en.json (Chinese Simplified) 2023-08-06 09:37:00 +02:00
PrivateBin Translator Bot
b5ca9efc95 New translations en.json (Ukrainian) 2023-08-06 09:36:59 +02:00
PrivateBin Translator Bot
92864f837d New translations en.json (Turkish) 2023-08-06 09:36:59 +02:00
PrivateBin Translator Bot
81627713be New translations en.json (Slovenian) 2023-08-06 09:36:57 +02:00
PrivateBin Translator Bot
81170c0d78 New translations en.json (Slovak) 2023-08-06 09:36:57 +02:00
PrivateBin Translator Bot
0b22083409 New translations en.json (Russian) 2023-08-06 09:36:56 +02:00
PrivateBin Translator Bot
8ad5a104cb New translations en.json (Portuguese) 2023-08-06 09:36:55 +02:00
PrivateBin Translator Bot
e002b439a5 New translations en.json (Polish) 2023-08-06 09:36:54 +02:00
PrivateBin Translator Bot
de23016288 New translations en.json (Norwegian) 2023-08-06 09:36:53 +02:00
PrivateBin Translator Bot
6da15f4a41 New translations en.json (Dutch) 2023-08-06 09:36:52 +02:00
PrivateBin Translator Bot
d845ffc174 New translations en.json (Lithuanian) 2023-08-06 09:36:51 +02:00
PrivateBin Translator Bot
6f69a6756a New translations en.json (Japanese) 2023-08-06 09:36:50 +02:00
PrivateBin Translator Bot
5cc312f4a1 New translations en.json (Italian) 2023-08-06 09:36:49 +02:00
PrivateBin Translator Bot
68a25ae4a4 New translations en.json (Hungarian) 2023-08-06 09:36:48 +02:00
PrivateBin Translator Bot
ed519395b1 New translations en.json (Hebrew) 2023-08-06 09:36:47 +02:00
PrivateBin Translator Bot
2274d90875 New translations en.json (Finnish) 2023-08-06 09:36:47 +02:00
PrivateBin Translator Bot
73c9b3169b New translations en.json (Greek) 2023-08-06 09:36:46 +02:00
PrivateBin Translator Bot
7b74f7dc35 New translations en.json (German) 2023-08-06 09:36:45 +02:00
PrivateBin Translator Bot
190f6d693d New translations en.json (Czech) 2023-08-06 09:36:44 +02:00
PrivateBin Translator Bot
8bc21ef38b New translations en.json (Catalan) 2023-08-06 09:36:43 +02:00
PrivateBin Translator Bot
27964b7298 New translations en.json (Bulgarian) 2023-08-06 09:36:42 +02:00
PrivateBin Translator Bot
da08fbd5d7 New translations en.json (Spanish) 2023-08-06 09:36:41 +02:00
PrivateBin Translator Bot
4c316a8729 New translations en.json (French) 2023-08-06 09:36:40 +02:00
El RIDO
776a22fbcd Merge pull request #1130 from PrivateBin/japanese-and-arabic
Enable use of Japanese and Arabic translations
2023-08-06 08:18:51 +02:00
El RIDO
dc4bbe07f1 Merge remote-tracking branch 'origin/master' into japanese-and-arabic 2023-08-04 06:52:06 +02:00
El RIDO
cdd29d4798 extend translations with a 4th & 5th plural case
These are used by Arabic, described in https://arabeyes.org/Plural_Forms
2023-08-04 06:32:33 +02:00
El RIDO
900e45c69b Merge pull request #1129 from PrivateBin/crowdin-translation
New Crowdin updates
2023-08-02 19:59:12 +02:00
PrivateBin Translator Bot
032a9c9862 New translations en.json (Spanish) 2023-08-02 00:49:59 +02:00
PrivateBin Translator Bot
6047dcfe2d New translations en.json (Arabic) 2023-08-02 00:49:58 +02:00
PrivateBin Translator Bot
a78d0536c6 New translations en.json (Arabic) 2023-08-01 23:47:20 +02:00
El RIDO
1dbe46cfed update SRI hashes 2023-08-01 14:05:20 +02:00
El RIDO
fe37b7f0e5 enable & credit Japanese & Arabic translations 2023-08-01 14:00:45 +02:00
El RIDO
8df69a1120 Merge pull request #1128 from PrivateBin/crowdin-translation
New Crowdin updates
2023-08-01 13:32:36 +02:00
PrivateBin Translator Bot
fcec76b151 New translations en.json (Arabic) 2023-08-01 12:11:21 +02:00
El RIDO
e8448225af Merge pull request #1126 from PrivateBin/crowdin-translation
New Crowdin updates
2023-08-01 07:21:10 +02:00
PrivateBin Translator Bot
bff0561e01 New translations en.json (Arabic) 2023-07-31 00:43:52 +02:00
El RIDO
5296f05904 Merge pull request #1121 from PrivateBin/php8
merge PHP 8 branch, upgrading to PHPunit 9 and minimum PHP version 7.3
2023-07-23 16:48:28 +02:00
El RIDO
b6ad6b538a allow composer to run at scrutinizer, explicitly telling it about our minimum supported PHP version 2023-07-23 10:38:14 +02:00
El RIDO
c1b3bffe8c document change, update composer, dropping obsolete library with polyfill for random_bytes function on PHP < 7 2023-07-23 10:19:35 +02:00
El RIDO
ecf100551d document change, raise minimum PHP version to 7.3, remove branch refresh 2023-07-23 10:04:57 +02:00
github-actions[bot]
48df1d29ac Merge remote-tracking branch 'origin/master' into php8 2023-07-22 08:14:07 +00:00
El RIDO
969f433861 Merge pull request #1120 from PrivateBin/dependabot/npm_and_yarn/js/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /js
2023-07-22 10:13:38 +02:00
dependabot[bot]
86ba5b4966 Bump word-wrap from 1.2.3 to 1.2.4 in /js
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 18:58:23 +00:00
github-actions[bot]
10909c133a Merge remote-tracking branch 'origin/master' into php8 2023-07-10 04:47:03 +00:00
El RIDO
b2d8d480e4 Merge pull request #1115 from PrivateBin/crowdin-translation
New Crowdin updates
2023-07-10 04:46:12 +00:00
PrivateBin Translator Bot
c29d6c2a3a New translations en.json (Japanese) 2023-07-10 04:02:37 +02:00
PrivateBin Translator Bot
d0ea125b11 New translations en.json (Japanese) 2023-07-10 02:55:46 +02:00
github-actions[bot]
95747ed11c Merge remote-tracking branch 'origin/master' into php8 2023-07-09 07:32:46 +00:00
El RIDO
01afe7d481 incrementing version 2023-07-09 08:44:22 +02:00
El RIDO
dabcafb99b Merge branch 'master' into php8 2023-07-05 07:15:28 +02:00
El RIDO
6c2d7431fe Merge pull request #1093 from PrivateBin/php82-deprecation
fix PHP 8.2 ${var} string interpolation deprecation
2023-07-05 04:23:52 +00:00
El RIDO
243e43a940 Merge pull request #1102 from PrivateBin/bump-libraries
bump libraries, update changelog
2023-07-04 04:11:13 +00:00
El RIDO
172088e59b bump optional PHP libraries 2023-07-01 07:59:25 +02:00
El RIDO
f7838bfe8a bump libraries, update changelog 2023-07-01 07:58:28 +02:00
El RIDO
f840cccb74 remove broken scrutinizer CI PHP Code Sniffer integration - they ship a buggy release and the upgrade is ignored 2023-06-18 18:20:09 +02:00
El RIDO
0505513153 bump scrutinizer CI PHP Code Sniffer version 2023-06-18 18:09:32 +02:00
El RIDO
9208de7625 bump scrutinizer CI OS version 2023-06-18 17:51:10 +02:00
El RIDO
283927b966 bump scrutinizer CI PHP version 2023-06-18 17:21:30 +02:00
El RIDO
99c26d01d3 Merge branch 'master' into bump-libraries 2023-06-18 17:16:43 +02:00
El RIDO
ebd17462c3 Merge branch 'master' into php82-deprecation 2023-06-18 17:15:48 +02:00
github-actions[bot]
2fc920394d Merge remote-tracking branch 'origin/master' into php8 2023-06-18 15:15:00 +00:00
El RIDO
73e000fc75 Merge pull request #1101 from PrivateBin/fix-styleci
apply StyleCI patch, fixes #1084
2023-06-18 15:14:15 +00:00
El RIDO
57be10ed53 bump libraries, update changelog
required minimal changes in checkmark jQuery accessor code, found by unit tests
2023-06-18 13:47:54 +02:00
El RIDO
8988899c8c apply StyleCI patch, fixes #1084 2023-06-18 12:54:22 +02:00
El RIDO
01ea041f94 fix PHP 8.2 ${var} string interpolation deprecation
see also https://php.watch/versions/8.2/$%7Bvar%7D-string-interpolation-deprecated
2023-05-21 11:07:21 +02:00
github-actions[bot]
9271af481d Merge remote-tracking branch 'origin/master' into php8 2023-05-18 19:41:08 +00:00
El RIDO
5b458a17c2 Merge pull request #1091 from PrivateBin/crowdin-translation
New Crowdin updates
2023-05-18 19:40:16 +00:00
PrivateBin Translator Bot
4701e83968 New translations en.json (Finnish) 2023-05-18 18:09:19 +02:00
PrivateBin Translator Bot
fa4aee9aac New translations en.json (Finnish) 2023-05-18 17:13:45 +02:00
github-actions[bot]
75d42ccbf6 Merge remote-tracking branch 'origin/master' into php8 2023-04-15 14:22:10 +00:00
El RIDO
5a6fba6ab1 Merge pull request #1086 from PrivateBin/crowdin-translation
New Crowdin updates
2023-04-15 14:21:26 +00:00
PrivateBin Translator Bot
abcb2ed200 New translations en.json (Italian) 2023-04-11 13:26:07 +02:00
PrivateBin Translator Bot
a7e21e76bc New translations en.json (Italian) 2023-04-11 12:25:54 +02:00
github-actions[bot]
e20bacca27 Merge remote-tracking branch 'origin/master' into php8 2023-03-25 06:45:33 +00:00
El RIDO
9083ae5a5c Merge pull request #1083 from PrivateBin/crowdin-translation
New Crowdin updates
2023-03-25 06:44:47 +00:00
PrivateBin Translator Bot
ce1be669e2 New translations en.json (Bulgarian) 2023-03-24 08:41:11 +01:00
PrivateBin Translator Bot
44462e0202 New translations en.json (Turkish) 2023-03-24 06:43:50 +01:00
PrivateBin Translator Bot
867fb0580b New translations en.json (Turkish) 2023-03-17 22:55:40 +01:00
github-actions[bot]
83cbbdece2 Merge remote-tracking branch 'origin/master' into php8 2023-03-17 05:55:05 +00:00
El RIDO
7791aadcc8 Merge pull request #1080 from PrivateBin/crowdin-translation
New Crowdin updates
2023-03-17 05:54:17 +00:00
PrivateBin Translator Bot
4c9edb85e9 New translations en.json (Chinese Simplified) 2023-03-11 14:28:26 +01:00
PrivateBin Translator Bot
a4636f1b91 New translations en.json (Chinese Simplified) 2023-03-11 13:13:13 +01:00
github-actions[bot]
c19df94fc2 Merge remote-tracking branch 'origin/master' into php8 2023-02-28 04:49:39 +00:00
El RIDO
b23e781b5b Merge pull request #1070 from fenak/feat/allow-aws-sdk-to-use-default-credential-provider-chain
Feature: Allow AWS SDK to use default credential provider chain for S3Storage
2023-02-28 04:48:55 +00:00
Felipe Nakandakari
f48fffd7c2 Add sample config for S3 without hard-coded access keys 2023-02-28 08:30:58 +11:00
github-actions[bot]
5e43dcf56e Merge remote-tracking branch 'origin/master' into php8 2023-02-27 17:45:26 +00:00
El RIDO
dd6fed1e4d Merge pull request #1072 from PrivateBin/crowdin-translation
New Crowdin updates
2023-02-27 17:44:36 +00:00
PrivateBin Translator Bot
390a3ba81f New translations en.json (Portuguese) 2023-02-27 17:33:24 +01:00
Felipe Nakandakari
6d4d3af377 Fix code style issues 2023-02-27 13:26:45 +11:00
Felipe Nakandakari
e3abc042a8 Use credentials array only if values passed via conf.php 2023-02-27 12:58:18 +11:00
github-actions[bot]
b8a425f7a1 Merge remote-tracking branch 'origin/master' into php8 2023-02-26 15:16:05 +00:00
El RIDO
643832b2b8 Merge pull request #1067 from PrivateBin/crowdin-translation
New Crowdin updates
2023-02-26 15:15:17 +00:00
PrivateBin Translator Bot
5827f196e7 New translations en.json (Portuguese) 2023-02-26 03:18:25 +01:00
github-actions[bot]
e3b2ae2a0b Merge remote-tracking branch 'origin/master' into php8 2023-02-19 07:47:31 +00:00
El RIDO
6cbc91936f Merge pull request #1062 from PrivateBin/crowdin-translation
New Crowdin updates
2023-02-19 07:46:41 +00:00
El RIDO
ccc5dd037f update links, unify formats, add documentation index 2023-02-19 08:32:10 +01:00
El RIDO
411629df37 rename documentation files 2023-02-19 08:30:44 +01:00
PrivateBin Translator Bot
c2480aae67 New translations en.json (Finnish) 2023-02-18 12:21:31 +01:00
github-actions[bot]
8818a99677 Merge remote-tracking branch 'origin/master' into php8 2023-02-10 05:28:40 +00:00
El RIDO
9a65b8e72b Merge pull request #1059 from PrivateBin/crowdin-translation
New Crowdin updates
2023-02-10 06:28:00 +01:00
PrivateBin Translator Bot
e2524d8093 New translations en.json (Thai) 2023-02-09 22:55:55 +01:00
github-actions[bot]
714ebdaa0b Merge remote-tracking branch 'origin/master' into php8 2023-02-03 06:25:42 +00:00
El RIDO
fa8cc59ec0 Merge pull request #1054 from Fejby/patch-1
Update cs.json
2023-02-03 07:25:06 +01:00
Fejby
e7c7e7512d Update cs.json
Correction of translation
2023-02-03 00:32:01 +01:00
github-actions[bot]
1987f4a165 Merge remote-tracking branch 'origin/master' into php8 2023-01-27 17:42:53 +00:00
El RIDO
a7b4b4c59d Merge pull request #1050 from PrivateBin/crowdin-translation
New Crowdin updates
2023-01-27 18:42:15 +01:00
PrivateBin Translator Bot
f5d16e3af1 New translations en.json (Occitan) 2023-01-27 17:30:10 +01:00
github-actions[bot]
476aa0d3f1 Merge remote-tracking branch 'origin/master' into php8 2023-01-21 07:46:05 +00:00
El RIDO
b7f1621bbc Merge pull request #1046 from PrivateBin/types-jsonld
expose types JSON-LD incl. configured expiration dates
2023-01-21 08:45:32 +01:00
El RIDO
3a4e5ed0c9 unnecessary string concatenation 2023-01-15 14:45:10 +01:00
El RIDO
bf7d2f05b6 expose types JSON-LD incl. configured expiration dates, resolves #1045 2023-01-15 08:04:44 +01:00
github-actions[bot]
4ae461df47 Merge remote-tracking branch 'origin/master' into php8 2022-12-24 06:11:22 +00:00
El RIDO
e84a8694e4 incrementing version 2022-12-24 05:52:07 +01:00
github-actions[bot]
99ce99a9fc Merge remote-tracking branch 'origin/master' into php8 2022-12-24 04:48:56 +00:00
El RIDO
12ab9bf586 Merge pull request #1019 from PrivateBin/admin
administrative script
2022-12-24 05:48:23 +01:00
github-actions[bot]
e1bfdadf23 Merge remote-tracking branch 'origin/master' into php8 2022-12-22 04:39:01 +00:00
El RIDO
e26407d038 Merge pull request #1033 from PrivateBin/crowdin-translation
New Crowdin updates
2022-12-22 05:38:27 +01:00
PrivateBin Translator Bot
0504575362 New translations en.json (Lithuanian) 2022-12-21 23:14:25 +01:00
github-actions[bot]
9247b25824 Merge remote-tracking branch 'origin/master' into php8 2022-12-20 18:54:23 +00:00
El RIDO
67aab7a491 bump optional libraries for GCS & S3 to address PHP 8.1 deprecation warnings 2022-12-20 19:53:32 +01:00
El RIDO
5de779a989 improve documentation 2022-12-20 19:14:37 +01:00
El RIDO
6d116e0cd9 Merge branch 'master' into php8 2022-12-20 18:28:19 +01:00
El RIDO
5c43ab6ef8 refactor administrative script into OOP style and to our code guidelines 2022-12-19 20:41:12 +01:00
El RIDO
c00b95011b Merge branch 'master' into admin 2022-12-19 19:15:27 +01:00
El RIDO
8ee69cbda3 Merge pull request #1030 from PrivateBin/improvements
Some minor improvements
2022-12-19 19:13:17 +01:00
El RIDO
30fec3e2eb document changes 2022-12-13 18:45:41 +01:00
El RIDO
a93c8ceccb fold extracted function back into the one remaining place calling it 2022-12-13 06:21:37 +01:00
El RIDO
53ab57627e re-add shuffling paste list 2022-12-12 21:28:38 +01:00
El RIDO
78e75d5a3f Merge branch 'master' into improvements 2022-12-12 20:56:35 +01:00
github-actions[bot]
5b78cc80f2 Merge remote-tracking branch 'origin/master' into php8 2022-12-12 19:52:53 +00:00
El RIDO
1128c679eb Merge pull request #1029 from AnonymousWP/dutch-translation-updates
Translate new strings to Dutch
2022-12-12 20:52:22 +01:00
github-actions[bot]
00cd331eaa Merge remote-tracking branch 'origin/master' into php8 2022-12-12 19:51:50 +00:00
El RIDO
0e5002f0d5 fix CS i18n unit test 2022-12-12 20:51:06 +01:00
El RIDO
23a2c1829f deal with annotation reported in github actions 2022-12-12 20:49:04 +01:00
El RIDO
e54277f014 re-add 10 * batch size limit in filesystem purge and support v1 dates for sorting mixed versioned comments 2022-12-12 20:48:36 +01:00
El RIDO
38574f0196 return invalid data error on API instead of exception 2022-12-12 20:46:47 +01:00
El RIDO
62c11fc782 duplications 2022-12-12 20:45:46 +01:00
AnonymousWP
8e9da9dec5 Translate new strings to Dutch
- Fix spelling errors
- Improve sentences
- Change formal to informal use of 'you' in Dutch
- Do not use literal translation of 'paste'
2022-12-11 20:05:44 +01:00
PrivateBin Translator Bot
7d34fe30b6 New translations en.json (Czech) 2022-12-11 17:31:01 +01:00
github-actions[bot]
46831d76a8 Merge remote-tracking branch 'origin/master' into php8 2022-12-11 05:15:59 +00:00
El RIDO
be30f8e78f tag needs to be signed 2022-12-11 06:15:13 +01:00
github-actions[bot]
dc60d6b27e Merge remote-tracking branch 'origin/master' into php8 2022-12-11 04:09:19 +00:00
El RIDO
b5602dd1ae incrementing version 2022-12-11 05:02:15 +01:00
El RIDO
d8bcc58d22 Merge branch 'master' into admin 2022-12-05 20:40:33 +01:00
github-actions[bot]
36925687b2 Merge remote-tracking branch 'origin/master' into php8 2022-11-18 04:39:49 +00:00
El RIDO
910675c74b apply StyleCI fix 2022-11-18 05:38:37 +01:00
github-actions[bot]
e888877f23 Merge remote-tracking branch 'origin/master' into php8 2022-11-18 04:37:18 +00:00
El RIDO
4056057a3c updated some links to https 2022-11-18 05:36:33 +01:00
El RIDO
07bc3285aa moved glob iterator pattern to const, documentation 2022-11-18 05:36:06 +01:00
El RIDO
46c0fc851c Merge branch 'master' into php8 2022-11-17 06:04:12 +01:00
El RIDO
02a7be4673 Merge pull request #1014 from PrivateBin/bin
bin cleanup, testing migration script
2022-11-17 05:36:05 +01:00
El RIDO
e76090229b Merge pull request #1018 from PrivateBin/upgrade-libs
upgrade JS libraries
2022-11-17 05:35:37 +01:00
El RIDO
08854db6d6 documented change 2022-11-13 14:27:11 +01:00
El RIDO
4e2ff47b1c add an administrative script 2022-11-13 11:18:56 +01:00
El RIDO
97047a6ef6 upgrade JS libraries 2022-11-13 06:37:23 +01:00
El RIDO
b8593b1bf2 use a glob iterator to stream through as many matches as needed 2022-11-10 20:36:15 +01:00
El RIDO
b3699cae8f Merge branch 'master' into bin 2022-11-10 19:28:29 +01:00
El RIDO
b53df70227 Merge pull request #1008 from PrivateBin/jdenticons-test
Jdenticons size and speed test results
2022-11-10 07:28:13 +01:00
El RIDO
b2ef205411 extended script to test jdenticon ImageMagick and documented option to work without GD 2022-11-07 19:42:20 +01:00
El RIDO
c0758e7bbb correct labels, Jdenticon renders PNG or SVG, both in pure PHP 2022-11-07 19:09:16 +01:00
El RIDO
e5487cee48 Merge branch 'master' into bin 2022-11-07 07:34:34 +01:00
El RIDO
2fa58b9198 Merge pull request #1015 from PrivateBin/thai
enable and credit Thai translation
2022-11-07 07:33:53 +01:00
El RIDO
e970fbce8d Merge pull request #1013 from PrivateBin/crowdin-translation
New Crowdin updates
2022-11-07 07:13:29 +01:00
El RIDO
89df4a54ec enable and credit Thai translation 2022-11-07 07:12:40 +01:00
PrivateBin Translator Bot
b0c61cc208 New translations en.json (Thai) 2022-11-07 00:58:25 +01:00
PrivateBin Translator Bot
d4d4687464 New translations en.json (Thai) 2022-11-07 00:01:51 +01:00
El RIDO
0288d94a68 regenerate composer.lock with PHP 7.2 for Scrutinizer 2022-11-06 09:39:29 +01:00
El RIDO
94aab6d64b apply StyleCI patch 2022-11-06 09:12:42 +01:00
El RIDO
a799351db3 re-use logic from _getExpiredPastes()
Scrutinizer pointed out that the dieerr() function isn't available in this
class. Code does work when invoked by migrate script, but this way it would
also work in other contexts.
2022-11-06 09:09:50 +01:00
El RIDO
8ede84f000 disable test when PHP < 7.2
It started failing after we removed the cache from the Database class,
but the behaviour is still correct (exception when something goes wrong
during comment storing).
2022-11-06 08:21:32 +01:00
El RIDO
6caf1143df add a verification step for investigating failures in tests below PHP 7.2 2022-11-06 08:13:07 +01:00
El RIDO
669c98550c add a version check, the third argument in getopt requires PHP >= 7.1 2022-11-06 08:05:41 +01:00
El RIDO
14075cea78 trying a different approach to get that exception 70 triggered reliably 2022-11-06 07:53:43 +01:00
El RIDO
bde7a19971 apply StyleCI patch 2022-11-06 07:43:19 +01:00
El RIDO
5195adfdb9 simple migration test 2022-11-06 07:41:05 +01:00
El RIDO
3028c22c20 be more efficient 2022-11-06 07:40:39 +01:00
PrivateBin Translator Bot
9f1e95f588 New translations en.json (Thai) 2022-11-06 03:21:05 +01:00
PrivateBin Translator Bot
3e3d93c9c2 New translations en.json (Thai) 2022-11-06 02:18:55 +01:00
PrivateBin Translator Bot
d46398fc22 New translations en.json (Thai) 2022-11-05 23:30:32 +01:00
PrivateBin Translator Bot
15ce736bc8 New translations en.json (Thai) 2022-11-05 20:25:29 +01:00
El RIDO
f4eed668e7 seems impacted by removal of cache, let's see if we can adjust the test 2022-11-05 10:00:12 +01:00
El RIDO
9a1f3aeca5 update Jdenticon library 2022-11-05 09:44:35 +01:00
El RIDO
07ad9ad0f4 typo, found by Scrutinizer 2022-11-05 09:37:24 +01:00
El RIDO
833cf93209 address Scrutinizer warning
> The variable $bucket does not seem to be defined for all execution paths leading up to this point.
2022-11-05 09:35:19 +01:00
El RIDO
62bb68344c move all scripts into one location
- standardize includes, namings
- made migrate executable
- updated ConfigurationCombinationsTest generator to work with current persistance API
2022-11-05 09:32:30 +01:00
El RIDO
8389c2a2d6 minor optimization, let the PDO driver do that for us 2022-11-05 08:46:42 +01:00
El RIDO
05f77e45bc Merge branch 'felixjogris-migrate' 2022-11-05 08:29:40 +01:00
El RIDO
a33721e3ab Merge branch 'migrate' of https://github.com/felixjogris/PrivateBin into felixjogris-migrate 2022-11-05 08:27:40 +01:00
Felix J. Ogris
10013ad092 syntax bot 2022-11-04 21:27:27 +01:00
Felix J. Ogris
75d28ef423 _sanitizeClob touches no instance variables 2022-11-04 21:25:53 +01:00
Felix J. Ogris
604c931875 remove cache from database backend 2022-11-04 21:19:47 +01:00
Felix J. Ogris
3d485ecd7f let GCS backends talk to the same "storage account" during testing 2022-11-04 21:04:18 +01:00
Felix J. Ogris
726f54ce9e typos 2022-11-04 20:19:41 +01:00
github-actions[bot]
ba5c859d85 Merge remote-tracking branch 'origin/master' into php8 2022-11-03 18:55:30 +00:00
El RIDO
66600e5eb3 Merge pull request #1003 from PrivateBin/yourls-cleanup
improve configuration wording, adjust self check
2022-11-03 19:54:56 +01:00
El RIDO
987ead2719 ensure the basepath ends in a slash, if one is set 2022-11-03 07:47:50 +01:00
Felix J. Ogris
bde5802a3a syntax fix, changelog 2022-11-01 16:38:06 +01:00
Felix J. Ogris
9a61e8fd48 started script for storage backend migrations
todo: GCS

added GCS, no GLOBALS, two methods for saving pastes and comments

use GLOBALS for verbosity again

added getAllPastes() to all storage providers

moved to bin, added --delete options, make use of $store->getAllPastes()

added --delete-* options to help

longopts without -- *sigh*

fixed arguments

drop singleton behaviour to allow multiple backends of the same type simultaneously

remove singleton from Model, collapse loop in migrate.php

comments is not indexed

tests without data singleton

fix

exit if scandir() fails

extended meta doc
2022-11-01 16:02:17 +01:00
El RIDO
a731a1143c update jdenticon 2022-10-31 20:36:39 +01:00
github-actions[bot]
46013df620 Merge remote-tracking branch 'origin/master' into php8 2022-10-31 16:19:19 +00:00
El RIDO
449dbb8377 Merge pull request #1010 from PrivateBin/dependabot/composer/phpunit/phpunit-5.7.27
Bump phpunit/phpunit from 5.6.3 to 5.7.27
2022-10-31 17:18:50 +01:00
github-actions[bot]
f0bbf99306 Merge remote-tracking branch 'origin/master' into php8 2022-10-31 16:07:38 +00:00
El RIDO
606d70863e Merge pull request #1009 from PrivateBin/dependabot/composer/jdenticon/jdenticon-1.0.2
Bump jdenticon/jdenticon from 1.0.1 to 1.0.2
2022-10-31 17:07:00 +01:00
dependabot[bot]
b63de431a7 Bump phpunit/phpunit from 5.6.3 to 5.7.27
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 5.6.3 to 5.7.27.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/5.7.27/ChangeLog-5.7.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/5.6.3...5.7.27)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 11:33:10 +00:00
dependabot[bot]
be1989b117 Bump jdenticon/jdenticon from 1.0.1 to 1.0.2
Bumps [jdenticon/jdenticon](https://github.com/dmester/jdenticon-php) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/dmester/jdenticon-php/releases)
- [Commits](https://github.com/dmester/jdenticon-php/compare/1.0.1...1.0.2)

---
updated-dependencies:
- dependency-name: jdenticon/jdenticon
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 11:32:59 +00:00
El RIDO
89d575ace3 in light of the perf/size test results of Jdenticons, switch back to Identicons as the default 2022-10-30 09:24:35 +01:00
El RIDO
1892264cf0 add perf/size test for Jdenticons 2022-10-30 09:04:27 +01:00
El RIDO
c44b252aa8 Merge branch 'master' into php8 2022-10-29 19:38:01 +02:00
El RIDO
f5332ee6ff Merge pull request #1005 from PrivateBin/crowdin-translation
New Crowdin updates
2022-10-29 15:07:46 +02:00
PrivateBin Translator Bot
e39a2eeb61 New translations en.json (Corsican) 2022-10-29 13:09:30 +02:00
El RIDO
405067668a Merge pull request #1004 from PrivateBin/dependabot/composer/phpunit/phpunit-5.6.3
Bump phpunit/phpunit from 5.2.7 to 5.6.3
2022-10-29 08:17:33 +02:00
dependabot[bot]
922feb2779 Bump phpunit/phpunit from 5.2.7 to 5.6.3
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 5.2.7 to 5.6.3.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-8.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/5.2.7...5.6.3)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-29 06:07:06 +00:00
El RIDO
968d7a19bf Merge pull request #1001 from PrivateBin/jdenticon
add new Jdenticon comment icon library and set it as default
2022-10-29 08:06:43 +02:00
El RIDO
432d3e71d3 improve configuration wording, adjust self check 2022-10-29 07:58:40 +02:00
El RIDO
34264cb7f5 Merge branch 'master' into php8 2022-10-26 08:24:41 +02:00
El RIDO
795c030bdb Revert several commits that didn't solve the Scrutinizer issues 2022-10-26 08:16:30 +02:00
El RIDO
613e4e9d57 custom php-cs doesn't support website config on Scrutinizer 2022-10-26 08:11:35 +02:00
El RIDO
c91d20ae75 try using the updated php-cs dependency on Scrutinizer 2022-10-26 08:03:55 +02:00
El RIDO
d5104a1d63 Merge pull request #1000 from PrivateBin/set-output-deprecation
handle github actions deprecation warnings
2022-10-26 07:57:33 +02:00
El RIDO
78b3630eb5 try updating that borked php-cs dependency on Scrutinizer 2022-10-26 07:55:26 +02:00
El RIDO
31f75ee138 undo accidental PHP 8 induced upgrade of php-timer, making it incompatible with PHP 7 used on Scrutinizer 2022-10-26 07:39:35 +02:00
El RIDO
ae3a0b19ee update PHP version used in Scrutinizer CI to 7.4, fixing php-timer requirement 2022-10-26 07:23:37 +02:00
El RIDO
d5e7e6e2ab document Jdenticon change 2022-10-26 07:11:02 +02:00
El RIDO
8ac69590cf add new Jdenticon comment icon library, set it as default, fixes #793 2022-10-26 06:53:56 +02:00
El RIDO
ba4878056b misleading documentation 2022-10-26 05:51:36 +02:00
El RIDO
ae6248e27e handle github actions deprecation warnings
see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2022-10-26 05:48:51 +02:00
El RIDO
7b98d7381f allow tests to be manually triggered 2022-10-26 05:30:37 +02:00
github-actions[bot]
fa61e4507c Merge remote-tracking branch 'origin/master' into php8 2022-10-26 02:39:53 +00:00
El RIDO
78aa70e3ab Merge pull request #999 from PrivateBin/php82-deprecated-callables
PHP 8.2 compatibility: Use of "self" in callables is deprecated
2022-10-26 04:39:11 +02:00
github-actions[bot]
f79c8c63e5 Merge remote-tracking branch 'origin/master' into php8 2022-10-25 19:12:00 +00:00
El RIDO
670f9ef548 Merge pull request #998 from PrivateBin/crowdin-translation
New Crowdin updates
2022-10-25 21:11:30 +02:00
PrivateBin Translator Bot
1a828884d1 New translations en.json (Hungarian) 2022-10-25 21:01:18 +02:00
PrivateBin Translator Bot
18a957ee54 New translations en.json (Hebrew) 2022-10-25 21:01:17 +02:00
El RIDO
8f8adb9b0d Merge branch 'master' into crowdin-translation 2022-10-25 20:27:22 +02:00
PrivateBin Translator Bot
c3041924b6 New translations en.json (Occitan) 2022-10-25 20:03:32 +02:00
PrivateBin Translator Bot
5584fdb347 New translations en.json (Chinese Simplified) 2022-10-25 20:03:31 +02:00
PrivateBin Translator Bot
ec75ef6e36 New translations en.json (Ukrainian) 2022-10-25 20:03:30 +02:00
PrivateBin Translator Bot
b1f24a51c8 New translations en.json (Turkish) 2022-10-25 20:03:29 +02:00
PrivateBin Translator Bot
60b091d0e1 New translations en.json (Slovak) 2022-10-25 20:03:28 +02:00
PrivateBin Translator Bot
ed5859c6b6 New translations en.json (Russian) 2022-10-25 20:03:27 +02:00
PrivateBin Translator Bot
cd0a7effa0 New translations en.json (Portuguese) 2022-10-25 20:03:25 +02:00
PrivateBin Translator Bot
ab3e8ffd49 New translations en.json (Norwegian) 2022-10-25 20:03:24 +02:00
PrivateBin Translator Bot
7269755bc2 New translations en.json (Dutch) 2022-10-25 20:03:23 +02:00
PrivateBin Translator Bot
5e48a927f2 New translations en.json (Lithuanian) 2022-10-25 20:03:22 +02:00
El RIDO
bff4d3a016 PHP 8.2 compatibility: Use of "self" in callables is deprecated 2022-10-25 07:15:09 +02:00
PrivateBin Translator Bot
2eab8adcd1 New translations en.json (Corsican) 2022-10-25 07:05:13 +02:00
PrivateBin Translator Bot
92c42afdc7 New translations en.json (Arabic) 2022-10-25 07:05:12 +02:00
PrivateBin Translator Bot
da48f8a9a1 New translations en.json (Bulgarian) 2022-10-25 07:05:11 +02:00
PrivateBin Translator Bot
7b40893497 New translations en.json (Catalan) 2022-10-25 07:05:10 +02:00
PrivateBin Translator Bot
0a1fccea11 New translations en.json (Czech) 2022-10-25 07:05:09 +02:00
PrivateBin Translator Bot
3de21004c4 New translations en.json (German) 2022-10-25 07:05:07 +02:00
PrivateBin Translator Bot
d0d0621bac New translations en.json (Greek) 2022-10-25 07:05:05 +02:00
PrivateBin Translator Bot
3845298804 New translations en.json (Finnish) 2022-10-25 07:05:04 +02:00
PrivateBin Translator Bot
d6c5f97d58 New translations en.json (Hebrew) 2022-10-25 07:05:03 +02:00
PrivateBin Translator Bot
f713b92893 New translations en.json (Hungarian) 2022-10-25 07:05:01 +02:00
PrivateBin Translator Bot
f254285b01 New translations en.json (Italian) 2022-10-25 07:05:00 +02:00
PrivateBin Translator Bot
c2d5c6fc43 New translations en.json (Japanese) 2022-10-25 07:04:59 +02:00
PrivateBin Translator Bot
3d4f9cc1b3 New translations en.json (Kurdish) 2022-10-25 07:04:58 +02:00
PrivateBin Translator Bot
945435e133 New translations en.json (Lithuanian) 2022-10-25 07:04:57 +02:00
PrivateBin Translator Bot
d288f2ab73 New translations en.json (Dutch) 2022-10-25 07:04:56 +02:00
PrivateBin Translator Bot
7ab3f3f271 New translations en.json (Spanish) 2022-10-25 07:04:54 +02:00
PrivateBin Translator Bot
019c8b64b8 New translations en.json (Norwegian) 2022-10-25 07:04:53 +02:00
PrivateBin Translator Bot
06b01c57ac New translations en.json (Portuguese) 2022-10-25 07:04:52 +02:00
PrivateBin Translator Bot
b756da5839 New translations en.json (Russian) 2022-10-25 07:04:51 +02:00
PrivateBin Translator Bot
8a9761b430 New translations en.json (Slovak) 2022-10-25 07:04:50 +02:00
PrivateBin Translator Bot
79c4ace626 New translations en.json (Slovenian) 2022-10-25 07:04:49 +02:00
PrivateBin Translator Bot
534d014254 New translations en.json (Swedish) 2022-10-25 07:04:48 +02:00
PrivateBin Translator Bot
40a037b625 New translations en.json (Turkish) 2022-10-25 07:04:47 +02:00
PrivateBin Translator Bot
5cb40e1f9e New translations en.json (Ukrainian) 2022-10-25 07:04:46 +02:00
PrivateBin Translator Bot
c9144def9f New translations en.json (Chinese Simplified) 2022-10-25 07:04:45 +02:00
PrivateBin Translator Bot
989fe6cc3a New translations en.json (Indonesian) 2022-10-25 07:04:44 +02:00
PrivateBin Translator Bot
08ac373b12 New translations en.json (Estonian) 2022-10-25 07:04:42 +02:00
PrivateBin Translator Bot
c2ec38e0a3 New translations en.json (Hindi) 2022-10-25 07:04:41 +02:00
PrivateBin Translator Bot
f31e384980 New translations en.json (Lojban) 2022-10-25 07:04:39 +02:00
PrivateBin Translator Bot
a1b4fcdefb New translations en.json (Latin) 2022-10-25 07:04:39 +02:00
PrivateBin Translator Bot
09902b9d67 New translations en.json (Occitan) 2022-10-25 07:04:38 +02:00
PrivateBin Translator Bot
f8bb6efcf9 New translations en.json (Polish) 2022-10-25 07:04:37 +02:00
PrivateBin Translator Bot
930063442a New translations en.json (French) 2022-10-25 07:04:35 +02:00
El RIDO
5b3d61cedc revert, this one actually was correct 2022-10-25 06:58:42 +02:00
El RIDO
510103fd9f make tests compatible with newer phpunit 2022-10-25 06:55:24 +02:00
El RIDO
b890d768d1 enable use of PHP 8.2 2022-10-25 06:53:26 +02:00
El RIDO
27965d0287 make tests compatible with newer phpunit 2022-10-25 06:53:07 +02:00
El RIDO
8ed9fccf25 make YourlsProxyTest compatible with newer phpunit 2022-10-25 06:43:17 +02:00
El RIDO
522c2721a2 make YourlsProxyTest compatible with newer phpunit 2022-10-25 06:41:42 +02:00
El RIDO
17d7a6967e make YourlsProxyTest compatible with newer phpunit 2022-10-25 06:39:50 +02:00
El RIDO
f6edcc1acd Merge branch 'master' into php8 2022-10-25 06:37:15 +02:00
El RIDO
849c1c7cd1 fix display of configured name in twitter title 2022-10-25 06:34:40 +02:00
PrivateBin Translator Bot
5e513588db New translations en.json (German) 2022-10-25 06:08:09 +02:00
PrivateBin Translator Bot
fef83a37ef New translations en.json (Slovak) 2022-10-23 22:46:25 +02:00
El RIDO
4f9af21fb2 Merge pull request #997 from jmozd/serverside_yourls
Serverside yourls
2022-10-23 18:03:14 +02:00
El RIDO
a66f170c5e PHP 5.6 seems to tolerate an empty string as valid JSON 2022-10-23 13:21:22 +02:00
El RIDO
44f78ffcdf apply StyleCI recommendations 2022-10-23 13:14:27 +02:00
El RIDO
2776033997 apply StyleCI recommendations 2022-10-23 13:13:12 +02:00
El RIDO
0a949d3903 credit change, document it and improve wording 2022-10-23 13:10:55 +02:00
El RIDO
78e915e049 adding tests for YOURLS functionality 2022-10-23 13:09:54 +02:00
El RIDO
4bd5ef9cda add new messages to translate 2022-10-23 10:50:18 +02:00
El RIDO
69034ef9d1 apply StyleCI recommendations 2022-10-23 09:16:55 +02:00
El RIDO
2a162d075c allow unit tests to pass 2022-10-23 09:12:31 +02:00
El RIDO
f4000150fa avoid cURL dependency, native functions should suffice for such a simple call 2022-10-23 09:05:17 +02:00
El RIDO
b768a2e8cb use JSON wrapper for decoding error catching 2022-10-23 08:21:37 +02:00
El RIDO
0a2094f069 code style 2022-10-23 08:16:05 +02:00
El RIDO
0dc9ab7576 refactor shortenviayourls.php for our MVC framework 2022-10-23 08:10:56 +02:00
El RIDO
304ae76a04 Merge branch 'serverside_yourls' of https://github.com/jmozd/PrivateBin into serverside_yourls 2022-10-23 05:43:18 +02:00
github-actions[bot]
5b2ec7f7c2 Merge remote-tracking branch 'origin/master' into php8 2022-10-23 03:14:46 +00:00
El RIDO
13b4dc79b9 Merge pull request #992 from PrivateBin/zlib-1.2.13
update zlib to 1.2.13
2022-10-23 05:14:15 +02:00
El RIDO
9d07e68e7d Merge branch 'master' into zlib-1.2.13 2022-10-23 05:06:50 +02:00
Jens-U. Mozdzen
dce8b8d352 updated code formatting 2022-10-23 01:07:43 +02:00
Jens-U. Mozdzen
3115cb8883 added parameters for server-side YOURLS shortener call 2022-10-23 00:19:43 +02:00
Jens-U. Mozdzen
b0f17f0a91 added server-side YOURLS shortener call 2022-10-23 00:18:56 +02:00
github-actions[bot]
5768b1e4bd Merge remote-tracking branch 'origin/master' into php8 2022-10-22 16:35:34 +00:00
El RIDO
a36351ca37 Merge pull request #994 from felixjogris/s3backend
implemented S3 storage backend
2022-10-22 18:35:03 +02:00
Felix J. Ogris
ee212b1a33 implemented S3 storage backend
added sample configuration + aws php sdk version

coding style cleanup
2022-10-22 18:30:24 +02:00
El RIDO
08b6070359 update zlib to 1.2.13 2022-10-15 09:05:19 +02:00
github-actions[bot]
23928d26f0 Merge remote-tracking branch 'origin/master' into php8 2022-10-07 05:54:07 +00:00
El RIDO
2e2c70ed15 Merge pull request #986 from PrivateBin/crowdin-translation
New Crowdin updates
2022-10-07 07:53:30 +02:00
PrivateBin Translator Bot
38245287d0 New translations en.json (Slovak) 2022-10-07 07:11:45 +02:00
github-actions[bot]
cbeb30adf1 Merge remote-tracking branch 'origin/master' into php8 2022-10-07 03:59:28 +00:00
El RIDO
688574f70c Merge pull request #988 from RaJiska/master
GCS Uniform ACL Support
2022-10-07 05:58:54 +02:00
Ra'Jiska
8dbe60621d Fix GCS Upload Metadata Mistake 2022-10-06 14:41:37 +08:00
PrivateBin Translator Bot
23e0000101 New translations en.json (Greek) 2022-10-06 08:30:59 +02:00
PrivateBin Translator Bot
1aa93f7fb2 New translations en.json (Slovak) 2022-10-06 08:30:58 +02:00
Ra'Jiska
8dded4e8e4 GCS Support for Uniform ACL Buckets 2022-10-06 12:19:06 +08:00
PrivateBin Translator Bot
ad6e802e8a New translations en.json (Greek) 2022-10-05 12:30:02 +02:00
PrivateBin Translator Bot
c6659747ae New translations en.json (Greek) 2022-10-05 09:01:55 +02:00
github-actions[bot]
b488359e35 Merge remote-tracking branch 'origin/master' into php8 2022-09-30 03:25:00 +00:00
El RIDO
160207b25a Merge pull request #983 from PrivateBin/slovak
enable use of Slovak translations
2022-09-30 05:24:21 +02:00
El RIDO
77409e6065 crediting greek language as well, plus docs 2022-09-29 21:15:00 +02:00
El RIDO
abef3ad37b Merge branch 'master' into slovak 2022-09-29 21:10:50 +02:00
github-actions[bot]
9f541e6276 Merge remote-tracking branch 'origin/master' into php8 2022-09-29 19:06:55 +00:00
El RIDO
0e630e14b7 Merge pull request #985 from eellak/greek-lang
Update strings in el.json and enable greek language
2022-09-29 21:06:18 +02:00
Christos Karamolegkos
0f1c2fdb04 Update strings in el.json and enable greek language 2022-09-29 15:34:15 +03:00
El RIDO
b61b4253a6 enabled use of Slovak translations 2022-09-29 05:34:49 +02:00
github-actions[bot]
4aa95107d3 Merge remote-tracking branch 'origin/master' into php8 2022-09-26 10:16:10 +00:00
R4SAS
afd84da6b2 Merge pull request #981 from PrivateBin/crowdin-translation
New Crowdin updates
2022-09-26 10:15:30 +00:00
PrivateBin Translator Bot
51f5082f39 New translations en.json (Slovak) 2022-09-25 17:09:10 +02:00
PrivateBin Translator Bot
1b727f7fa4 New translations en.json (Slovak) 2022-09-25 16:12:48 +02:00
github-actions[bot]
4f7b3d2ac3 Merge remote-tracking branch 'origin/master' into php8 2022-09-24 08:06:29 +00:00
El RIDO
4ea2d6020f Merge pull request #979 from PrivateBin/crowdin-translation
New Crowdin updates
2022-09-24 10:05:58 +02:00
PrivateBin Translator Bot
3255a4d954 New translations en.json (Slovak) 2022-09-20 21:21:45 +02:00
PrivateBin Translator Bot
4025619236 New translations en.json (Slovak) 2022-09-20 20:11:36 +02:00
github-actions[bot]
5165845b54 Merge remote-tracking branch 'origin/master' into php8 2022-09-18 12:45:32 +00:00
El RIDO
eef9a52b69 Merge pull request #968 from PrivateBin/crowdin-translation
New Crowdin updates
2022-09-18 14:44:56 +02:00
PrivateBin Translator Bot
7580155243 New translations en.json (Slovak) 2022-09-18 14:19:01 +02:00
PrivateBin Translator Bot
49b8312505 New translations en.json (Dutch) 2022-09-18 14:19:00 +02:00
PrivateBin Translator Bot
d1b53360d5 New translations en.json (Slovak) 2022-09-18 13:16:32 +02:00
PrivateBin Translator Bot
e35710ca30 New translations en.json (Turkish) 2022-09-18 13:16:31 +02:00
PrivateBin Translator Bot
123210bb8f New translations en.json (Dutch) 2022-09-18 13:16:30 +02:00
PrivateBin Translator Bot
e11c89ab85 New translations en.json (Czech) 2022-09-16 23:59:49 +02:00
PrivateBin Translator Bot
e56b24fc3b New translations en.json (Turkish) 2022-09-10 22:29:16 +02:00
PrivateBin Translator Bot
76fe7063ca New translations en.json (Dutch) 2022-09-10 22:29:14 +02:00
PrivateBin Translator Bot
fa1e4728dc New translations en.json (Russian) 2022-09-10 21:32:33 +02:00
PrivateBin Translator Bot
d57a849a40 New translations en.json (Dutch) 2022-09-10 21:32:32 +02:00
PrivateBin Translator Bot
d065f42785 New translations en.json (Czech) 2022-09-10 14:08:53 +02:00
PrivateBin Translator Bot
d848ce2ed2 New translations en.json (Ukrainian) 2022-08-30 00:53:01 +02:00
github-actions[bot]
05e236ed6c Merge remote-tracking branch 'origin/master' into php8 2022-08-24 04:28:45 +00:00
El RIDO
ac06627d9f Merge pull request #971 from PrivateBin/coop-header-disable
Remove COOP header for now
2022-08-24 06:28:09 +02:00
rugk
e740d0f761 Remove COOP header for now
Same as https://github.com/PrivateBin/docker-nginx-fpm-alpine/pull/108

Disable the header here as it breaks links to the own site.
2022-08-22 13:25:56 +02:00
PrivateBin Translator Bot
6e60efc2dd New translations en.json (Dutch) 2022-08-21 17:21:33 +02:00
PrivateBin Translator Bot
a105ba7566 New translations en.json (Turkish) 2022-08-21 17:21:28 +02:00
PrivateBin Translator Bot
67365f8602 New translations en.json (Ukrainian) 2022-08-21 17:21:27 +02:00
El RIDO
8c2cc18b66 Merge branch 'master' into php8 2022-07-31 08:53:52 +02:00
El RIDO
628700afb1 Merge pull request #960 from PrivateBin/crowdin-translation
New Crowdin updates
2022-07-23 07:23:55 +02:00
PrivateBin Translator Bot
5c20a424e1 New translations en.json (Lithuanian) 2022-07-22 14:07:48 +02:00
El RIDO
1a5eafe424 Merge pull request #958 from PrivateBin/crowdin-translation
New Crowdin updates
2022-07-16 09:33:14 +02:00
PrivateBin Translator Bot
925f8cb338 New translations en.json (Spanish) 2022-07-14 09:41:47 +02:00
PrivateBin Translator Bot
9e499652be New translations en.json (Spanish) 2022-07-14 08:34:07 +02:00
El RIDO
61efe71e31 Merge pull request #957 from PrivateBin/nodejs-16-tests
Use NodeJs v16 for tests
2022-07-10 10:31:02 +02:00
rugk
48bb2fdf0f Use NodeJs v16 for tests
So 14 worked, let's try 16. (Actually noticed fedora uses v16 not 14 which makes sense if you see the support time.)
2022-07-10 00:13:47 +02:00
El RIDO
b46b4300ec Merge pull request #955 from PrivateBin/node14
chore: run tests with NodeJS 14
2022-07-09 17:45:23 +02:00
El RIDO
67fdd54ae5 Merge pull request #954 from PrivateBin/packagelock
Add missing package-json.lock
2022-07-09 17:41:39 +02:00
rugk
e536db9b7e style: run tests via npm script insread of custom command
I.e. not call mocha directly but let the script defined in package.json do it's job.
2022-07-09 17:04:28 +02:00
rugk
9a476ac34d chore: switch to proper cache file now we have it, i.e. package-lock.json
as per https://github.com/actions/setup-node#caching-global-packages-data
2022-07-09 17:00:45 +02:00
rugk
79fd33d21f chore: run tests with NodeJS 14
I expect no stuff to break or so, so let's just try to use the current recommend LTS version. (v14 will also die at some time, but Fedora e.g. still seems to use it for now by default. Likely we may upgrade soon even more.)

Ref https://nodejs.org/en/about/releases/
2022-07-09 16:57:06 +02:00
rugk
08946d1cab Use npm ci instead of npm install for tests in CI
So it uses the package-json.lock file actually.
2022-07-09 16:48:21 +02:00
rugk
29b8215332 Add missing package-json.lock
NodeJS v16.14.0
2022-07-09 16:44:35 +02:00
El RIDO
f9d78d62a0 Merge pull request #945 from PrivateBin/mysql-index-exists
CREATE INDEX IF NOT EXISTS is not supported as of MySQL <= 8.0
2022-06-30 06:43:36 +02:00
El RIDO
e6d606ba88 clarify that it is only unsupported by Oracle MySQL, while supported in MariaDB, Postgres, SQLite, ... 2022-06-29 22:25:54 +02:00
El RIDO
4ad4aed875 apply table prefix to indexes as well, to support multiple instances sharing a single database 2022-06-28 06:51:21 +02:00
El RIDO
b7cffbddd0 CREATE INDEX IF NOT EXISTS is not supported as of MySQL <= 8.0, fixes #943 2022-06-27 19:05:57 +02:00
El RIDO
9b132f4054 Merge pull request #941 from PrivateBin/dependabot/github_actions/actions/checkout-3
Bump actions/checkout from 2 to 3
2022-06-10 05:04:21 +02:00
El RIDO
e052dd9d83 Merge pull request #940 from PrivateBin/dependabot/github_actions/actions/cache-3
Bump actions/cache from 2 to 3
2022-06-10 05:03:19 +02:00
dependabot[bot]
b6f35fc8ab Bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 03:02:26 +00:00
El RIDO
9291e57ac6 Merge pull request #939 from PrivateBin/dependabot/github_actions/github/codeql-action-2
Bump github/codeql-action from 1 to 2
2022-06-10 05:02:04 +02:00
El RIDO
9df0faf7b8 Merge pull request #938 from PrivateBin/dependabot/github_actions/actions/setup-node-3
Bump actions/setup-node from 2 to 3
2022-06-10 05:01:17 +02:00
github-actions[bot]
d7e88b236e Merge remote-tracking branch 'origin/master' into php8 2022-06-10 02:59:39 +00:00
dependabot[bot]
be23ae2874 Bump actions/cache from 2 to 3
Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 02:59:25 +00:00
dependabot[bot]
86794be1c4 Bump github/codeql-action from 1 to 2
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 02:59:19 +00:00
dependabot[bot]
48a6bf4416 Bump actions/setup-node from 2 to 3
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2 to 3.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 02:59:15 +00:00
El RIDO
b75bfc3e34 Merge pull request #937 from PrivateBin/dependabot
Add/enable Dependabot to keep dependencies up-to-date
2022-06-10 04:58:52 +02:00
rugk
3c8c32fbcb Add/enable Dependabot to keep dependencies up-to-date
Enabled update checking via Dependabot for
* GitHub Actions for updates or in case you are going to use that (just my default)
* PHP aka Composer

We successfully use it [for our Docker container](https://github.com/PrivateBin/docker-nginx-fpm-alpine/blob/master/.github/dependabot.yml) and IMHO that has worked quite well, so IMHO, we can also use it here now.
2022-06-09 23:42:03 +02:00
github-actions[bot]
b48430cd4d Merge remote-tracking branch 'origin/master' into php8 2022-06-08 18:29:26 +00:00
El RIDO
0ebac188a8 Merge pull request #936 from AnonymousWP/master
Add missing Dutch translations
2022-06-08 20:28:52 +02:00
AnonymousWP
dad1c5dc5b Add Dutch translations
Also fixed Dutch spelling and grammar mistakes.
2022-06-08 11:32:16 +02:00
github-actions[bot]
b5d9850bee Merge remote-tracking branch 'origin/master' into php8 2022-06-06 05:36:56 +00:00
El RIDO
c3302b5f8d Merge pull request #935 from PeGaSuS-Coder/patch-1
Update conf.sample.php
2022-06-06 07:36:21 +02:00
PeGaSuS
f8ff49509b Update conf.sample.php
Fixed typo to match the mysql database name
2022-06-05 18:42:54 +02:00
PeGaSuS
6d748de33a Update conf.sample.php
Added an working PostgreSQL database configuration.
2022-06-05 18:41:09 +02:00
github-actions[bot]
8b534ace28 Merge remote-tracking branch 'origin/master' into php8 2022-06-02 17:22:48 +00:00
El RIDO
d9857017de Merge pull request #932 from PrivateBin/php-8.1-deprecations
addressing deprecation warnings in php 8.1
2022-06-02 19:21:46 +02:00
El RIDO
07a23d7f0b addressing deprecation warnings in php 8.1
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in lib/Data/Database.php on line 280 & 555
2022-06-01 21:05:08 +02:00
El RIDO
2ad79ebf71 add php 8.1 unit tests 2022-06-01 20:50:38 +02:00
El RIDO
a376f894a9 Merge branch 'php8' of github.com:PrivateBin/PrivateBin into php8 2022-06-01 20:48:33 +02:00
github-actions[bot]
43cd87c417 Merge remote-tracking branch 'origin/master' into php8 2022-05-02 17:22:36 +00:00
El RIDO
4487171263 Merge pull request #926 from PrivateBin/crowdin-translation
New Crowdin updates
2022-05-02 19:21:58 +02:00
PrivateBin Translator Bot
3ae97cde7a New translations en.json (Catalan) 2022-05-02 00:14:26 +02:00
github-actions[bot]
b8be814015 Merge remote-tracking branch 'origin/master' into php8 2022-04-30 07:45:50 +00:00
El RIDO
e1b5d277c7 Merge pull request #925 from MTBBK/patch-1
Update tr.json
2022-04-30 09:45:20 +02:00
github-actions[bot]
b73f4be25e Merge remote-tracking branch 'origin/master' into php8 2022-04-30 07:23:22 +00:00
El RIDO
c065a4b739 Merge pull request #924 from PrivateBin/enable-turkish
Enable Turkish translation
2022-04-30 09:22:47 +02:00
MTBBK
b6fc4bd19d Update tr.json 2022-04-28 23:00:31 +03:00
El RIDO
f717334ee0 - credit & document Turkish translation
- remove plural indicators
- add plural logic and enable Turkish translation
2022-04-28 20:05:57 +02:00
El RIDO
2c01892ee1 bump github/codeql-action from 1 to 2 2022-04-28 19:47:28 +02:00
github-actions[bot]
f18770eaa6 Merge remote-tracking branch 'origin/master' into php8 2022-04-28 17:44:58 +00:00
El RIDO
14440630bb Merge pull request #923 from rahmanlar/patch-1
Update Turkish localization
2022-04-28 19:44:23 +02:00
Emir Ensar Rahmanlar
b023351991 Update Turkish localization 2022-04-28 11:37:27 +03:00
github-actions[bot]
878374979b Merge remote-tracking branch 'origin/master' into php8 2022-04-20 17:56:55 +00:00
El RIDO
d0142c31cc Merge pull request #920 from PrivateBin/mysql_ansi_quotes
Avoid SUPER privilege when setting the sql_mode for MariaDB/MySQL, fixes #919
2022-04-20 19:56:24 +02:00
El RIDO
0e2ec27033 Avoid privilege for setting the for MariaDB/MySQL, fixes #919 2022-04-19 18:44:00 +02:00
github-actions[bot]
abd722d0e4 Merge remote-tracking branch 'origin/master' into php8 2022-04-14 04:20:29 +00:00
El RIDO
a15b395eaf fix php8 refresh workflow
requires updating the commit action due to
https://github.com/github-actions-x/commit/issues/30
2022-04-14 06:19:19 +02:00
El RIDO
15a9b8d826 fix php8 refresh workflow
requires updating the commit action due to
https://github.com/github-actions-x/commit/issues/30
2022-04-14 06:17:10 +02:00
El RIDO
d2126d6dd6 fix php8 refresh workflow
requires updating the commit action due to
https://github.com/github-actions-x/commit/issues/30
2022-04-14 06:08:48 +02:00
github-actions[bot]
16d6cfb1ac Merge remote-tracking branch 'origin/master' into php8 2022-04-11 17:09:34 +00:00
El RIDO
62b14ae20f Merge pull request #916 from HLeithner/patch-1
Replace FLoC Header with browsing-topics header
2022-04-11 19:09:00 +02:00
Harald Leithner
4b3d11c988 Add browsing-topics premission policy 2022-04-10 11:28:52 +02:00
github-actions[bot]
60bb381796 Merge remote-tracking branch 'origin/master' into php8 2022-04-10 09:16:48 +00:00
El RIDO
81b8620006 Merge pull request #915 from PrivateBin/crowdin-translation
New Crowdin updates
2022-04-10 11:16:18 +02:00
Harald Leithner
7b8e031ab5 Remove FLoC Header
Google announced that it is discontinuing FLoC.
2022-04-10 10:36:39 +02:00
PrivateBin Translator Bot
cdea2917c1 New translations en.json (Chinese Simplified) 2022-04-10 09:43:11 +02:00
github-actions[bot]
f2397ac532 Merge remote-tracking branch 'origin/master' into php8 2022-04-09 17:56:36 +00:00
El RIDO
38b419945c Merge pull request #914 from imtms/master
Update zh translation
2022-04-09 19:55:59 +02:00
TMs
ba7bcbbb62 update zh translation 2022-04-09 22:42:47 +08:00
github-actions[bot]
ebf6a92c8f Merge remote-tracking branch 'origin/master' into php8 2022-04-09 12:39:05 +00:00
github-actions[bot]
634b3a6605 Merge remote-tracking branch 'origin/master' into php8 2022-04-04 17:13:18 +00:00
github-actions[bot]
e770065edf Merge remote-tracking branch 'origin/master' into php8 2022-03-30 18:49:51 +00:00
github-actions[bot]
5f53150390 Merge remote-tracking branch 'origin/master' into php8 2022-03-28 17:06:05 +00:00
github-actions[bot]
184b8b567d Merge remote-tracking branch 'origin/master' into php8 2022-03-28 17:03:38 +00:00
github-actions[bot]
de6db843ba Merge remote-tracking branch 'origin/master' into php8 2022-03-23 19:45:37 +00:00
github-actions[bot]
6caf1a5f06 Merge remote-tracking branch 'origin/master' into php8 2022-03-01 05:45:16 +00:00
github-actions[bot]
bda1ab23b8 Merge remote-tracking branch 'origin/master' into php8 2022-02-28 18:22:17 +00:00
github-actions[bot]
50fb12e3b3 Merge remote-tracking branch 'origin/master' into php8 2022-02-27 18:33:35 +00:00
github-actions[bot]
955334ff91 Merge remote-tracking branch 'origin/master' into php8 2022-02-26 10:53:14 +00:00
El RIDO
fa7aa3e88c fix composer lock 2022-02-26 07:22:32 +01:00
El RIDO
38c13398fc Merge branch 'master' into php8 2022-02-26 06:51:32 +01:00
github-actions[bot]
14de09789e Merge remote-tracking branch 'origin/master' into php8 2022-02-18 05:51:15 +00:00
github-actions[bot]
595f9cf42e Merge remote-tracking branch 'origin/master' into php8 2022-02-18 05:18:21 +00:00
github-actions[bot]
fb0d13937b Merge remote-tracking branch 'origin/master' into php8 2022-02-17 19:38:19 +00:00
github-actions[bot]
26ae7db0eb Merge remote-tracking branch 'origin/master' into php8 2022-02-13 08:04:35 +00:00
github-actions[bot]
0212429c4a Merge remote-tracking branch 'origin/master' into php8 2022-02-13 07:59:02 +00:00
github-actions[bot]
484ab3cd84 Merge remote-tracking branch 'origin/master' into php8 2022-02-12 16:29:53 +00:00
github-actions[bot]
7694c1460b Merge remote-tracking branch 'origin/master' into php8 2022-02-12 16:18:17 +00:00
github-actions[bot]
8812b09f5f Merge remote-tracking branch 'origin/master' into php8 2022-01-31 05:41:10 +00:00
github-actions[bot]
f5d8d7735f Merge remote-tracking branch 'origin/master' into php8 2022-01-10 20:29:09 +00:00
github-actions[bot]
3a801bc238 Merge remote-tracking branch 'origin/master' into php8 2021-10-30 15:26:05 +00:00
El RIDO
91462da29d update composer 2021-10-07 22:39:57 +02:00
El RIDO
5c61a442a0 phpunit compatibility 2021-10-07 22:36:11 +02:00
El RIDO
9c81d85bb7 phpunit compatibility 2021-10-07 22:34:15 +02:00
El RIDO
168ce1d85c phpunit compatibility 2021-10-07 22:25:51 +02:00
El RIDO
1f6b962468 phpunit compatibility 2021-10-07 22:24:30 +02:00
El RIDO
1f95f57be9 phpunit compatibility 2021-10-07 22:22:32 +02:00
El RIDO
a2e479192f phpunit compatibility 2021-10-07 22:20:25 +02:00
El RIDO
3f469f715f Merge branch 'master' into php8 2021-10-07 22:17:11 +02:00
rugk
79c0ad1670 Add Siftleft scan
It seems [to cover](https://slscan.io/en/latest/#supported-languages-frameworks) PHP including license check in addition to dependency scanning.
2021-06-05 00:21:48 +02:00
El RIDO
09133f4f10 kudos StyleCI for spotting the unneccessary namespace 2020-10-11 11:39:36 +02:00
El RIDO
ec190fdcf6 phpunit 9 requires php >= 7.3 2020-10-11 10:34:03 +02:00
El RIDO
17c3cb35c0 change tests for phpunit 9 support, breaking support with phpunit 5.6 2020-10-11 10:31:24 +02:00
El RIDO
37a620df95 return type void is required as of PHPunit 7, breaking test compatibility with PHP < 7.1 2020-10-10 12:22:20 +02:00
El RIDO
6f90df9545 updating tests by dropping PHPunit 4.6 support 2020-10-10 12:08:58 +02:00
El RIDO
99f50f6de3 update composer dependencies - test phpunit 9 2020-10-10 11:50:48 +02:00
El RIDO
50f81e1d2e unlock PHP 8 for composer 2020-10-10 11:24:36 +02:00
El RIDO
4312f77385 experimentally enable PHP 8 beta unit testing 2020-10-10 11:21:53 +02:00
187 changed files with 14531 additions and 3937 deletions

View File

@@ -0,0 +1,50 @@
{
"name": "PHP",
"image": "mcr.microsoft.com/devcontainers/php",
"customizations": {
"vscode": {
"extensions": [
"github.codespaces",
// PHP from https://github.com/devcontainers/templates/tree/main/src/php
"xdebug.php-debug",
"bmewburn.vscode-intelephense-client",
"xdebug.php-pack",
// PHP
"DEVSENSE.phptools-vscode",
"DEVSENSE.composer-php-vscode",
// linting
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"raymondcamden.CSSLint",
// testing
"maty.vscode-mocha-sidebar"
]
},
"codespaces": {
"openFiles": [
"README.md",
"doc/README.md"
],
"repositories": {
"PrivateBin/*": {
"permissions": {
"pull_requests": "write"
}
}
}
}
},
"features": {
"ghcr.io/devcontainers-contrib/features/mocha:2": {}
},
"forwardPorts": [
8080
],
"postCreateCommand": [
"composer install --no-dev --optimize-autoloader",
"sudo chmod a+x \"$(pwd)\" && sudo rm -rf /var/www/html && sudo ln -s \"$(pwd)\" /var/www/html",
"npm install --global nyc"
],
// alternatiuve: apache2ctl start (but requires root)
"postAttachCommand": "php -S 0.0.0.0:8080"
}

4
.gitattributes vendored
View File

@@ -1,3 +1,5 @@
bin/configuration-test-generator export-ignore
bin/icon-test export-ignore
doc/ export-ignore
tst/ export-ignore
img/browserstack.svg export-ignore
@@ -7,6 +9,7 @@ js/common.js export-ignore
js/test/ export-ignore
.codeclimate.yml export-ignore
.csslintrc export-ignore
.devcontainer export-ignore
.editorconfig export-ignore
.eslintignore export-ignore
.eslintrc export-ignore
@@ -19,6 +22,7 @@ js/test/ export-ignore
.scrutinizer.yml export-ignore
.styleci.yml export-ignore
.travis.yml export-ignore
.vscode export-ignore
codacy-analysis.yml export-ignore
crowdin.yml export-ignore
composer.json export-ignore

91
.github/DISCUSSION_TEMPLATE/q-a.yml vendored Normal file
View File

@@ -0,0 +1,91 @@
title: ""
labels: ["question/support"]
body:
- type: markdown
attributes:
value: |
## Thanks for taking the time to fill out this form!
- type: textarea
id: description
attributes:
label: Describe the problem/question
description: A clear and concise description of what the problem/issue or question is.
validations:
required: true
- type: checkboxes
id: readed-faq
attributes:
label: Did you use the FAQ section?
description: Have you read [the FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ)?
options:
- label: Yes, I have read [the FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ) and I found no solution/answer there.
required: true
- type: textarea
id: what_you_did
attributes:
label: What you did?
description: Tell us how to reproduce the problem.
value: |
1.
2.
...
validations:
required: true
- type: textarea
id: what_happens
attributes:
label: What happens
placeholder: Tell us what you see!
- type: textarea
id: what_should_happen
attributes:
label: What should happen
placeholder: Tell us what you want to see!
- type: textarea
id: additional_info
attributes:
label: Additional information
description: E.g. if you have access to the server log files, copy them here. Or copy the browser console content, if appropiate.
- type: input
id: server_address
attributes:
label: Server address
description: The instance of PrivateBin, where you experience the issue.
placeholder: e.g. https://privatebin.net
- type: input
id: server_os
attributes:
label: Server OS
placeholder: e.g. Ubuntu
- type: input
id: webserver
attributes:
label: Webserver
placeholder: e.g. Apache
- type: input
id: privatebin_version
attributes:
label: PrivateBin version
description: The PrivateBin version, where you experience the issue. It is e.g. shown at the bottom left in the web interface.
placeholder: e.g. v1.5.2
- type: input
id: browser
attributes:
label: Browser and version
placeholder: e.g. Firefox v116.3.0 (desktop)
- type: input
id: client
attributes:
label: Local operating system and version
placeholder: e.g. Windows 10
- type: dropdown
id: reproduce_issue
attributes:
label: Issue reproducibility
description: Can you reproduce this issue on [https://privatebin.net](https://privatebin.net)?
options:
- "No, I cannot reproduce it on https://privatebin.net."
- "Yes, reproducible on https://privatebin.net."
default: 0
validations:
required: true

View File

@@ -1,5 +1,16 @@
<!-- Please have a look at our FAQ before submitting an issue: https://github.com/PrivateBin/PrivateBin/wiki/FAQ -->
<!-- This is a template for a bug report. If you would like to suggest a feature, feel free to delete the part below. -->
---
name: Bug report
about: Create a report to help us improve (only for software bugs)
title: ''
labels: bug
assignees: ''
---
<!-- Please make sure to **only** use this template when it is about bugs in the PrivateBin PHP project.
Otherwise, for help and support issues e.g. for deployment issues, please go back and chose the appropiate category. -->
<!-- Describe the bug: A clear and concise description of what the bug is. -->
## Steps to reproduce
<!-- Tell us how to reproduce the problem. -->
@@ -26,7 +37,7 @@ If you have access to the server log files, also copy them here.
<!-- The Operation System of your server -->
**Server OS:**
<!-- The webserver running on your server, preferrably including the version -->
<!-- The webserver running on your server, preferably including the version -->
**Webserver:**
<!-- The version of your browser (when it is a client-side issue) -->

9
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,9 @@
blank_issues_enabled: false
contact_links:
- name: Question and support
url: https://github.com/orgs/PrivateBin/discussions/new?category=q-a
about: Your setup is not working and you need help or you have a question regarding PrivateBin
- name: Problem with the container image
url: https://github.com/PrivateBin/docker-nginx-fpm-alpine/issues/new
about: Please report all problems that apply only(!) to the official (Docker) image “docker-nginx-fpm-alpine” here.

View File

@@ -0,0 +1,22 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
## The problem
<!-- Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when -->
## The solution
<!-- A clear and concise description of what you want to happen. Pitch your solution! What would happen, if we don't implement this? -->
## Alternatives
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
## Additional context
<!-- Add any other context or screenshots about the feature request here. -->

14
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
version: 2
updates:
# Maintain dependencies for GitHub Actions
# src: https://github.com/marketplace/actions/build-and-push-docker-images#keep-up-to-date-with-github-dependabot
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
# Also keep PHP (Composer) dependencies up-to-date
# see: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
- package-ecosystem: "composer"
directory: "/"
schedule:
interval: "daily"

View File

@@ -33,11 +33,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -46,4 +46,4 @@ jobs:
# queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2

View File

@@ -1,37 +0,0 @@
name: Refresh PHP 8 branch
on:
push:
branches: [ master ]
schedule:
- cron: '42 2 * * *'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout php8 branch
uses: actions/checkout@v2
with:
# directly checkout the php8 branch
ref: php8
# Number of commits to fetch. 0 indicates all history for all branches and tags.
# Default: 1
fetch-depth: 0
- name: Merge master changes into php8
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git merge origin/master
- name: Push new changes
uses: github-actions-x/commit@v2.8
with:
name: github-actions[bot]
email: 41898282+github-actions[bot]@users.noreply.github.com
github-token: ${{ secrets.GITHUB_TOKEN }}
push-branch: 'php8'

View File

@@ -13,7 +13,7 @@ jobs:
snyk-php:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: actions/checkout@v4
- name: Install Google Cloud Storage
run: composer require --no-update google/cloud-storage && composer update --no-dev
- name: Run Snyk to check for vulnerabilities
@@ -24,6 +24,6 @@ jobs:
with:
args: --sarif-file-output=snyk.sarif
- name: Upload result to GitHub Code Scanning
uses: github/codeql-action/upload-sarif@v1
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: snyk.sarif

View File

@@ -1,5 +1,7 @@
name: Tests
on: [push]
on:
push:
workflow_dispatch:
jobs:
@@ -7,28 +9,28 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Validate composer.json and composer.lock
run: composer validate
- name: Install dependencies
run: composer install --prefer-dist --no-dev
PHPunit:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4']
php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2']
name: PHP ${{ matrix.php-versions }} unit tests on ${{ matrix.operating-system }}
env:
extensions: gd, sqlite3
extensions-cache-key-name: phpextensions
steps:
# let's get started!
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
# cache PHP extensions
- name: Setup cache environment
id: extcache
@@ -39,83 +41,80 @@ jobs:
key: ${{ runner.os }}-${{ env.extensions-cache-key }}
- name: Cache extensions
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ${{ steps.extcache.outputs.dir }}
key: ${{ steps.extcache.outputs.key }}
restore-keys: ${{ runner.os }}-${{ env.extensions-cache-key }}
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}
# Setup GitHub CI PHP problem matchers
# https://github.com/shivammathur/setup-php#problem-matchers
- name: Setup problem matchers for PHP
run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
# composer cache
- name: Remove composer lock
run: rm composer.lock
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
# http://man7.org/linux/man-pages/man1/date.1.html
# https://github.com/actions/cache#creating-a-cache-key
- name: Get Date
id: get-date
run: |
echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")"
run: echo "date=$(/bin/date -u "+%Y%m%d")" >> $GITHUB_OUTPUT
shell: bash
- name: Cache dependencies
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-
# composer installation
- name: Setup PHPunit
run: composer install -n
- name: Install Google Cloud Storage
run: composer require google/cloud-storage
# testing
- 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
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v2
uses: actions/setup-node@v3
with:
node-version: '12'
node-version: '16'
cache: 'npm'
cache-dependency-path: 'js/package.json'
cache-dependency-path: 'js/package-lock.json'
- name: Setup Mocha
run: npm install -g mocha
- name: Setup Node modules
run: npm install
working-directory: js
- name: Run unit tests
run: mocha
run: npm ci
working-directory: js
- name: Run unit tests
run: npm test
working-directory: js

1
.gitignore vendored
View File

@@ -31,6 +31,7 @@ js/node_modules/
js/test.log
tst/log/
tst/ConfigurationCombinationsTest.php
tst/.phpunit.result.cache
.settings
.buildpath
.project

View File

@@ -15,9 +15,10 @@ coding_style:
additive: false
concatenation: true
build:
image: default-bionic
environment:
php:
version: '7.2'
version: 7.4
tests:
override:
-
@@ -30,7 +31,4 @@ build:
analysis:
tests:
override:
-
command: phpcs-run
use_website_config: true
- php-scrutinizer-run

7
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"recommendations": [
"recca0120.vscode-phpunit",
"onecentlin.phpunit-snippets",
"devsense.profiler-php-vscode"
]
}

35
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,35 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch built-in server and debug",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-S",
"localhost:8000",
"-t",
"."
],
"port": 9003,
"serverReadyAction": {
"action": "openExternally"
}
},
{
"name": "Debug current script in console",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"externalConsole": false,
"port": 9003
},
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
]
}

View File

@@ -1,5 +1,30 @@
# PrivateBin version history
* **1.6.0 (2023-09-11)**
* ADDED: Translations for Japanese & Arabic
* ADDED: Configuration option to disable Email button (#1164)
* CHANGED: Minimum required PHP version is 7.3, due to upgrading PHPunit (#707)
* CHANGED: Removed PHP 5 polyfill for random_bytes()
* **1.5.2 (2023-07-09)**
* ADDED: Allow AWS SDK to use default credential provider chain for S3Storage (#1070)
* CHANGED: Upgrading libraries to: DOMpurify 3.0.4 & jQuery 3.7.0
* FIXED: Addressed PHP 8.2 deprecation warnings (#1092)
* FIXED: Expose types JSON-LD incl. configured expiration dates (#1045)
* **1.5.1 (2022-12-24)**
* ADDED: script for administrative tasks: deleting pastes (#274), removing empty directories (#277), purging expired pastes (#276) & statistics (#319)
* FIXED: Revert Filesystem purge to limited and randomized lookup (#1030)
* FIXED: Catch JSON decode errors when invalid data gets sent to the API (#1030)
* FIXED: Support sorting v1 format in mixed version comments in Filesystem backend (#1030)
* **1.5 (2022-12-11)**
* ADDED: script for data storage backend migrations (#1012)
* ADDED: Translations for Turkish, Slovak, Greek and Thai
* ADDED: S3 Storage backend (#994)
* ADDED: Jdenticons as an option for comment icons (#793)
* CHANGED: Avoid `SUPER` privilege for setting the `sql_mode` for MariaDB/MySQL (#919)
* CHANGED: Upgrading libraries to: DOMpurify 2.4.6, jQuery 3.6.1, Showdown 2.1.0 & zlib 1.2.13
* FIXED: Revert to CREATE INDEX without IF NOT EXISTS clauses, to support MySQL (#943)
* FIXED: Apply table prefix to indexes as well, to support multiple instances sharing a single database (#943)
* FIXED: YOURLS integration via new proxy, storing signature in configuration (#725)
* **1.4 (2022-04-09)**
* ADDED: Translations for Corsican, Estonian, Finnish and Lojban
* ADDED: new HTTP headers improving security (#765)

View File

@@ -29,6 +29,9 @@
* rodehoed - option to exempt ips from the rate-limiter
* Mark van Holsteijn - Google Cloud Storage backend
* Austin Huang - Oracle database support
* Felix J. Ogris - S3 Storage backend, script for data backend migrations, dropped singleton behaviour of data backends
* Mounir Idrassi & J. Mozdzen - secure YOURLS integration
* Felipe Nakandakari - enabled AWS SDK to use default credential provider chain in the S3 Storage backend
## Translations
* Hexalyse - French
@@ -56,3 +59,9 @@
* foxsouns - Lojban
* Patriccollu di Santa Maria è Sichè - Corsican
* Markus Mikkonen - Finnish
* Emir Ensar Rahmanlar - Turkish
* Stevo984 - Slovak
* Christos Karamolegkos - Greek
* jaideejung007 - Thai
* Nicolas Le Gall - Japanese
* lazerns - Arabic

View File

@@ -342,12 +342,11 @@ any theory of liability, whether in contract, strict liability, or tort
(including negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage.
## MIT License for base64.js version 1.7, Bootstrap, Identicon, random_compat, Composer, kjua and base-x
## MIT License for base64.js version 1.7, Bootstrap, Identicon, Composer, kjua and base-x
Copyright © 2012 Dan Kogai
Copyright © 2011-2016 Twitter, Inc.
Copyright © 2013 Benjamin Laugueux <benjamin@yzalis.com>
Copyright © 2015 Paragon Initiative Enterprises
Copyright © 2016 Nils Adermann, Jordi Boggiano
Copyright © 2016 Lars Jung (https://larsjung.de)
Copyright © 2018 base-x contributors

View File

@@ -1,8 +1,8 @@
.PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help
CURRENT_VERSION = 1.4.0
VERSION ?= 1.4.1
VERSION_FILES = index.php cfg/ *.md css/ i18n/ img/ js/package.json js/privatebin.js lib/ Makefile tpl/ tst/
CURRENT_VERSION = 1.6.0
VERSION ?= 1.6.1
VERSION_FILES = index.php bin/ cfg/ *.md doc/Installation.md css/ i18n/ img/ js/package.json 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")
@@ -38,7 +38,7 @@ increment: ## Increment and commit new version number, set target version using
git commit -m "incrementing version"
sign: ## Sign a release.
git tag $(VERSION)
git tag --sign --message "Release v$(VERSION)" $(VERSION)
git push origin $(VERSION)
signrelease.sh

View File

@@ -1,6 +1,6 @@
# [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/)
*Current version: 1.4.0*
*Current version: 1.6.0*
**PrivateBin** is a minimalist, open source online
[pastebin](https://en.wikipedia.org/wiki/Pastebin)
@@ -96,7 +96,7 @@ file](https://github.com/PrivateBin/PrivateBin/wiki/Configuration):
* [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/doc/Installation.md#installation)
* [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration)

View File

@@ -4,8 +4,8 @@
| Version | Supported |
| ------- | ------------------ |
| 1.4.0 | :heavy_check_mark: |
| < 1.4.0 | :x: |
| 1.6.0 | :heavy_check_mark: |
| < 1.6.0 | :x: |
## Reporting a Vulnerability

318
bin/administration Executable file
View File

@@ -0,0 +1,318 @@
#!/usr/bin/env php
<?php
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0
*/
namespace PrivateBin;
use PrivateBin\Configuration;
use PrivateBin\Data\AbstractData;
use PrivateBin\Model\Paste;
define('PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
require PATH . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
/**
* Administration
*
* Command line utility for administrative tasks.
*/
class Administration
{
/**
* configuration
*
* @access private
* @var Configuration
*/
private $_conf;
/**
* options, parsed from the command line arguments
*
* @access private
* @var array
*/
private $_opts = array();
/**
* data storage model
*
* @access private
* @var AbstractData
*/
private $_store;
/**
* deletes the requested paste ID, if a valid ID and it exists
*
* @access private
* @param string $pasteId
*/
private function _delete($pasteId)
{
if (!Paste::isValidId($pasteId)) {
self::_error('given ID is not a valid paste ID (16 hexadecimal digits)', 5);
}
if (!$this->_store->exists($pasteId)) {
self::_error('given ID does not exist, has expired or was already deleted', 6);
}
$this->_store->delete($pasteId);
if ($this->_store->exists($pasteId)) {
self::_error('paste ID exists after deletion, permission problem?', 7);
}
exit("paste $pasteId successfully deleted" . PHP_EOL);
}
/**
* removes empty directories, if current storage model uses Filesystem
*
* @access private
*/
private function _empty_dirs()
{
if ($this->_conf->getKey('class', 'model') !== 'Filesystem') {
self::_error('instance not using Filesystem storage, no directories to empty', 4);
}
$dir = $this->_conf->getKey('dir', 'model_options');
passthru("find $dir -type d -empty -delete", $code);
exit($code);
}
/**
* display a message on STDERR and exits
*
* @access private
* @static
* @param string $message
* @param int $code optional, defaults to 1
*/
private static function _error($message, $code = 1)
{
self::_error_echo($message);
exit($code);
}
/**
* display a message on STDERR
*
* @access private
* @static
* @param string $message
*/
private static function _error_echo($message)
{
fwrite(STDERR, 'Error: ' . $message . PHP_EOL);
}
/**
* display usage help on STDOUT and exits
*
* @access private
* @static
* @param int $code optional, defaults to 0
*/
private static function _help($code = 0)
{
echo <<<'EOT'
Usage:
administration [--delete <paste id> | --empty-dirs | --help | --purge | --statistics]
Options:
-d, --delete deletes the requested paste ID
-e, --empty-dirs removes empty directories (only if Filesystem storage is
configured)
-h, --help displays this help message
-p, --purge purge all expired pastes
-s, --statistics reads all stored pastes and comments and reports statistics
EOT, PHP_EOL;
exit($code);
}
/**
* return option for given short or long keyname, if it got set
*
* @access private
* @static
* @param string $short
* @param string $long
* @return string|null
*/
private function _option($short, $long)
{
foreach (array($short, $long) as $key) {
if (array_key_exists($key, $this->_opts)) {
return $this->_opts[$key];
}
}
return null;
}
/**
* initialize options from given argument array
*
* @access private
* @static
* @param array $arguments
*/
private function _options_initialize($arguments)
{
if ($arguments > 3) {
self::_error_echo('too many arguments given');
echo PHP_EOL;
self::_help(1);
}
if ($arguments < 2) {
self::_error_echo('missing arguments');
echo PHP_EOL;
self::_help(2);
}
$this->_opts = getopt('hd:eps', array('help', 'delete:', 'empty-dirs', 'purge', 'statistics'));
if (!$this->_opts) {
self::_error_echo('unsupported arguments given');
echo PHP_EOL;
self::_help(3);
}
}
/**
* reads all stored pastes and comments and reports statistics
*
* @access public
*/
private function _statistics()
{
$counters = array(
'burn' => 0,
'discussion' => 0,
'expired' => 0,
'md' => 0,
'percent' => 1,
'plain' => 0,
'progress' => 0,
'syntax' => 0,
'total' => 0,
'unknown' => 0,
);
$time = time();
$ids = $this->_store->getAllPastes();
$counters['total'] = count($ids);
$dots = $counters['total'] < 100 ? 10 : (
$counters['total'] < 1000 ? 50 : 100
);
$percentages = $counters['total'] < 100 ? 0 : (
$counters['total'] < 1000 ? 4 : 10
);
echo "Total:\t\t\t{$counters['total']}", PHP_EOL;
foreach ($ids as $pasteid) {
$paste = $this->_store->read($pasteid);
++$counters['progress'];
if (
array_key_exists('expire_date', $paste['meta']) &&
$paste['meta']['expire_date'] < $time
) {
++$counters['expired'];
}
if (array_key_exists('adata', $paste)) {
$format = $paste['adata'][1];
$discussion = $paste['adata'][2];
$burn = $paste['adata'][3];
} else {
$format = array_key_exists('formatter', $paste['meta']) ? $paste['meta']['formatter'] : 'plaintext';
$discussion = array_key_exists('opendiscussion', $paste['meta']) ? $paste['meta']['opendiscussion'] : false;
$burn = array_key_exists('burnafterreading', $paste['meta']) ? $paste['meta']['burnafterreading'] : false;
}
if ($format === 'plaintext') {
++$counters['plain'];
} elseif ($format === 'syntaxhighlighting') {
++$counters['syntax'];
} elseif ($format === 'markdown') {
++$counters['md'];
} else {
++$counters['unknown'];
}
$counters['discussion'] += (int) $discussion;
$counters['burn'] += (int) $burn;
// display progress
if ($counters['progress'] % $dots === 0) {
echo '.';
if ($percentages) {
$progress = $percentages / $counters['total'] * $counters['progress'];
if ($progress >= $counters['percent']) {
printf(' %d%% ', 100 / $percentages * $progress);
++$counters['percent'];
}
}
}
}
echo PHP_EOL, <<<EOT
Expired:\t\t{$counters['expired']}
Burn after reading:\t{$counters['burn']}
Discussions:\t\t{$counters['discussion']}
Plain Text:\t\t{$counters['plain']}
Source Code:\t\t{$counters['syntax']}
Markdown:\t\t{$counters['md']}
EOT, PHP_EOL;
if ($counters['unknown'] > 0) {
echo "Unknown format:\t\t{$counters['unknown']}", PHP_EOL;
}
}
/**
* constructor
*
* initializes and runs administrative tasks
*
* @access public
*/
public function __construct()
{
$this->_options_initialize($_SERVER['argc']);
if ($this->_option('h', 'help') !== null) {
self::_help();
}
$this->_conf = new Configuration;
if ($this->_option('e', 'empty-dirs') !== null) {
$this->_empty_dirs();
}
$class = 'PrivateBin\\Data\\' . $this->_conf->getKey('class', 'model');
$this->_store = new $class($this->_conf->getSection('model_options'));
if (($pasteId = $this->_option('d', 'delete')) !== null) {
$this->_delete($pasteId);
}
if ($this->_option('p', 'purge') !== null) {
$this->_store->purge(PHP_INT_MAX);
exit('purging of expired pastes concluded' . PHP_EOL);
}
if ($this->_option('s', 'statistics') !== null) {
$this->_statistics();
}
}
}
new Administration();

View File

@@ -9,7 +9,9 @@
* DANGER: Too many options/settings and too high max iteration setting may trigger
* a fork bomb. Please save your work before executing this script.
*/
include 'Bootstrap.php';
define('PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
include PATH . 'tst' . DIRECTORY_SEPARATOR . 'Bootstrap.php';
$vd = array('view', 'delete');
$vcd = array('view', 'create', 'delete');
@@ -392,7 +394,7 @@ class ConfigurationTestGenerator
}
}
$code .= '}' . PHP_EOL;
file_put_contents('ConfigurationCombinationsTest.php', $code);
file_put_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'tst' . DIRECTORY_SEPARATOR . 'ConfigurationCombinationsTest.php', $code);
}
/**
@@ -408,13 +410,14 @@ class ConfigurationTestGenerator
* DO NOT EDIT: This file is generated automatically using configGenerator.php
*/
use PHPUnit\Framework\TestCase;
use PrivateBin\Controller;
use PrivateBin\Data\Filesystem;
use PrivateBin\Persistence\ServerSalt;
use PrivateBin\Persistence\TrafficLimiter;
use PrivateBin\Request;
class ConfigurationCombinationsTest extends PHPUnit_Framework_TestCase
class ConfigurationCombinationsTest extends TestCase
{
private $_conf;
@@ -422,16 +425,18 @@ class ConfigurationCombinationsTest extends PHPUnit_Framework_TestCase
private $_path;
public function setUp()
public function setUp(): void
{
/* Setup Routine */
Helper::confBackup();
$this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'privatebin_data';
$this->_model = Filesystem::getInstance(array('dir' => $this->_path));
$this->_model = new Filesystem(array('dir' => $this->_path));
ServerSalt::setStore($this->_model);
TrafficLimiter::setStore($this->_model);
$this->reset();
}
public function tearDown()
public function tearDown(): void
{
/* Tear Down Routine */
unlink(CONF);
@@ -560,7 +565,7 @@ EOT;
case 'Delete':
$code .= <<<'EOT'
$this->assertRegExp(
$this->assertMatchesRegularExpression(
'#<div[^>]*id="status"[^>]*>.*Paste was properly deleted[^<]*</div>#s',
$content,
'outputs deleted status correctly'

View File

@@ -9,6 +9,7 @@ use Identicon\Generator\GdGenerator;
use Identicon\Generator\ImageMagickGenerator;
use Identicon\Generator\SvgGenerator;
use Identicon\Identicon;
use Jdenticon\Identicon as Jdenticon;
use PrivateBin\Vizhash16x16;
@@ -17,7 +18,19 @@ $vizhash = new Vizhash16x16();
$identiconGenerators = array(
'identicon GD' => new Identicon(new GdGenerator()),
'identicon ImageMagick' => new Identicon(new ImageMagickGenerator()),
'identicon SVG' => new Identicon(new SvgGenerator())
'identicon SVG' => new Identicon(new SvgGenerator()),
);
$jdenticon = new Jdenticon(array(
'size' => 16,
'style' => array(
'backgroundColor' => '#fff0', // fully transparent, for dark mode
'padding' => 0,
),
));
$jdenticonGenerators = array(
'jdenticon' => 'png',
'jdenticon ImageMagick' => 'png',
'jdenticon SVG' => 'svg',
);
$results = array(
'vizhash' => array(
@@ -35,21 +48,30 @@ $results = array(
'identicon SVG' => array(
'lengths' => array(),
'time' => 0
)
),
'jdenticon' => array(
'lengths' => array(),
'time' => 0
),
'jdenticon ImageMagick' => array(
'lengths' => array(),
'time' => 0
),
'jdenticon SVG' => array(
'lengths' => array(),
'time' => 0
),
);
$hmacs = array();
echo 'generate ', ITERATIONS, ' hmacs and pre-populate the result array, so tests wont be slowed down', PHP_EOL;
for ($i = 0; $i < ITERATIONS; ++$i) {
$hmacs[$i] = hash_hmac('sha512', '127.0.0.1', bin2hex(random_bytes(256)));
$results['vizhash']['lengths'][$i] = 0;
$results['identicon GD']['lengths'][$i] = 0;
$results['identicon ImageMagick']['lengths'][$i] = 0;
$results['identicon SVG']['lengths'][$i] = 0;
foreach (array_keys($results) as $test) {
$results[$test]['lengths'][$i] = 0;
}
}
echo 'run vizhash tests', PHP_EOL;
$start = microtime(true);
foreach ($hmacs as $i => $hmac) {
@@ -60,7 +82,6 @@ foreach ($hmacs as $i => $hmac) {
}
$results['vizhash']['time'] = microtime(true) - $start;
foreach ($identiconGenerators as $key => $identicon) {
echo 'run ', $key,' tests', PHP_EOL;
$start = microtime(true);
@@ -71,9 +92,35 @@ foreach ($identiconGenerators as $key => $identicon) {
$results[$key]['time'] = microtime(true) - $start;
}
foreach ($jdenticonGenerators as $key => $format) {
echo 'run ', $key,' tests', PHP_EOL;
if ($key === 'jdenticon ImageMagick') {
$jdenticon->enableImageMagick = true;
} else {
$jdenticon->enableImageMagick = false;
}
$start = microtime(true);
foreach ($hmacs as $i => $hmac) {
$jdenticon->setHash($hmac);
$data = $jdenticon->getImageDataUri($format);
$results[$key]['lengths'][$i] = strlen($data);
}
$results[$key]['time'] = microtime(true) - $start;
}
define('PADDING_LENGTH', max(array_map(function ($key) { return strlen($key); }, array_keys($results))) + 1);
define(
'PADDING_LENGTH',
max(
array_map(
function ($key) {
return strlen($key);
},
array_keys($results)
)
) + 1
);
function format_result_line($generator, $min, $max, $avg, $sec) {
echo str_pad($generator, PADDING_LENGTH, ' '), "\t",
str_pad($min, 4, ' ', STR_PAD_LEFT), "\t",
@@ -84,7 +131,10 @@ function format_result_line($generator, $min, $max, $avg, $sec) {
echo PHP_EOL;
format_result_line('Generator:', 'min', 'max', 'avg', 'seconds');
format_result_line(str_repeat('─', PADDING_LENGTH), str_repeat('─', 4), str_repeat('─', 4), str_repeat('─', 4), str_repeat('─', 7));
format_result_line(
str_repeat('─', PADDING_LENGTH), str_repeat('─', 4), str_repeat('─', 4),
str_repeat('─', 4), str_repeat('─', 7)
);
foreach ($results as $generator => $result) {
sort($result['lengths']);
format_result_line(

201
bin/migrate Executable file
View File

@@ -0,0 +1,201 @@
#!/usr/bin/env php
<?php
// change this, if your php files and data is outside of your webservers document root
define('PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
define('PUBLIC_PATH', __DIR__ . DIRECTORY_SEPARATOR);
require PATH . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use PrivateBin\Configuration;
use PrivateBin\Model;
// third argument in getopt requires PHP >= 7.1
if (version_compare(PHP_VERSION, '7.1.0') < 0) {
dieerr('migrate requires php 7.1 or above to work. Sorry.');
}
$longopts = array(
"delete-after",
"delete-during",
"help"
);
$opts_arr = getopt("fhnv", $longopts, $rest);
if ($opts_arr === false) {
dieerr("Erroneous command line options. Please use --help");
}
if (array_key_exists("h", $opts_arr) || array_key_exists("help", $opts_arr)) {
helpexit();
}
$delete_after = array_key_exists("delete-after", $opts_arr);
$delete_during = array_key_exists("delete-during", $opts_arr);
$force_overwrite = array_key_exists("f", $opts_arr);
$dryrun = array_key_exists("n", $opts_arr);
$verbose = array_key_exists("v", $opts_arr);
if ($rest >= $argc) {
dieerr("Missing source configuration directory");
}
if ($delete_after && $delete_during) {
dieerr("--delete-after and --delete-during are mutually exclusive");
}
$srcconf = getConfig("source", $argv[$rest]);
$rest++;
$dstconf = getConfig("destination", ($rest < $argc ? $argv[$rest] : ""));
if (($srcconf->getSection("model") == $dstconf->getSection("model")) &&
($srcconf->getSection("model_options") == $dstconf->getSection("model_options"))) {
dieerr("Source and destination storage configurations are identical");
}
$srcmodel = new Model($srcconf);
$srcstore = $srcmodel->getStore();
$dstmodel = new Model($dstconf);
$dststore = $dstmodel->getStore();
$ids = $srcstore->getAllPastes();
foreach ($ids as $id) {
debug("Reading paste id " . $id);
$paste = $srcstore->read($id);
$comments = $srcstore->readComments($id);
savePaste($force_overwrite, $dryrun, $id, $paste, $dststore);
foreach ($comments as $comment) {
saveComment($force_overwrite, $dryrun, $id, $comment, $dststore);
}
if ($delete_during) {
deletePaste($dryrun, $id, $srcstore);
}
}
if ($delete_after) {
foreach ($ids as $id) {
deletePaste($dryrun, $id, $srcstore);
}
}
debug("Done.");
function deletePaste($dryrun, $pasteid, $srcstore)
{
if (!$dryrun) {
debug("Deleting paste id " . $pasteid);
$srcstore->delete($pasteid);
} else {
debug("Would delete paste id " . $pasteid);
}
}
function saveComment ($force_overwrite, $dryrun, $pasteid, $comment, $dststore)
{
$parentid = $comment["parentid"];
$commentid = $comment["id"];
if (!$dststore->existsComment($pasteid, $parentid, $commentid)) {
if (!$dryrun) {
debug("Saving paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
$dststore->createComment($pasteid, $parentid, $commentid, $comment);
} else {
debug("Would save paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
}
} else if ($force_overwrite) {
if (!$dryrun) {
debug("Overwriting paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
$dststore->createComment($pasteid, $parentid, $commentid, $comment);
} else {
debug("Would overwrite paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
}
} else {
if (!$dryrun) {
dieerr("Not overwriting paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
} else {
dieerr("Would not overwrite paste id " . $pasteid . ", parent id " .
$parentid . ", comment id " . $commentid);
}
}
}
function savePaste ($force_overwrite, $dryrun, $pasteid, $paste, $dststore)
{
if (!$dststore->exists($pasteid)) {
if (!$dryrun) {
debug("Saving paste id " . $pasteid);
$dststore->create($pasteid, $paste);
} else {
debug("Would save paste id " . $pasteid);
}
} else if ($force_overwrite) {
if (!$dryrun) {
debug("Overwriting paste id " . $pasteid);
$dststore->create($pasteid, $paste);
} else {
debug("Would overwrite paste id " . $pasteid);
}
} else {
if (!$dryrun) {
dieerr("Not overwriting paste id " . $pasteid);
} else {
dieerr("Would not overwrite paste id " . $pasteid);
}
}
}
function getConfig ($target, $confdir)
{
debug("Trying to load " . $target . " conf.php" .
($confdir === "" ? "" : " from " . $confdir));
putenv("CONFIG_PATH=" . $confdir);
$conf = new Configuration;
putenv("CONFIG_PATH=");
return $conf;
}
function dieerr ($text)
{
fprintf(STDERR, "ERROR: %s" . PHP_EOL, $text);
die(1);
}
function debug ($text) {
if ($GLOBALS["verbose"]) {
printf("DEBUG: %s" . PHP_EOL, $text);
}
}
function helpexit ()
{
print("migrate - Copy data between PrivateBin backends
Usage:
migrate [--delete-after] [--delete-during] [-f] [-n] [-v] srcconfdir
[<dstconfdir>]
migrate [-h|--help]
Options:
--delete-after delete data from source after all pastes and comments have
successfully been copied to the destination
--delete-during delete data from source after the current paste and its
comments have successfully been copied to the destination
-f forcefully overwrite data which already exists at the
destination
-h, --help displays this help message
-n dry run, do not copy data
-v be verbose
<srcconfdir> use storage backend configration from conf.php found in
this directory as source
<dstconfdir> optionally, use storage backend configration from conf.php
found in this directory as destination; defaults to:
" . PATH . "cfg" . DIRECTORY_SEPARATOR . "conf.php
");
exit();
}

View File

@@ -7,9 +7,10 @@
; (optional) set a project name to be displayed on the website
; 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 = ""
; The full URL, with the domain name and directories that point to the
; PrivateBin files, including an ending slash (/). This URL is essential to
; allow Opengraph images to be displayed on social networks.
; basepath = "https://privatebin.example.com/"
; enable or disable the discussion feature, defaults to true
discussion = true
@@ -55,20 +56,25 @@ languageselection = false
; if this is set and language selection is disabled, this will be the only language
; languagedefault = "en"
; (optional) URL shortener address to offer after a new paste is created
; it is suggested to only use this with self-hosted shorteners as this will leak
; the pastes encryption key
; (optional) URL shortener address to offer after a new paste is created.
; It is suggested to only use this with self-hosted shorteners as this will leak
; the pastes encryption key.
; urlshortener = "https://shortener.example.com/api?link="
; (optional) Let users create a QR code for sharing the paste URL with one click.
; It works both when a new paste is created and when you view a paste.
; qrcode = true
; (optional) Let users send an email sharing the paste URL with one click.
; It works both when a new paste is created and when you view a paste.
; email = true
; (optional) IP based icons are a weak mechanism to detect if a comment was from
; 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
; leaked and a SHA256 HMAC rainbow table is generated for all (relevant) IPs.
; Can be set to one these values: "none" / "vizhash" / "identicon" (default).
; a different user when the same username was used in a comment. It might get
; used to get the IP of a comment poster if the server salt is leaked and a
; SHA512 HMAC rainbow table is generated for all (relevant) IPs.
; Can be set to one these values:
; "none" / "identicon" (default) / "jdenticon" / "vizhash".
; icon = "none"
; Content Security Policy headers allow a website to restrict what sources are
@@ -175,6 +181,7 @@ dir = PATH "data"
;[model_options]
;bucket = "my-private-bin"
;prefix = "pastes"
;uniformacl = false
;[model]
; example of DB configuration for MySQL
@@ -194,3 +201,65 @@ dir = PATH "data"
;usr = null
;pwd = null
;opt[12] = true ; PDO::ATTR_PERSISTENT
;[model]
; example of DB configuration for PostgreSQL
;class = Database
;[model_options]
;dsn = "pgsql:host=localhost;dbname=privatebin"
;tbl = "privatebin_" ; table prefix
;usr = "privatebin"
;pwd = "Z3r0P4ss"
;opt[12] = true ; PDO::ATTR_PERSISTENT
;[model]
; example of S3 configuration for Rados gateway / CEPH
;class = S3Storage
;[model_options]
;region = ""
;version = "2006-03-01"
;endpoint = "https://s3.my-ceph.invalid"
;use_path_style_endpoint = true
;bucket = "my-bucket"
;accesskey = "my-rados-user"
;secretkey = "my-rados-pass"
;[model]
; example of S3 configuration for AWS
;class = S3Storage
;[model_options]
;region = "eu-central-1"
;version = "latest"
;bucket = "my-bucket"
;accesskey = "access key id"
;secretkey = "secret access key"
;[model]
; example of S3 configuration for AWS using its SDK default credential provider chain
; if relying on environment variables, the AWS SDK will look for the following:
; - AWS_ACCESS_KEY_ID
; - AWS_SECRET_ACCESS_KEY
; - AWS_SESSION_TOKEN (if needed)
; for more details, see https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html#default-credential-chain
;class = S3Storage
;[model_options]
;region = "eu-central-1"
;version = "latest"
;bucket = "my-bucket"
[yourls]
; When using YOURLS as a "urlshortener" config item:
; - By default, "urlshortener" will point to the YOURLS API URL, with or without
; credentials, and will be visible in public on the PrivateBin web page.
; Only use this if you allow short URL creation without credentials.
; - Alternatively, using the parameters in this section ("signature" and
; "apiurl"), "urlshortener" needs to point to the base URL of your PrivateBin
; instance with "shortenviayourls?link=" appended. For example:
; urlshortener = "${basepath}shortenviayourls?link="
; This URL will in turn call YOURLS on the server side, using the URL from
; "apiurl" and the "access signature" from the "signature" parameters below.
; (optional) the "signature" (access key) issued by YOURLS for the using account
; signature = ""
; (optional) the URL of the YOURLS API, called to shorten a PrivateBin URL
; apiurl = "https://yourls.example.com/yourls-api.php"

View File

@@ -24,16 +24,17 @@
"docs" : "https://privatebin.info/codedoc/"
},
"require" : {
"php" : "^5.6.0 || ^7.0 || ^8.0",
"paragonie/random_compat" : "2.0.21",
"php" : "^7.3 || ^8.0",
"yzalis/identicon" : "2.0.0",
"mlocati/ip-lib" : "1.18.0"
"mlocati/ip-lib" : "1.18.0",
"jdenticon/jdenticon": "1.0.2"
},
"suggest" : {
"google/cloud-storage" : "1.26.1"
"google/cloud-storage" : "1.32.0",
"aws/aws-sdk-php" : "3.275.1"
},
"require-dev" : {
"phpunit/phpunit" : "^4.6 || ^5.0"
"phpunit/phpunit" : "^9"
},
"autoload" : {
"psr-4" : {
@@ -41,6 +42,12 @@
}
},
"config" : {
"autoloader-suffix" : "DontChange"
"autoloader-suffix" : "DontChange",
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"platform": {
"php": "7.3"
}
}
}

1681
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
body {

View File

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

View File

@@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved.

View File

@@ -0,0 +1,59 @@
# Generating Source Code Documentation
## Generating PHP documentation
In order to generate the documentation, you will need to install the following
packages and its dependencies:
* phpdoc
* graphviz
Details about
[installing phpDocumentor](https://phpdoc.org/docs/latest/getting-started/installing.html)
can be found in that projects documentation.
Example for Debian and Ubuntu:
```console
$ sudo apt install php-pear graphviz
$ sudo pear channel-discover pear.phpdoc.org
$ sudo pear install phpdoc/phpDocumentor
```
To generate the documentation, change into the main directory and run phpdoc:
```console
$ cd PrivateBin
$ phpdoc --visibility public,protected,private -t doc/phpdoc -d lib/
```
**Note:** When used with PHP 7, the prerelease of phpDocumentator 2.9 needs to be
manually installed by downloading it from
[GitHub](https://github.com/phpDocumentor/phpDocumentor2/releases/download/v2.9.0/phpDocumentor.phar)
and then manually moving it to e.g. `/usr/local/bin` and making it executable.
## Generating JS documentation
In order to generate the documentation, you will need to install the following
packages and its dependencies:
* npm
Then you can use the node package manager to install the latest stable release
of jsdoc globally:
```console
$ npm install -g jsdoc
```
Example for Debian and Ubuntu, including steps to allow current user to install
node modules globally:
```console
$ sudo apt install npm
$ sudo mkdir /usr/local/lib/node_modules
$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
$ npm install -g jsdoc
$ ln -s /usr/bin/nodejs /usr/local/bin/node
```
To generate the documentation, change into the main directory and run phpdoc:
```console
$ cd PrivateBin
$ jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js
```

View File

@@ -1,6 +1,8 @@
# Installation
**TL;DR:** Download the
## TL;DR
Download the
[latest release archive](https://github.com/PrivateBin/PrivateBin/releases/latest)
(with the link labelled as "Source code (…)") and extract it in your web hosts
folder where you want to install your PrivateBin instance. We try to provide a
@@ -11,22 +13,16 @@ mostly safe default configuration, but we urge you to check the
**NOTE:** See our [FAQ entry on securely downloading release files](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-can-i-securely-clonedownload-your-project)
for more information.
**NOTE:** There is a [ansible](https://ansible.com) role by @e1mo available to
install and configure PrivateBin on your server. It's available on
[ansible galaxy](https://galaxy.ansible.com/e1mo/privatebin)
([source code](https://git.sr.ht/~e1mo/ansible-role-privatebin)).
**NOTE:** There are Ansible roles available for installing and configuring PrivateBin on your server. You can choose from the following options:
- [Podman Rootless - PrivateBin by @voidquark](https://galaxy.ansible.com/voidquark/privatebin) ([Github source code](https://github.com/voidquark/privatebin)): Simplifies the deployment and management of a secure PrivateBin service using a rootless Podman container. Key features include root-less deployment, ensuring security within a user namespace, idempotent deployment for consistent state, out-of-the-box setup for Red Hat systems, and the flexibility to customize PrivateBin configurations. It has been tested on EL9.
- [Config Configuration - PrivateBin by @e1mo](https://galaxy.ansible.com/e1mo/privatebin) ([Github source code](https://git.sr.ht/~e1mo/ansible-role-privatebin)): Deploy PrivateBin configuration to disk with a customized configuration.
### Minimal Requirements
- PHP version 7.0 or above
- Or PHP version 5.6 AND _one_ of the following sources of cryptographically
safe randomness:
- [Libsodium](https://download.libsodium.org/libsodium/content/installation/)
and it's [PHP extension](https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium)
- `open_basedir` access to `/dev/urandom`
- mcrypt extension AND `open_basedir` access to `/dev/urandom`
- com_dotnet extension
- GD extension
- PHP version 7.3 or above
- GD extension (when using identicon or vizhash icons, jdenticon works without it)
- zlib extension
- some disk space or a database supported by [PDO](https://php.net/manual/book.pdo.php)
- ability to create files and folders in the installation directory and the PATH
@@ -38,10 +34,10 @@ install and configure PrivateBin on your server. It's available on
### Changing the Path
In the index.php you can define a different `PATH`. This is useful to secure
your installation. You can move the configuration, data files, templates and PHP
libraries (directories cfg, doc, data, lib, tpl, tst and vendor) outside of your
document root. This new location must still be accessible to your webserver and
PHP process (see also
your installation. You can move the utilities, configuration, data files,
templates and PHP libraries (directories bin, cfg, doc, data, lib, tpl, tst and
vendor) outside of your document root. This new location must still be
accessible to your webserver and PHP process (see also
[open_basedir setting](https://secure.php.net/manual/en/ini.core.php#ini.open-basedir)).
> #### PATH Example
@@ -205,7 +201,7 @@ CREATE INDEX parent ON prefix_comment(pasteid);
CREATE TABLE prefix_config (
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
);
INSERT INTO prefix_config VALUES('VERSION', '1.4.0');
INSERT INTO prefix_config VALUES('VERSION', '1.6.0');
```
In **PostgreSQL**, the `data`, `attachment`, `nickname` and `vizhash` columns
@@ -232,3 +228,42 @@ Platform using Google Cloud Run is easy and cheap.
To use the Google Cloud Storage backend you have to install the suggested
library using the command `composer require google/cloud-storage`.
#### Using S3 Storage
Similar to Google Cloud Storage, you can choose S3 as storage backend. It uses
the AWS SDK for PHP, but can also talk to a Rados gateway as part of a CEPH
cluster. To use this backend, you first have to install the SDK in the
document root of PrivateBin: `composer require aws/aws-sdk-php`. You have to
create the S3 bucket on the CEPH cluster before using the S3 backend.
In the `[model]` section of cfg/conf.php, set `class` to `S3Storage`.
You can set any combination of the following options in the `[model_options]`
section:
* region
* version
* endpoint
* bucket
* prefix
* accesskey
* secretkey
* use_path_style_endpoint
By default, prefix is empty. If set, the S3 backend will place all PrivateBin
data beneath this prefix.
For AWS, you have to provide at least `region`, `bucket`, `accesskey`, and
`secretkey`.
For CEPH, follow this example:
```
region = ""
version = "2006-03-01"
endpoint = "https://s3.my-ceph.invalid"
use_path_style_endpoint = true
bucket = "my-bucket"
accesskey = "my-rados-user"
secretkey = "my-rados-pass"
```

View File

@@ -1,60 +1,37 @@
Generating PHP documentation
============================
# PrivateBin Documentation
In order to generate the documentation, you will need to install the following
packages and its dependencies:
* phpdoc
* graphviz
## [Frequently Asked Questions](https://github.com/PrivateBin/PrivateBin/wiki/FAQ)
Details about
[installing phpDocumentor](https://phpdoc.org/docs/latest/getting-started/installing.html)
can be found in that projects documentation.
Please have a look at these questions *before* opening an issue in this repo.
Example for Debian and Ubuntu:
```console
$ sudo apt install php-pear graphviz
$ sudo pear channel-discover pear.phpdoc.org
$ sudo pear install phpdoc/phpDocumentor
```
## [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/doc/Installation.md#installation)
To generate the documentation, change into the main directory and run phpdoc:
```console
$ cd PrivateBin
$ phpdoc --visibility public,protected,private -t doc/phpdoc -d lib/
```
Minimal requirements, hardening and securing your installation and initial
configuration.
**Note:** When used with PHP 7, the prerelease of phpDocumentator 2.9 needs to be
manually installed by downloading it from
[GitHub](https://github.com/phpDocumentor/phpDocumentor2/releases/download/v2.9.0/phpDocumentor.phar)
and then manually moving it to e.g. `/usr/local/bin` and making it executable.
## [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration)
Generating JS documentation
============================
Detailed guide on each configuration option and their effects.
In order to generate the documentation, you will need to install the following
packages and its dependencies:
* npm
## [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates)
Then you can use the node package manager to install the latest stable release
of jsdoc globally:
How to change an existing template or create your own, as well as an overview of
the currently included templates.
```console
$ npm install -g jsdoc
```
## [Translation guide](https://github.com/PrivateBin/PrivateBin/wiki/Translation)
Example for Debian and Ubuntu, including steps to allow current user to install
node modules globally:
```console
$ sudo apt install npm
$ sudo mkdir /usr/local/lib/node_modules
$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
$ npm install -g jsdoc
$ ln -s /usr/bin/nodejs /usr/local/bin/node
```
How to help translate PrivateBin and technical background on it's implementation.
To generate the documentation, change into the main directory and run phpdoc:
```console
$ cd PrivateBin
$ jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js
```
## [Developer guide](https://github.com/PrivateBin/PrivateBin/wiki/Development)
Know how for participating in PrivateBins development.
### [Generating Source Code Documentation](https://github.com/PrivateBin/PrivateBin/blob/master/doc/Generating%20Source%20Code%20Documentation.md#generating-source-code-documentation)
How to generate the source code API documentation, as found on the project
website for [PHP](https://privatebin.info/codedoc/) and [JS](https://privatebin.info/jsdoc/)
### [Running Unit Tests](https://github.com/PrivateBin/PrivateBin/blob/master/tst/README.md#running-all-unit-tests)
How to run the PHP & JS unit tests, including a brief introduction to property
based unit testing.

View File

@@ -1,190 +1,219 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "More information on the <a href=\"https://privatebin.info/\">project page</a>.",
"Because ignorance is bliss": "Because ignorance is bliss",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s عبارة عن أداة لصق على الإنترنت بسيطة ومفتوحة المصدر حيث لا يمتلك الخادم أي معرفة بالبيانات الملصقة. يتم تشفير / فك تشفير البيانات %sفي المتصفح%s باستخدام 256 بت AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "مزيد من المعلومات على <a href=\"https://privatebin.info/\">صفحة المشروع</a>.",
"Because ignorance is bliss": "لأن الجهل نعمة",
"en": "ar",
"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.",
"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 second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"الرجاء الانتظار %d ثانية بين كل مشاركة.",
"الرجاء الانتظار %d ثواني بين كل مشاركة.",
"الرجاء الانتظار %d ثواني بين كل مشاركة.",
"الرجاء الانتظار %d ثواني بين كل مشاركة.",
"الرجاء الانتظار %d ثواني بين كل مشاركة.",
"الرجاء الانتظار %d ثواني بين كل مشاركة."
],
"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",
"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.": "جافاسكرِبت (JavaScript) مطلوب %s للعمل. نأسف للإزعاج.",
"%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 second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d ثانية",
"%d ثواني",
"%d ثواني",
"%d ثواني",
"%d ثواني",
"%d ثواني"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d دقيقة",
"%d دقائق",
"%d دقائق",
"%d دقائق",
"%d دقائق",
"%d دقائق"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d ساعة",
"%d ساعات",
"%d ساعات",
"%d ساعات",
"%d ساعات",
"%d ساعات"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d يوم",
"%d أيام",
"%d أيام",
"%d أيام",
"%d أيام",
"%d أيام"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d أسبوع",
"%d أسابيع",
"%d أسابيع",
"%d أسابيع",
"%d أسابيع",
"%d أسابيع"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d شهر",
"%d شهور",
"%d شهور",
"%d شهور",
"%d شهور",
"%d شهور"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d سنة",
"%d سنين",
"%d سنين",
"%d سنين",
"%d سنين",
"%d سنين"
],
"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.",
"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.": [
"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)"
"ستنتهي صلاحية هذا المستند في %d ثانية.",
"ستنتهي صلاحية هذا المستند في %d ثواني.",
"ستنتهي صلاحية هذا المستند في %d ثواني.",
"ستنتهي صلاحية هذا المستند في %d ثواني.",
"ستنتهي صلاحية هذا المستند في %d ثواني.",
"ستنتهي صلاحية هذا المستند في %d ثواني."
],
"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)"
"ستنتهي صلاحية هذا المستند في %d دقيقة.",
"ستنتهي صلاحية هذا المستند في %d دقائق.",
"ستنتهي صلاحية هذا المستند في %d دقائق.",
"ستنتهي صلاحية هذا المستند في %d دقائق.",
"ستنتهي صلاحية هذا المستند في %d دقائق.",
"ستنتهي صلاحية هذا المستند في %d دقائق."
],
"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)"
"ستنتهي صلاحية هذا المستند في غضون %d ساعة.",
"ستنتهي صلاحية هذا المستند في غضون %d ساعات.",
"ستنتهي صلاحية هذا المستند في غضون %d ساعات.",
"ستنتهي صلاحية هذا المستند في غضون %d ساعات.",
"ستنتهي صلاحية هذا المستند في غضون %d ساعات.",
"ستنتهي صلاحية هذا المستند في غضون %d ساعات."
],
"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)"
"ستنتهي صلاحية هذا المستند خلال %d يوم.",
"ستنتهي صلاحية هذا المستند خلال %d أيام.",
"ستنتهي صلاحية هذا المستند خلال %d أيام.",
"ستنتهي صلاحية هذا المستند خلال %d أيام.",
"ستنتهي صلاحية هذا المستند خلال %d أيام.",
"ستنتهي صلاحية هذا المستند خلال %d أيام."
],
"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)"
"ستنتهي صلاحية هذا المستند خلال %d شهر.",
"ستنتهي صلاحية هذا المستند خلال %d شهور.",
"ستنتهي صلاحية هذا المستند خلال %d شهور.",
"ستنتهي صلاحية هذا المستند خلال %d شهور.",
"ستنتهي صلاحية هذا المستند خلال %d شهور.",
"ستنتهي صلاحية هذا المستند خلال %d شهور."
],
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"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?)": "لا يمكن فك تشفير اللصق: مفتاح فك التشفير مفقود في URL (هل استخدمت معيد توجيه أو أداة تقصير لعناوين URL تزيل جزءًا من عنوان 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": "تقصير URL",
"Editor": "المحرّر",
"Preview": "معاينة",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s يتطلب PATH لينتهي ب \"%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\">الأسئلة الشائعة هذه للحصول على معلومات لتحري الخلل وإصلاحه</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.": "لا يدعم المستعرض الخاص بك WebAssembly، المستخدم لضغط zlib. يمكنك إنشاء مستندات غير مضغوطة، لكن لا يمكنك قراءة المستندات المضغوطة.",
"waiting on user to provide a password": "ينتظر المستخدم لتقديم كلمة مرور",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "تعذر فك تشفير البيانات. هل أدخلت كلمة مرور خاطئة؟ أعِد المحاولة باستخدام الزر الموجود في الأعلى.",
"Retry": "أعِد المحاولة",
"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 %s": "ملاحظة مشفرة على %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "زُر هذا الرابط لرؤية الملاحظة. يتيح إعطاء عنوان URL لأي شخص الوصول إلى الملاحظة أيضًا.",
"URL shortener may expose your decrypt key in URL.": "قد يفضح أداة تقصير عناوين URL مفتاح فك التشفير الخاص بك في URL.",
"Save paste": "احفظ اللصق",
"Your IP is not authorized to create pastes.": "عنوان IP الخاص بك غير مصرح له بإنشاء لصُق.",
"Trying to shorten a URL that isn't pointing at our instance.": "محاولة تقصير عنوان URL لا يشير إلى خادمنا.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.",
"Error parsing YOURLS response.": "خطأ في تحليل استجابة YOURLS."
}

View File

@@ -11,6 +11,8 @@
"Моля изчакайте една секунда между всяка публикация.",
"Моля изчакайте %d секунди между всяка публикация.",
"Моля изчакайте %d секунди между всяка публикация.",
"Моля изчакайте %d секунди между всяка публикация.",
"Моля изчакайте %d секунди между всяка публикация.",
"Моля изчакайте %d секунди между всяка публикация."
],
"Paste is limited to %s of encrypted data.": "Съдържанието е ограничено до %s криптирана информация.",
@@ -38,42 +40,56 @@
"%d секунди",
"%d секунда",
"%d секунда",
"%d секунда",
"%d секунда",
"%d секунда"
],
"%d minutes": [
"%d минути",
"%d минута",
"%d минута",
"%d минута",
"%d минута",
"%d минута"
],
"%d hours": [
"%d часа",
"%d час",
"%d час",
"%d час",
"%d час",
"%d час"
],
"%d days": [
"%d дни",
"%d ден",
"%d ден",
"%d ден",
"%d ден",
"%d ден"
],
"%d weeks": [
"%d седмици",
"%d седмица",
"%d седмица",
"%d седмица",
"%d седмица",
"%d седмица"
],
"%d months": [
"%d месеци",
"%d месец",
"%d месец",
"%d месец",
"%d месец",
"%d месец"
],
"%d years": [
"%d години",
"%d година",
"%d година",
"%d година",
"%d година",
"%d година"
],
"Never": "Никога",
@@ -82,30 +98,40 @@
"Този документ изтича след една секунда.",
"Този документ изтича след %d секунди.",
"Този документ изтича след %d секунди.",
"Този документ изтича след %d секунди.",
"Този документ изтича след %d секунди.",
"Този документ изтича след %d секунди."
],
"This document will expire in %d minutes.": [
"Този документ изтича след една минута.",
"Този документ изтича след %d минути.",
"Този документ изтича след %d минути.",
"Този документ изтича след %d минути.",
"Този документ изтича след %d минути.",
"Този документ изтича след %d минути."
],
"This document will expire in %d hours.": [
"Този документ изтича след един час.",
"Този документ изтича след %d часа.",
"Този документ изтича след %d часа.",
"Този документ изтича след %d часа.",
"Този документ изтича след %d часа.",
"Този документ изтича след %d часа."
],
"This document will expire in %d days.": [
"Този документ изтича след един ден.",
"Този документ изтича след %d дни.",
"Този документ изтича след %d дни.",
"Този документ изтича след %d дни.",
"Този документ изтича след %d дни.",
"Този документ изтича след %d дни."
],
"This document will expire in %d months.": [
"Този документ изтича след една година.",
"Този документ изтича след %d години.",
"Този документ изтича след %d години.",
"Този документ изтича след %d години.",
"Този документ изтича след %d години.",
"Този документ изтича след %d години."
],
"Please enter the password for this paste:": "Моля въведете паролата за това съдържание:",
@@ -139,7 +165,7 @@
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Format": "Формат",
"Plain Text": "Чист текст",
"Source Code": "Изходен код",
"Markdown": "Markdown",
@@ -172,7 +198,7 @@
"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",
"Retry": "Нов опит",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
@@ -181,10 +207,13 @@
"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",
"Close": "Затваряне",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -10,8 +10,10 @@
"Please wait %d seconds between each post.": [
"Espereu %d segon entre cada entrada.",
"Espereu %d segons entre cada entrada.",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Espereu %d segons entre cada entrada.",
"Espereu %d segons entre cada entrada.",
"Espereu %d segons entre cada entrada.",
"Espereu %d segons entre cada entrada."
],
"Paste is limited to %s of encrypted data.": "L'enganxat està limitat a %s de dades encriptades.",
"Invalid data.": "Dades no vàlides.",
@@ -37,76 +39,100 @@
"%d seconds": [
"%d segon",
"%d segons",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d segons",
"%d segons",
"%d segons",
"%d segons"
],
"%d minutes": [
"%d minut",
"%d minuts",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minuts",
"%d minuts"
],
"%d hours": [
"%d hora",
"%d hores",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hores",
"%d hores"
],
"%d days": [
"%d dia",
"%d dies",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d dies",
"%d dies",
"%d dies",
"%d dies"
],
"%d weeks": [
"%d setmana",
"%d setmanes",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d setmanes",
"%d setmanes",
"%d setmanes",
"%d setmanes"
],
"%d months": [
"%d mes",
"%d mesos",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d mesos",
"%d mesos",
"%d mesos",
"%d mesos"
],
"%d years": [
"%d any",
"%d anys",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d anys",
"%d anys",
"%d anys",
"%d anys"
],
"Never": "Mai",
"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)"
"Aquest document caducarà d'aquí %d segon.",
"Aquest document caducarà d'aquí %d segons.",
"Aquest document caducarà d'aquí %d segons.",
"Aquest document caducarà d'aquí %d segons.",
"Aquest document caducarà d'aquí %d segons.",
"Aquest document caducarà d'aquí %d segons."
],
"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)"
"Aquest document caducarà d'aquí %d minut.",
"Aquest document caducarà d'aquí %d minuts.",
"Aquest document caducarà d'aquí %d minuts.",
"Aquest document caducarà d'aquí %d minuts.",
"Aquest document caducarà d'aquí %d minuts.",
"Aquest document caducarà d'aquí %d minuts."
],
"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)"
"Aquest document caducarà d'aquí %d hora.",
"Aquest document caducarà d'aquí %d hores.",
"Aquest document caducarà d'aquí %d hores.",
"Aquest document caducarà d'aquí %d hores.",
"Aquest document caducarà d'aquí %d hores.",
"Aquest document caducarà d'aquí %d hores."
],
"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)"
"Aquest document caducarà d'aquí %d dia.",
"Aquest document caducarà d'aquí %d dies.",
"Aquest document caducarà d'aquí %d dies.",
"Aquest document caducarà d'aquí %d dies.",
"Aquest document caducarà d'aquí %d dies.",
"Aquest document caducarà d'aquí %d dies."
],
"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)"
"Aquest document caducarà d'aquí %d mes.",
"Aquest document caducarà d'aquí %d mesos.",
"Aquest document caducarà d'aquí %d mesos.",
"Aquest document caducarà d'aquí %d mesos.",
"Aquest document caducarà d'aquí %d mesos.",
"Aquest document caducarà d'aquí %d mesos."
],
"Please enter the password for this paste:": "Si us plau, introdueix la contrasenya per aquest paste:",
"Could not decrypt data (Wrong key?)": "No s'han pogut desxifrar les dades (Clau incorrecte?)",
@@ -124,7 +150,7 @@
"Could not refresh display: %s": "Could not refresh display: %s",
"unknown status": "estat desconegut",
"server error or not responding": "server error or not responding",
"Could not post comment: %s": "Could not post comment: %s",
"Could not post comment: %s": "No s'ha pogut publicar el comentari: %s",
"Sending paste…": "Enviant 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": "Esborrar les dades",
@@ -146,7 +172,7 @@
"Download attachment": "Baixar els adjunts",
"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",
"Attach a file": "Adjuntar un fitxer",
"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",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Aspettate %d seconda trà dui publicazioni.",
"Aspettate %d seconde trà dui publicazioni.",
"Aspettate %d seconde trà dui publicazioni.",
"Aspettate %d seconde trà dui publicazioni.",
"Aspettate %d seconde trà dui publicazioni.",
"Aspettate %d seconde trà dui publicazioni."
],
"Paste is limited to %s of encrypted data.": "Lappiccicu hè limitatu à %s di dati cifrati.",
@@ -38,42 +40,56 @@
"%d seconda",
"%d seconde",
"%d seconde",
"%d seconde",
"%d seconde",
"%d seconde"
],
"%d minutes": [
"%d minutu",
"%d minuti",
"%d minuti",
"%d minuti",
"%d minuti",
"%d minuti"
],
"%d hours": [
"%d ora",
"%d ore",
"%d ore",
"%d ore",
"%d ore",
"%d ore"
],
"%d days": [
"%d ghjornu",
"%d ghjorni",
"%d ghjorni",
"%d ghjorni",
"%d ghjorni",
"%d ghjorni"
],
"%d weeks": [
"%d settimana",
"%d settimane",
"%d settimane",
"%d settimane",
"%d settimane",
"%d settimane"
],
"%d months": [
"%d mese",
"%d mesi",
"%d mesi",
"%d mesi",
"%d mesi",
"%d mesi"
],
"%d years": [
"%d annu",
"%d anni",
"%d anni",
"%d anni",
"%d anni",
"%d anni"
],
"Never": "Mai",
@@ -82,30 +98,40 @@
"Stu ducumentu serà scadutu in %d seconda.",
"Stu ducumentu serà scadutu in %d seconde.",
"Stu ducumentu serà scadutu in %d seconde.",
"Stu ducumentu serà scadutu in %d seconde.",
"Stu ducumentu serà scadutu in %d seconde.",
"Stu ducumentu serà scadutu in %d seconde."
],
"This document will expire in %d minutes.": [
"Stu ducumentu serà scadutu in %d minutu.",
"Stu ducumentu serà scadutu in %d minuti.",
"Stu ducumentu serà scadutu in %d minuti.",
"Stu ducumentu serà scadutu in %d minuti.",
"Stu ducumentu serà scadutu in %d minuti.",
"Stu ducumentu serà scadutu in %d minuti."
],
"This document will expire in %d hours.": [
"Stu ducumentu serà scadutu in %d ora.",
"Stu ducumentu serà scadutu in %d ore.",
"Stu ducumentu serà scadutu in %d ore.",
"Stu ducumentu serà scadutu in %d ore.",
"Stu ducumentu serà scadutu in %d ore.",
"Stu ducumentu serà scadutu in %d ore."
],
"This document will expire in %d days.": [
"Stu ducumentu serà scadutu in %d ghjornu.",
"Stu ducumentu serà scadutu in %d ghjorni.",
"Stu ducumentu serà scadutu in %d ghjorni.",
"Stu ducumentu serà scadutu in %d ghjorni.",
"Stu ducumentu serà scadutu in %d ghjorni.",
"Stu ducumentu serà scadutu in %d ghjorni."
],
"This document will expire in %d months.": [
"Stu ducumentu serà scadutu in %d mese.",
"Stu ducumentu serà scadutu in %d mesi.",
"Stu ducumentu serà scadutu in %d mesi.",
"Stu ducumentu serà scadutu in %d mesi.",
"Stu ducumentu serà scadutu in %d mesi.",
"Stu ducumentu serà scadutu in %d mesi."
],
"Please enter the password for this paste:": "Stampittate a parolla dintesa per stappiccicu :",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Impiegà u fusu orariu attuale",
"Convert To UTC": "Cunvertisce in UTC",
"Close": "Chjode",
"Encrypted note on PrivateBin": "Nota cifrata nantà PrivateBin",
"Encrypted note on %s": "Nota cifrata nantà %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitate stu liame per vede a nota. Date lindirizzu à qualunque li permette daccede à a nota dinù.",
"URL shortener may expose your decrypt key in URL.": "Un ammuzzatore dindirizzu pò palisà a vostra chjave di dicifratura in lindirizzu.",
"Save paste": "Arregistrà lappiccicu",
"Your IP is not authorized to create pastes.": "U vostru indirizzu IP ùn hè micca auturizatu à creà lappiccichi."
"Your IP is not authorized to create pastes.": "U vostru indirizzu IP ùn hè micca auturizatu à creà lappiccichi.",
"Trying to shorten a URL that isn't pointing at our instance.": "Pruvate dammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una \"apiurl\" o \"signature\" falsa o assente.",
"Error parsing YOURLS response.": "Sbagliu durante lanalisa di a risposta di YOURLS."
}

View File

@@ -8,6 +8,8 @@
"%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s nebo vyšší. Lituji.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby byla v konfiguračním souboru přítomna sekce [%s].",
"Please wait %d seconds between each post.": [
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
@@ -38,43 +40,57 @@
"%d sekuda",
"%d sekundy",
"%d sekund",
"%d seconds (3rd plural)"
"%d sekund",
"%d sekund",
"%d sekund"
],
"%d minutes": [
"%d minuta",
"%d minuty",
"%d minut",
"%d minutes (3rd plural)"
"%d minut",
"%d minut",
"%d minut"
],
"%d hours": [
"%d hodin",
"%d hodina",
"%d hodiny",
"%d hodin",
"%d hours (3rd plural)"
"%d hodin",
"%d hodin",
"%d hodin"
],
"%d days": [
"%d den",
"%d dny",
"%d dní",
"%d days (3rd plural)"
"%d dní",
"%d dní",
"%d dní"
],
"%d weeks": [
"%d týden",
"%d týdeny",
"%d týdnů",
"%d weeks (3rd plural)"
"%d týdnů",
"%d týdnů",
"%d týdnů"
],
"%d months": [
"%d měsíc",
"%d měsíce",
"%d měsíců",
"%d months (3rd plural)"
"%d měsíců",
"%d měsíců",
"%d měsíců"
],
"%d years": [
"%d rok",
"%d roky",
"%d roků",
"%d years (3rd plural)"
"%d roků",
"%d roků",
"%d roků"
],
"Never": "Nikdy",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Poznámka: Tato služba slouží k vyzkoušení: Data mohou být kdykoliv smazána. Při zneužití této služby zemřou koťátka.",
@@ -82,30 +98,40 @@
"Tento dokument expiruje za %d sekundu.",
"Tento dokument expiruje za %d sekundy.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund."
],
"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.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut."
],
"This document will expire in %d hours.": [
"Tento dokument expiruje za %d hodinu.",
"Tento dokument expiruje za %d hodiny.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin."
],
"This document will expire in %d days.": [
"Tento dokument expiruje za %d den.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny."
],
"This document will expire in %d months.": [
"Tento dokument expiruje za %d měsíc.",
"Tento dokument expiruje za %d měsíce.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců."
],
"Please enter the password for this paste:": "Zadejte prosím heslo:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Použít aktuální časové pásmo",
"Convert To UTC": "Převést na UTC",
"Close": "Zavřít",
"Encrypted note on PrivateBin": "Šifrovaná poznámka ve službě PrivateBin",
"Encrypted note on %s": "Šifrovaná poznámka ve službě %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Navštivte tento odkaz pro zobrazení poznámky. Přeposláním URL umožníte také jiným lidem přístup.",
"URL shortener may expose your decrypt key in URL.": "Zkracovač URL může odhalit váš dešifrovací klíč v URL.",
"Save paste": "Uložit příspěvek",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Vaše IP adresa nemá oprávnění k vytvoření vložení.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Bitte warte eine Sekunde zwischen dem Absenden zweier Beiträge.",
"Bitte warte %d Sekunden zwischen dem Absenden zweier Beiträge.",
"Bitte warte %d Sekunden zwischen dem Absenden zweier Beiträge.",
"Bitte warte %d Sekunden zwischen dem Absenden zweier Beiträge.",
"Bitte warte %d Sekunden zwischen dem Absenden zweier Beiträge.",
"Bitte warte %d Sekunden zwischen dem Absenden zweier Beiträge."
],
"Paste is limited to %s of encrypted data.": "Texte sind auf %s verschlüsselte Datenmenge beschränkt.",
@@ -37,44 +39,58 @@
"%d seconds": [
"%d Sekunde",
"%d Sekunden",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d Sekunden",
"%d Sekunden",
"%d Sekunden",
"%d Sekunden"
],
"%d minutes": [
"%d Minute",
"%d Minuten",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d Minuten",
"%d Minuten",
"%d Minuten",
"%d Minuten"
],
"%d hours": [
"%d Stunde",
"%d Stunden",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d Stunden",
"%d Stunden",
"%d Stunden",
"%d Stunden"
],
"%d days": [
"%d Tag",
"%d Tage",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d Tage",
"%d Tage",
"%d Tage",
"%d Tage"
],
"%d weeks": [
"%d Woche",
"%d Wochen",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d Wochen",
"%d Wochen",
"%d Wochen",
"%d Wochen"
],
"%d months": [
"%d Monat",
"%d Monate",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d Monate",
"%d Monate",
"%d Monate",
"%d Monate"
],
"%d years": [
"%d Jahr",
"%d Jahre",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d Monate",
"%d Monate",
"%d Monate",
"%d Monate"
],
"Never": "Nie",
"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.",
@@ -82,30 +98,40 @@
"Dieses Dokument läuft in einer Sekunde ab.",
"Dieses Dokument läuft in %d Sekunden ab.",
"Dieses Dokument läuft in %d Sekunden ab.",
"Dieses Dokument läuft in %d Sekunden ab.",
"Dieses Dokument läuft in %d Sekunden ab.",
"Dieses Dokument läuft in %d Sekunden ab."
],
"This document will expire in %d minutes.": [
"Dieses Dokument läuft in einer Minute ab.",
"Dieses Dokument läuft in %d Minuten ab.",
"Dieses Dokument läuft in %d Minuten ab.",
"Dieses Dokument läuft in %d Minuten ab.",
"Dieses Dokument läuft in %d Minuten ab.",
"Dieses Dokument läuft in %d Minuten ab."
],
"This document will expire in %d hours.": [
"Dieses Dokument läuft in einer Stunde ab.",
"Dieses Dokument läuft in %d Stunden ab.",
"This document will expire in %d hours (2nd plural)",
"This document will expire in %d hours (3rd plural)"
"Dieses Dokument läuft in %d Stunden ab.",
"Dieses Dokument läuft in %d Stunden ab.",
"Dieses Dokument läuft in %d Stunden ab.",
"Dieses Dokument läuft in %d Stunden ab."
],
"This document will expire in %d days.": [
"Dieses Dokument läuft in einem Tag ab.",
"Dieses Dokument läuft in %d Tagen ab.",
"Dieses Dokument läuft in %d Tagen ab.",
"Dieses Dokument läuft in %d Tagen ab.",
"Dieses Dokument läuft in %d Tagen ab.",
"Dieses Dokument läuft in %d Tagen ab."
],
"This document will expire in %d months.": [
"Dieses Dokument läuft in einem Monat ab.",
"Dieses Dokument läuft in %d Monaten ab.",
"Dieses Dokument läuft in %d Monaten ab.",
"Dieses Dokument läuft in %d Monaten ab.",
"Dieses Dokument läuft in %d Monaten ab.",
"Dieses Dokument läuft in %d Monaten ab."
],
"Please enter the password for this paste:": "Bitte gib das Passwort für diesen Text ein:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Aktuelle Zeitzone verwenden",
"Convert To UTC": "In UTC umwandeln",
"Close": "Schliessen",
"Encrypted note on PrivateBin": "Verschlüsselte Notiz auf PrivateBin",
"Encrypted note on %s": "Verschlüsselte Notiz auf %s",
"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 dieses Dokument zugreifen.",
"URL shortener may expose your decrypt key in URL.": "Der URL-Verkürzer kann den Schlüssel in der URL enthüllen.",
"Save paste": "Text speichern",
"Your IP is not authorized to create pastes.": "Deine IP ist nicht berechtigt, Texte zu erstellen."
"Your IP is not authorized to create pastes.": "Deine IP ist nicht berechtigt, Texte zu erstellen.",
"Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".",
"Error parsing YOURLS response.": "Fehler beim Verarbeiten der YOURLS-Antwort."
}

View File

@@ -1,135 +1,161 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "More information on the <a href=\"https://privatebin.info/\">project page</a>.",
"Because ignorance is bliss": "Because ignorance is bliss",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s είναι ένα λιτό, ανοικτού λογισμικού διαδικτυακής υπηρεσίας επικόλλησης όπου ο διακομιστής έχει πλήρη άγνια του περιεχομένου που επικολλήθηκαν. Τα Δεδομένα κρυπτογραφούνται και αποκρυπτογραφούνται %sστον φιλομετρητή (browser)%s χρησιμοποιόντας 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Περισσότερες πληροφορίες στον <a href=\"https://privatebin.info/\">ιστότοπο του εργαλείου</a>.",
"Because ignorance is bliss": "Επειδή η άγνοια είναι ευτυχία",
"en": "el",
"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.",
"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 second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Παρακαλώ περιμένετε %d δευτερόλεπτο μεταξύ κάθε επικόλλησης.",
"Παρακαλώ περιμένετε %d δευτερόλεπτα μεταξύ κάθε επικόλλησης.",
"Παρακαλώ περιμένετε %d δευτερόλεπτα μεταξύ κάθε επικόλλησης.",
"Παρακαλώ περιμένετε %d δευτερόλεπτα μεταξύ κάθε επικόλλησης.",
"Παρακαλώ περιμένετε %d δευτερόλεπτα μεταξύ κάθε επικόλλησης.",
"Παρακαλώ περιμένετε %d δευτερόλεπτα μεταξύ κάθε επικόλλησης."
],
"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",
"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.": "Η JavaScript είναι απαραίτητη για να λειτουργήσει το %s. Συγγνώμη για την ταλαιπωρία.",
"%s requires a modern browser to work.": "%s απαιτεί σύγχρονο φυλλομετρητή (browser) για να λειτουργήσει.",
"New": "Νέο",
"Send": "Αποστολή",
"Clone": "Κλωνοποίηση",
"Raw text": "Κείμενο",
"Expires": "Λήγει",
"Burn after reading": "Διαγραφή μετά την ανάγνωση",
"Open discussion": "Ανοικτή συζήτηση",
"Password (recommended)": "Κωδικός (προτείνεται)",
"Discussion": "Συζήτηση",
"Toggle navigation": "Εναλλαγή πλοήγησης",
"%d seconds": [
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d δευτερόλεπτο",
"%d δευτερόλεπτα",
"%d δευτερόλεπτα",
"%d δευτερόλεπτα",
"%d δευτερόλεπτα",
"%d δευτερόλεπτα"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d λεπτό",
"%d λεπτά",
"%d λεπτά",
"%d λεπτά",
"%d λεπτά",
"%d λεπτά"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d ώρα",
"%d ώρες",
"%d ώρες",
"%d ώρες",
"%d ώρες",
"%d ώρες"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d ημέρα",
"%d ημέρες",
"%d ημέρες",
"%d ημέρες",
"%d ημέρες",
"%d ημέρες"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d εβδομάδα",
"%d εβδομάδες",
"%d εβδομάδες",
"%d εβδομάδες",
"%d εβδομάδες",
"%d εβδομάδες"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d μήνας",
"%d μήνες",
"%d μήνες",
"%d μήνες",
"%d μήνες",
"%d μήνες"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d χρόνο",
"%d χρόνια",
"%d χρόνια",
"%d χρόνια",
"%d χρόνια",
"%d χρόνια"
],
"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.",
"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.": [
"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)"
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτο.",
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτα.",
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτα.",
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτα.",
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτα.",
"Αυτό το έγγραφο θα λήξει σε %d δευτερόλεπτα."
],
"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)"
"Αυτό το έγγραφο θα λήξει σε %d λεπτό.",
"Αυτό το έγγραφο θα λήξει σε %d λεπτά.",
"Αυτό το έγγραφο θα λήξει σε %d λεπτά.",
"Αυτό το έγγραφο θα λήξει σε %d λεπτά.",
"Αυτό το έγγραφο θα λήξει σε %d λεπτά.",
"Αυτό το έγγραφο θα λήξει σε %d λεπτά."
],
"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)"
"Αυτό το έγγραφο θα λήξει σε %d ώρα.",
"Αυτό το έγγραφο θα λήξει σε %d ώρες.",
"Αυτό το έγγραφο θα λήξει σε %d ώρες.",
"Αυτό το έγγραφο θα λήξει σε %d ώρες.",
"Αυτό το έγγραφο θα λήξει σε %d ώρες.",
"Αυτό το έγγραφο θα λήξει σε %d ώρες."
],
"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)"
"Αυτό το έγγραφο θα λήξει σε %d ημέρα.",
"Αυτό το έγγραφο θα λήξει σε %d ημέρες.",
"Αυτό το έγγραφο θα λήξει σε %d ημέρες.",
"Αυτό το έγγραφο θα λήξει σε %d ημέρες.",
"Αυτό το έγγραφο θα λήξει σε %d ημέρες.",
"Αυτό το έγγραφο θα λήξει σε %d ημέρες."
],
"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)"
"Αυτό το έγγραφο θα λήξει σε %d μήνα.",
"Αυτό το έγγραφο θα λήξει σε %d μήνες.",
"Αυτό το έγγραφο θα λήξει σε %d μήνες.",
"Αυτό το έγγραφο θα λήξει σε %d μήνες.",
"Αυτό το έγγραφο θα λήξει σε %d μήνες.",
"Αυτό το έγγραφο θα λήξει σε %d μήνες."
],
"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?)",
"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": "το avatar δημιουργήθηκε από τη διεύθυνση 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",
@@ -139,52 +165,55 @@
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Plain Text": "Plain Text",
"Source Code": "Source Code",
"Format": "Μορφοποίηση",
"Plain Text": "Απλό κείμενο",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"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": "εναλλακτικά σύρετε το αρχείο ή επικολλήστε μία εικόνα από το 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.": "Ο φυλλομετρητής (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.": "%s απαιτεί το PATH να τελειώνει σε \"%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\">Ερωταποκρίσεις για πληροφορίες στην αντιμετώπιση προβλημάτων</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.": "Ο φυλλομετρητής σας δεν υποστηρίζει WebAssembly, που χρησιμοποιήθηκε για zlib συμπίεση. Μπορείτε να δημιουργήσετε ασυμπίεστα αρχεία αλλά δεν μπορείτε να διαβάσετε συμπιεσμένα.",
"waiting on user to provide a password": "Αναμονή ο χρήστης να δώσει τον κωδικό",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Δεν ήταν δυνατή η αποκρυπτογράφηση των δεδομένων. Μήπως εισάγατε λάθος κωδικό; Προσπαθήστε με το κουμπί στο επάνω μέρος.",
"Retry": "Επαναπροσπάθεια",
"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 %s": "Κρυπτογραφημένο μήνυμα από το %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Επισκεφτείτε αυτόν τον σύνδεσμο για να δείτε το μήνυμα. Δίνοντας τον σύνδεσμο σε οποιονδήποτε, του επιτρέπετε να επισκεφτεί το μήνυμα επίσης.",
"URL shortener may expose your decrypt key in URL.": "Συντομευτές συνδέσμων πιθανώς να δημοσιοποιήσουν το κλειδί αποκρυπτογράφισης στον σύνδεσμο.",
"Save paste": "Αποθήκευση επικόλλησης",
"Your IP is not authorized to create pastes.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -2,7 +2,7 @@
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%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 %sen el navegador%s usando 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "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",
"Because ignorance is bliss": "Porque la ignorancia es felicidad",
"en": "es",
"Paste does not exist, has expired or has been deleted.": "El \"paste\" no existe, ha caducado o ha sido eliminado.",
"%s requires php %s or above to work. Sorry.": "%s requiere php %s o superior para funcionar. Lo siento.",
@@ -11,6 +11,8 @@
"Por favor espere %d segundo entre cada publicación.",
"Por favor espere %d segundos entre cada publicación.",
"Por favor espere %d segundos entre cada publicación.",
"Por favor espere %d segundos entre cada publicación.",
"Por favor espere %d segundos entre cada publicación.",
"Por favor espere %d segundos entre cada publicación."
],
"Paste is limited to %s of encrypted data.": "El \"paste\" está limitado a %s de datos cifrados.",
@@ -38,42 +40,56 @@
"%d segundo",
"%d segundos",
"%d segundos",
"%d segundos",
"%d segundos",
"%d segundos"
],
"%d minutes": [
"%d minuto",
"%d minutos",
"%d minutos",
"%d minutos",
"%d minutos",
"%d minutos"
],
"%d hours": [
"%d hora",
"%d horas",
"%d horas",
"%d horas",
"%d horas",
"%d horas"
],
"%d days": [
"%d día",
"%d días",
"%d días",
"%d días",
"%d días",
"%d días"
],
"%d weeks": [
"%d semana",
"%d semanas",
"%d semanas",
"%d semanas",
"%d semanas",
"%d semanas"
],
"%d months": [
"%d mes",
"%d meses",
"%d minutos",
"%d meses",
"%d meses",
"%d meses",
"%d meses"
],
"%d years": [
"%d año",
"%d años",
"%d años",
"%d años",
"%d años",
"%d años"
],
"Never": "Nunca",
@@ -82,30 +98,40 @@
"Este documento caducará en un segundo.",
"Este documento caducará en %d segundos.",
"Este documento caducará en %d segundos",
"Este documento caducará en %d segundos",
"Este documento caducará en %d segundos",
"Este documento caducará en %d segundos"
],
"This document will expire in %d minutes.": [
"Este documento caducará en un minuto.",
"Este documento caducará en %d minutos.",
"Este documento caducará en %d minutos",
"Este documento caducará en %d minutos",
"Este documento caducará en %d minutos",
"Este documento caducará en %d minutos"
],
"This document will expire in %d hours.": [
"Este documento caducará en una hora.",
"Este documento caducará en %d horas.",
"Este documento caducará en %d horas",
"Este documento caducará en %d horas",
"Este documento caducará en %d horas",
"Este documento caducará en %d horas"
],
"This document will expire in %d days.": [
"Este documento caducará en un día.",
"Este documento caducará en %d días.",
"Este documento caducará en %d días",
"Este documento caducará en %d días",
"Este documento caducará en %d días",
"Este documento caducará en %d días"
],
"This document will expire in %d months.": [
"Este documento caducará en un mes.",
"Este documento caducará en %d meses.",
"Este documento caducará en %d meses",
"Este documento caducará en %d meses",
"Este documento caducará en %d meses",
"Este documento caducará en %d meses"
],
"Please enter the password for this paste:": "Por favor ingrese la contraseña para este \"paste\":",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Usar Zona Horaria Actual",
"Convert To UTC": "Convertir A UTC",
"Close": "Cerrar",
"Encrypted note on PrivateBin": "Nota cifrada en PrivateBin",
"Encrypted note on %s": "Nota cifrada en %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "El acortador de URL puede exponer su clave de descifrado en el URL.",
"Save paste": "Guardar \"paste\"",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Tu IP no está autorizada para crear contenido.",
"Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Palun oota %d sekund iga postituse vahel.",
"Palun oota %d sekundit iga postituse vahel.",
"Palun oota %d sekundit iga postituse vahel.",
"Palun oota %d sekundit iga postituse vahel.",
"Palun oota %d sekundit iga postituse vahel.",
"Palun oota %d sekundit iga postituse vahel."
],
"Paste is limited to %s of encrypted data.": "Kleepe limiit on %s krüpteeritud andmeid.",
@@ -38,71 +40,95 @@
"%d sekund",
"%d sekundit",
"%d sekundit",
"%d sekundit",
"%d sekundit",
"%d sekundit"
],
"%d minutes": [
"%d minut",
"%d minutit",
"%d minutit",
"%d minutit",
"%d minutit",
"%d minutit"
],
"%d hours": [
"%d tund",
"%d tundi",
"%d tundi",
"%d tundi",
"%d tundi",
"%d tundi"
],
"%d days": [
"%d päev",
"%d päeva",
"%d päeva",
"%d päeva",
"%d päeva",
"%d päeva"
],
"%d weeks": [
"%d nädal",
"%d nädalat",
"%d nädalat",
"%d nädalat",
"%d nädalat",
"%d nädalat"
],
"%d months": [
"%d kuu",
"%d kuud",
"%d kuud",
"%d kuud",
"%d kuud",
"%d kuud"
],
"%d years": [
"%d aasta",
"%d aastat",
"%d aastat",
"%d aastat",
"%d aastat",
"%d aastat"
],
"Never": "Mitte kunagi",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Märge: See on testimisteenus: Andmeid võidakse igal ajal kustutada. Kiisupojad hukuvad, kui seda teenust kuritarvitad.",
"This document will expire in %d seconds.": [
"See dokument aegub %d sekundi pärast.",
"See dokument aegub %d sekundi pärast.",
"See dokument aegub %d sekundi pärast.",
"See dokument aegub %d sekundi pärast.",
"See dokument aegub %d sekundi pärast.",
"See dokument aegub %d sekundi pärast."
],
"This document will expire in %d minutes.": [
"See dokument aegub %d minuti pärast.",
"See dokument aegub %d minuti pärast.",
"See dokument aegub %d minuti pärast.",
"See dokument aegub %d minuti pärast.",
"See dokument aegub %d minuti pärast.",
"See dokument aegub %d minuti pärast."
],
"This document will expire in %d hours.": [
"See dokument aegub %d tunni pärast.",
"See dokument aegub %d tunni pärast.",
"See dokument aegub %d tunni pärast.",
"See dokument aegub %d tunni pärast.",
"See dokument aegub %d tunni pärast.",
"See dokument aegub %d tunni pärast."
],
"This document will expire in %d days.": [
"See dokument aegub %d päeva pärast.",
"See dokument aegub %d päeva pärast.",
"See dokument aegub %d päeva pärast.",
"See dokument aegub %d päeva pärast.",
"See dokument aegub %d päeva pärast.",
"See dokument aegub %d päeva pärast."
],
"This document will expire in %d months.": [
"See dokument aegub %d kuu pärast.",
"See dokument aegub %d kuu pärast.",
"See dokument aegub %d kuu pärast.",
"See dokument aegub %d kuu pärast.",
"See dokument aegub %d kuu pärast.",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Kasuta praegust ajavööndit",
"Convert To UTC": "Teisenda UTC-ks",
"Close": "Sulge",
"Encrypted note on PrivateBin": "Krüpteeritud kiri PrivateBin-is",
"Encrypted note on %s": "Krüpteeritud kiri %s-is",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kirja nägemiseks külasta seda linki. Teistele URL-i andmine lubab ka neil ligi pääseda kirjale.",
"URL shortener may expose your decrypt key in URL.": "URL-i lühendaja võib paljastada sinu dekrüpteerimisvõtme URL-is.",
"Save paste": "Salvesta kleebe",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -1,16 +1,18 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s on minimalistinen, avoimen lähdekoodin online pastebin jossa palvelimella ei ole tietoa syötetystä datasta. Data salataan/puretaan %sselaimessa%s käyttäen 256-bittistä AES:ää.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Enemmän tietoa <a href=\"https://privatebin.info/\">projektisivulla</a>.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Lisää tietoa <a href=\"https://privatebin.info/\">projektisivulla</a>.",
"Because ignorance is bliss": "Koska tieto lisää tuskaa",
"en": "fi",
"Paste does not exist, has expired or has been deleted.": "Pastea ei ole olemassa, se on vanhentunut, tai se on poistettu.",
"%s requires php %s or above to work. Sorry.": "%s tarvitsee php %s-versiota tai uudempaa toimiakseen. Anteeksi.",
"Paste does not exist, has expired or has been deleted.": "Pastea ei ole olemassa, se on vanhentunut tai se on poistettu.",
"%s requires php %s or above to work. Sorry.": "%s vaatii php:n %s-version tai uudemman toimiakseen. Anteeksi.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vaatii konfiguraatio-osion [%s] olevan läsnä konfiguraatiotiedostossa.",
"Please wait %d seconds between each post.": [
"Odotathan %d sekuntin jokaisen lähetyksen välillä.",
"Odotathan %d sekuntia jokaisen lähetyksen välillä.",
"Odotathan %d sekuntia jokaisen lähetyksen välillä.",
"Odotathan %d sekuntia jokaisen lähetyksen välillä.",
"Odotathan %d sekuntia jokaisen lähetyksen välillä.",
"Odotathan %d sekuntia jokaisen lähetyksen välillä."
],
"Paste is limited to %s of encrypted data.": "Paste on rajoitettu kokoon %s salattua dataa.",
@@ -22,8 +24,8 @@
"Paste is not of burn-after-reading type.": "Paste ei ole polta-lukemisen-jälkeen-tyyppiä.",
"Wrong deletion token. Paste was not deleted.": "Virheellinen poistotunniste. Pastea ei poistettu.",
"Paste was properly deleted.": "Paste poistettiin kunnolla.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScriptiä tarvitaan jotta %s toimisi. Anteeksi haitasta.",
"%s requires a modern browser to work.": "%s tarvitsee modernia selainta toimiakseen.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "%s vaatii JavaScriptiä toimiakseen. Anteeksi haitasta.",
"%s requires a modern browser to work.": "%s vaatii modernin selaimen toimiakseen.",
"New": "Uusi",
"Send": "Lähetä",
"Clone": "Kloonaa",
@@ -33,47 +35,61 @@
"Open discussion": "Avaa keskustelu",
"Password (recommended)": "Salasana (suositeltu)",
"Discussion": "Keskustelu",
"Toggle navigation": "Navigointi päällä/pois",
"Toggle navigation": "Navigointi päälle/pois",
"%d seconds": [
"%d sekunti",
"%d sekuntia",
"%d sekuntia",
"%d sekuntia",
"%d sekuntia",
"%d sekuntia"
],
"%d minutes": [
"%d minuutti",
"%d minuuttia",
"%d minuuttia",
"%d minuuttia",
"%d minuuttia",
"%d minuuttia"
],
"%d hours": [
"%d tunti",
"%d tuntia",
"%d tuntia",
"%d tuntia",
"%d tuntia",
"%d tuntia"
],
"%d days": [
"%d päivä",
"%d päivää",
"%d päivää",
"%d päivää",
"%d päivää",
"%d päivää"
],
"%d weeks": [
"%d viikko",
"%d viikkoa",
"%d viikkoa",
"%d viikkoa",
"%d viikkoa",
"%d viikkoa"
],
"%d months": [
"%d kuukausi",
"%d kuukautta",
"%d kuukautta",
"%d kuukautta",
"%d kuukautta",
"%d kuukautta"
],
"%d years": [
"%d vuosi",
"%d vuotta",
"%d vuotta",
"%d vuotta",
"%d vuotta",
"%d vuotta"
],
"Never": "Ei koskaan",
@@ -82,27 +98,37 @@
"Tämä dokumentti vanhenee %d sekuntissa.",
"Tämä dokumentti vanhenee %d sekunnissa.",
"Tämä dokumentti vanhenee %d sekunnissa.",
"Tämä dokumentti vanhenee %d sekunnissa.",
"Tämä dokumentti vanhenee %d sekunnissa.",
"Tämä dokumentti vanhenee %d sekunnissa."
],
"This document will expire in %d minutes.": [
"Tämä dokumentti vanhenee %d minuutissa.",
"Tämä dokumentti vanhenee %d minuutissa.",
"Tämä dokumentti vanhenee %d minuutissa.",
"Tämä dokumentti vanhenee %d minuutissa.",
"Tämä dokumentti vanhenee %d minuutissa.",
"Tämä dokumentti vanhenee %d minuutissa."
],
"This document will expire in %d hours.": [
"Tämä dokumentti vanhenee %d tunnissa.",
"Tämä dokumentti vanhenee %d tunnissa.",
"Tämä dokumentti vanhenee %d tunnissa.",
"Tämä dokumentti vanhenee %d tunnissa.",
"Tämä dokumentti vanhenee %d tunnissa.",
"Tämä dokumentti vanhenee %d tunnissa."
],
"This document will expire in %d days.": [
"Tämä dokumentti vanhenee %d päivässä.",
"Tämä dokumentti vanhenee %d päivässä.",
"Tämä dokumentti vanhenee %d päivässä.",
"Tämä dokumentti vanhenee %d päivässä.",
"Tämä dokumentti vanhenee %d päivässä.",
"Tämä dokumentti vanhenee %d päivässä."
],
"This document will expire in %d months.": [
"Tämä dokumentti vanhenee %d kuukaudessa.",
"Tämä dokumentti vanhenee %d kuukaudessa.",
"Tämä dokumentti vanhenee %d kuukaudessa.",
"Tämä dokumentti vanhenee %d kuukaudessa.",
"Tämä dokumentti vanhenee %d kuukaudessa.",
@@ -154,7 +180,7 @@
"Invalid attachment.": "Virheellinen liite.",
"Options": "Asetukset",
"Shorten URL": "Lyhennä URL",
"Editor": "Muokkaaja",
"Editor": "Muokkain",
"Preview": "Esikatselu",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vaatii PATH:in loppuvan \"%s\"-merkkiin. Päivitäthän PATH:in index.php:ssäsi.",
"Decrypt": "Pura",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Käytä nykyistä aikavyöhykettä",
"Convert To UTC": "Muuta UTC:ksi",
"Close": "Sulje",
"Encrypted note on PrivateBin": "Salattu viesti PrivateBinissä",
"Encrypted note on %s": "Salattu viesti %sissä",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Käy tässä linkissä nähdäksesi viestin. URL:n antaminen kenellekään antaa heidänkin päästä katsomeen viestiä. ",
"URL shortener may expose your decrypt key in URL.": "URL-lyhentäjä voi paljastaa purkuavaimesi URL:ssä.",
"Save paste": "Tallenna paste",
"Your IP is not authorized to create pastes.": "IP:llesi ei ole annettu oikeutta luoda pasteja."
"Your IP is not authorized to create pastes.": "IP:llesi ei ole annettu oikeutta luoda pasteja.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Merci d'attendre %d seconde entre chaque publication.",
"Merci d'attendre %d secondes entre chaque publication.",
"Merci d'attendre %d secondes entre chaque publication.",
"Merci d'attendre %d secondes entre chaque publication.",
"Merci d'attendre %d secondes entre chaque publication.",
"Merci d'attendre %d secondes entre chaque publication."
],
"Paste is limited to %s of encrypted data.": "Le paste est limité à %s de données chiffrées.",
@@ -37,72 +39,96 @@
"%d seconds": [
"%d seconde",
"%d secondes",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d secondes",
"%d secondes",
"%d secondes",
"%d secondes"
],
"%d minutes": [
"%d minute",
"%d minutes",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes",
"%d minutes",
"%d minutes",
"%d minutes"
],
"%d hours": [
"%d heure",
"%d heures",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d heures",
"%d heures",
"%d heures",
"%d heures"
],
"%d days": [
"%d jour",
"%d jours",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d jours",
"%d jours",
"%d jours",
"%d jours"
],
"%d weeks": [
"%d semaine",
"%d semaines",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d semaines",
"%d semaines",
"%d semaines",
"%d semaines"
],
"%d months": [
"%d mois",
"%d mois",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d mois",
"%d mois",
"%d mois",
"%d mois"
],
"%d years": [
"%d an",
"%d ans",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d ans",
"%d ans",
"%d ans",
"%d ans"
],
"Never": "Jamais",
"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.",
"This document will expire in %d seconds.": [
"Ce document expirera dans %d seconde.",
"Ce document expirera dans %d secondes.",
"This document will expire in %d seconds (2nd plural)",
"This document will expire in %d seconds (3rd plural)"
"Ce document expirera dans %d secondes.",
"Ce document expirera dans %d secondes.",
"Ce document expirera dans %d secondes.",
"Ce document expirera dans %d secondes."
],
"This document will expire in %d minutes.": [
"Ce document expirera dans %d minute.",
"Ce document expirera dans %d minutes.",
"Ce document expirera dans %d minutes.",
"Ce document expirera dans %d minutes.",
"Ce document expirera dans %d minutes.",
"Ce document expirera dans %d minutes."
],
"This document will expire in %d hours.": [
"Ce document expirera dans %d heure.",
"Ce document expirera dans %d heures.",
"Ce document expirera dans %d heures.",
"Ce document expirera dans %d heures.",
"Ce document expirera dans %d heures.",
"Ce document expirera dans %d heures."
],
"This document will expire in %d days.": [
"Ce document expirera dans %d jour.",
"Ce document expirera dans %d jours.",
"Ce document expirera dans %d jours.",
"Ce document expirera dans %d jours.",
"Ce document expirera dans %d jours.",
"Ce document expirera dans %d jours."
],
"This document will expire in %d months.": [
"Ce document expirera dans %d mois.",
"Ce document expirera dans %d mois.",
"Ce document expirera dans %d mois.",
"Ce document expirera dans %d mois.",
"Ce document expirera dans %d mois.",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Conserver l'actuel",
"Convert To UTC": "Convertir en UTC",
"Close": "Fermer",
"Encrypted note on PrivateBin": "Message chiffré sur PrivateBin",
"Encrypted note on %s": "Message chiffré sur %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "Raccourcir l'URL peut exposer votre clé de déchiffrement dans l'URL.",
"Save paste": "Sauver le paste",
"Your IP is not authorized to create pastes.": "Votre adresse IP n'est pas autorisée à créer des pastes."
"Your IP is not authorized to create pastes.": "Votre adresse IP n'est pas autorisée à créer des pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"נא להמתין שנייה אחת בין פרסום לפרסום.",
"נא להמתין %d שניות בין פרסום לפרסום.",
"נא להמתין %d שניות בין פרסום לפרסום.",
"נא להמתין %d שניות בין פרסום לפרסום.",
"נא להמתין %d שניות בין פרסום לפרסום.",
"נא להמתין %d שניות בין פרסום לפרסום."
],
"Paste is limited to %s of encrypted data.": "ההדבקה מוגבלת ל־%s של נתונים מוצפנים.",
@@ -37,43 +39,57 @@
"%d seconds": [
"שנייה אחת",
"%d שניות",
"%d שניות (צורת ריבוי 2)",
"%d שניות",
"%d שניות",
"%d שניות",
"%d שניות"
],
"%d minutes": [
"דקה אחת",
"%d דקות",
"%d דקות",
"%d דקות",
"%d דקות",
"%d דקות"
],
"%d hours": [
"שעה אחת",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"יום אחד",
"%d ימים",
"%d ימים",
"%d ימים",
"%d ימים",
"%d ימים"
],
"%d weeks": [
"שבוע אחד",
"%d שבועות",
"%d שבועות",
"%d שבועות",
"%d שבועות",
"%d שבועות"
],
"%d months": [
"חודש אחד",
"%d חודשים",
"%d חודשים",
"%d חודשים",
"%d חודשים",
"%d חודשים"
],
"%d years": [
"שנה אחת",
"%d שנים",
"%d שנים",
"%d שנים",
"%d שנים",
"%d שנים"
],
"Never": "לעולם לא",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th plural)"
],
"Please enter the password for this paste:": "נא למלא את הססמה להדבקה הזו:",
"Could not decrypt data (Wrong key?)": "לא ניתן לפענח את הנתונים (מפתח שגוי?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "להשתמש באזור הזמן הנוכחי",
"Convert To UTC": "המרה ל־UTC",
"Close": "סגירה",
"Encrypted note on PrivateBin": "הערה מוצפנת ב־PrivateBin",
"Encrypted note on %s": "%sהערה מוצפנת ב־",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "נא לבקר בקישור כדי לצפות בהערה. מסירת הקישור לאנשים כלשהם תאפשר גם להם לגשת להערה.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -8,6 +8,8 @@
"%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.",
"%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.",
"Please wait %d seconds between each post.": [
"Kérlek várj %d másodpercet két beküldés között.",
"Kérlek várj %d másodpercet két beküldés között.",
"Kérlek várj %d másodpercet két beküldés között.",
"Kérlek várj %d másodpercet két beküldés között.",
"Kérlek várj %d másodpercet két beküldés között.",
@@ -37,72 +39,96 @@
"%d seconds": [
"%d másodperc",
"%d másodperc",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d másodperc",
"%d másodperc",
"%d másodperc",
"%d másodperc"
],
"%d minutes": [
"%d perc",
"%d perc",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d perc",
"%d perc",
"%d perc",
"%d perc"
],
"%d hours": [
"%d óra",
"%d óra",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d óra",
"%d óra",
"%d óra",
"%d óra"
],
"%d days": [
"%d nap",
"%d nap",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d nap",
"%d nap",
"%d nap",
"%d nap"
],
"%d weeks": [
"%d hét",
"%d hét",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d hét",
"%d hét",
"%d hét",
"%d hét"
],
"%d months": [
"%d hónap",
"%d hónap",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d hónap",
"%d hónap",
"%d hónap",
"%d hónap"
],
"%d years": [
"%d év",
"%d év",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d év",
"%d év",
"%d év",
"%d év"
],
"Never": "Soha",
"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! :)",
"This document will expire in %d seconds.": [
"Ez a bejegyzés %d másodperc múlva megsemmisül.",
"Ez a bejegyzés %d másodperc múlva megsemmisül.",
"Ez a bejegyzés %d másodperc múlva megsemmisül.",
"Ez a bejegyzés %d másodperc múlva megsemmisül.",
"Ez a bejegyzés %d másodperc múlva megsemmisül.",
"Ez a bejegyzés %d másodperc múlva megsemmisül."
],
"This document will expire in %d minutes.": [
"Ez a bejegyzés %d perc múlva megsemmisül.",
"Ez a bejegyzés %d perc múlva megsemmisül.",
"Ez a bejegyzés %d perc múlva megsemmisül.",
"Ez a bejegyzés %d perc múlva megsemmisül.",
"Ez a bejegyzés %d perc múlva megsemmisül.",
"Ez a bejegyzés %d perc múlva megsemmisül."
],
"This document will expire in %d hours.": [
"Ez a bejegyzés %d óra múlva megsemmisül.",
"Ez a bejegyzés %d óra múlva megsemmisül.",
"Ez a bejegyzés %d óra múlva megsemmisül.",
"Ez a bejegyzés %d óra múlva megsemmisül.",
"Ez a bejegyzés %d óra múlva megsemmisül.",
"Ez a bejegyzés %d óra múlva megsemmisül."
],
"This document will expire in %d days.": [
"Ez a bejegyzés %d nap múlva megsemmisül.",
"Ez a bejegyzés %d nap múlva megsemmisül.",
"Ez a bejegyzés %d nap múlva megsemmisül.",
"Ez a bejegyzés %d nap múlva megsemmisül.",
"Ez a bejegyzés %d nap múlva megsemmisül.",
"Ez a bejegyzés %d nap múlva megsemmisül."
],
"This document will expire in %d months.": [
"Ez a bejegyzés %d hónap múlva megsemmisül.",
"Ez a bejegyzés %d hónap múlva megsemmisül.",
"Ez a bejegyzés %d hónap múlva megsemmisül.",
"Ez a bejegyzés %d hónap múlva megsemmisül.",
"Ez a bejegyzés %d hónap múlva megsemmisül.",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Az aktuális időzóna használata",
"Convert To UTC": "Átalakítás UTC időzónára",
"Close": "Bezárás",
"Encrypted note on PrivateBin": "Titkosított jegyzet a PrivateBinen",
"Encrypted note on %s": "Titkosított jegyzet a %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Látogasd meg ezt a hivatkozást a bejegyzés megtekintéséhez. Ha mások számára is megadod ezt a linket, azzal hozzáférnek ők is.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -8,6 +8,8 @@
"%s requires php %s or above to work. Sorry.": "%s memerlukan php %s atau versi diatasnya untuk dapat dijalankan. Maaf.",
"%s requires configuration section [%s] to be present in configuration file.": "%s membutuhkan bagian konfigurasi [%s] untuk ada di file konfigurasi.",
"Please wait %d seconds between each post.": [
"Silahkan menunggu %d detik antara masing-masing postingan.",
"Silahkan menunggu %d detik antara masing-masing postingan.",
"Silahkan menunggu %d detik antara masing-masing postingan.",
"Silahkan menunggu %d detik antara masing-masing postingan.",
"Silahkan menunggu %d detik antara masing-masing postingan.",
@@ -35,42 +37,56 @@
"Discussion": "Diskusi",
"Toggle navigation": "Alihkan navigasi",
"%d seconds": [
"%d detik",
"%d detik",
"%d detik",
"%d detik",
"%d detik",
"%d detik"
],
"%d minutes": [
"%d menit",
"%d menit",
"%d menit",
"%d menit",
"%d menit",
"%d menit"
],
"%d hours": [
"%d jam",
"%d jam",
"%d jam",
"%d jam",
"%d jam",
"%d jam"
],
"%d days": [
"%d hari",
"%d hari",
"%d hari",
"%d hari",
"%d hari",
"%d hari"
],
"%d weeks": [
"%d minggu",
"%d minggu",
"%d minggu",
"%d minggu",
"%d minggu",
"%d minggu"
],
"%d months": [
"%d bulan",
"%d bulan",
"%d bulan",
"%d bulan",
"%d bulan",
"%d bulan"
],
"%d years": [
"%d tahun",
"%d tahun",
"%d tahun",
"%d tahun",
"%d tahun",
@@ -79,30 +95,40 @@
"Never": "Jangan pernah",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Catatan: Ini adalah layanan percobaan: Data mungkin bisa terhapus kapanpun juga. Anak-anak kucing akan mati jika Anda mengekploitasi layanan ini.",
"This document will expire in %d seconds.": [
"Dokumen ini kadaluarsa dalam %d detik.",
"Dokumen ini kadaluarsa dalam %d detik.",
"Dokumen ini kadaluarsa dalam %d detik.",
"Dokumen ini kadaluarsa dalam %d detik.",
"Dokumen ini kadaluarsa dalam %d detik.",
"Dokumen ini kadaluarsa dalam %d detik."
],
"This document will expire in %d minutes.": [
"Dokumen ini akan kadaluarsa dalam %d menit.",
"Dokumen ini akan kadaluarsa dalam %d menit.",
"Dokumen ini akan kadaluarsa dalam %d menit.",
"Dokumen ini akan kadaluarsa dalam %d menit.",
"Dokumen ini akan kadaluarsa dalam %d menit.",
"Dokumen ini akan kadaluarsa dalam %d menit."
],
"This document will expire in %d hours.": [
"Dokumen ini akan kadaluarsa dalam %d jam.",
"Dokumen ini akan kadaluarsa dalam %d jam.",
"Dokumen ini akan kadaluarsa dalam %d jam.",
"Dokumen ini akan kadaluarsa dalam %d jam.",
"Dokumen ini akan kadaluarsa dalam %d jam.",
"Dokumen ini akan kadaluarsa dalam %d jam."
],
"This document will expire in %d days.": [
"Dokumen ini akan kadaluarsa dalam %d hari.",
"Dokumen ini akan kadaluarsa dalam %d hari.",
"Dokumen ini akan kadaluarsa dalam %d hari.",
"Dokumen ini akan kadaluarsa dalam %d hari.",
"Dokumen ini akan kadaluarsa dalam %d hari.",
"Dokumen ini akan kadaluarsa dalam %d hari."
],
"This document will expire in %d months.": [
"Dokumen ini akan kadaluarsa dalam %d bulan.",
"Dokumen ini akan kadaluarsa dalam %d bulan.",
"Dokumen ini akan kadaluarsa dalam %d bulan.",
"Dokumen ini akan kadaluarsa dalam %d bulan.",
"Dokumen ini akan kadaluarsa dalam %d bulan.",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Gunakan Zonawaktu Saat Ini",
"Convert To UTC": "Konversi Ke UTC",
"Close": "Tutup",
"Encrypted note on PrivateBin": "Catatan ter-ekrip di PrivateBin",
"Encrypted note on %s": "Catatan ter-ekrip di %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kunjungi tautan ini untuk melihat catatan. Memberikan alamat URL pada siapapun juga, akan mengizinkan mereka untuk mengakses catatan, so pasti gitu loh Kaka.",
"URL shortener may expose your decrypt key in URL.": "Pemendek URL mungkin akan menampakkan kunci dekrip Anda dalam URL.",
"Save paste": "Simpan paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Attendi per favore un secondo prima di ciascun invio.",
"Attendi per favore %d secondi prima di ciascun invio.",
"Attendi per favore %d secondi prima di ciascun invio.",
"Attendi per favore %d secondi prima di ciascun invio.",
"Attendi per favore %d secondi prima di ciascun invio.",
"Attendi per favore %d secondi prima di ciascun invio."
],
"Paste is limited to %s of encrypted data.": "La dimensione del messaggio è limitata a %s di dati cifrati.",
@@ -37,44 +39,58 @@
"%d seconds": [
"%d secondo",
"%d secondi",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d secondi",
"%d secondi",
"%d secondi",
"%d secondi"
],
"%d minutes": [
"%d minuto",
"%d minuti",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minuti",
"%d minuti",
"%d minuti",
"%d minuti"
],
"%d hours": [
"%d ora",
"%d ore",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d ore",
"%d ore",
"%d ore",
"%d ore"
],
"%d days": [
"%d giorno",
"%d giorni",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d giorni",
"%d giorni",
"%d giorni",
"%d giorni"
],
"%d weeks": [
"%d settimana",
"%d settimane",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d settimane",
"%d settimane",
"%d settimane",
"%d settimane"
],
"%d months": [
"%d mese",
"%d mesi",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d mesi",
"%d mesi",
"%d mesi",
"%d mesi"
],
"%d years": [
"%d anno",
"%d anni",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d anni",
"%d anni",
"%d anni",
"%d anni"
],
"Never": "Mai",
"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.",
@@ -82,30 +98,40 @@
"Questo documento scadrà tra un secondo.",
"Questo documento scadrà in %d secondi.",
"Questo documento scadrà in %d secondi.",
"Questo documento scadrà in %d secondi.",
"Questo documento scadrà in %d secondi.",
"Questo documento scadrà in %d secondi."
],
"This document will expire in %d minutes.": [
"Questo documento scadrà tra un minuto.",
"Questo documento scadrà in %d minuti.",
"Questo documento scadrà in %d minuti.",
"Questo documento scadrà in %d minuti.",
"Questo documento scadrà in %d minuti.",
"Questo documento scadrà in %d minuti."
],
"This document will expire in %d hours.": [
"Questo documento scadrà tra un'ora.",
"Questo documento scadrà in %d ore.",
"Questo documento scadrà in %d ore.",
"Questo documento scadrà in %d ore.",
"Questo documento scadrà in %d ore.",
"Questo documento scadrà in %d ore."
],
"This document will expire in %d days.": [
"Questo documento scadrà tra un giorno.",
"Questo documento scadrà in %d giorni.",
"Questo documento scadrà in %d giorni.",
"Questo documento scadrà in %d giorni.",
"Questo documento scadrà in %d giorni.",
"Questo documento scadrà in %d giorni."
],
"This document will expire in %d months.": [
"Questo documento scadrà tra un mese.",
"Questo documento scadrà in %d mesi.",
"Questo documento scadrà in %d mesi.",
"Questo documento scadrà in %d mesi.",
"Questo documento scadrà in %d mesi.",
"Questo documento scadrà in %d mesi."
],
"Please enter the password for this paste:": "Inserisci la password per questo messaggio:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Usa Fuso Orario Corrente",
"Convert To UTC": "Converti a UTC",
"Close": "Chiudi",
"Encrypted note on PrivateBin": "Nota crittografata su PrivateBin",
"Encrypted note on %s": "Nota crittografata su %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visita questo collegamento per vedere la nota. Dare l'URL a chiunque consente anche a loro di accedere alla nota.",
"URL shortener may expose your decrypt key in URL.": "URL shortener può esporre la tua chiave decrittografata nell'URL.",
"Save paste": "Salva il messagio",
"Your IP is not authorized to create pastes.": "Il tuo IP non è autorizzato a creare dei messaggi."
"Your IP is not authorized to create pastes.": "Il tuo IP non è autorizzato a creare dei messaggi.",
"Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.",
"Error parsing YOURLS response.": "Errore nell'analizzare la risposta YOURLS."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -24,8 +26,8 @@
"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",
"New": "新しい",
"Send": "送る",
"Clone": "Clone",
"Raw text": "Raw text",
"Expires": "Expires",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d ",
"%d ",
"%d ",
"%d 分",
"%d 分",
"%d 分"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d 時間",
"%d 時間",
"%d 時間",
"%d 時間",
"%d 時間",
"%d 時間"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d ",
"%d ",
"%d ",
"%d 日",
"%d 日",
"%d 日"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": ".i le selru'e cu na drani",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "galfi lo cabni la utc",
"Close": "ganlo",
"Encrypted note on PrivateBin": ".i lo lo notci ku mifra cu zvati sivlolnitvanku'a",
"Encrypted note on %s": ".i lo lo notci ku mifra cu zvati %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "rejgau fukpi",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -9,9 +9,11 @@
"%s requires configuration section [%s] to be present in configuration file.": "%s reikalauja, kad konfigūracijos faile būtų [%s] konfigūracijos sekcija.",
"Please wait %d seconds between each post.": [
"Tarp kiekvieno įrašo palaukite %d sekundę.",
"Tarp kiekvieno įrašo palaukite %d sekundes.",
"Tarp kiekvieno įrašo palaukite %d sekundės.",
"Tarp kiekvieno įrašo palaukite %d sekundžių.",
"Tarp kiekvieno įrašo palaukite %d sekundę."
"Tarp kiekvieno įrašo palaukite %d sekundžių.",
"Tarp kiekvieno įrašo palaukite %d sekundžių.",
"Tarp kiekvieno įrašo palaukite %d sekundžių."
],
"Paste is limited to %s of encrypted data.": "Įdėjimas yra apribotas iki %s šifruotų duomenų.",
"Invalid data.": "Neteisingi duomenys.",
@@ -35,42 +37,56 @@
"Discussion": "Diskusija",
"Toggle navigation": "Perjungti naršymą",
"%d seconds": [
"%d sekundę",
"%d sekundės",
"%d sekundžių",
"%d sekundžių",
"%d sekundės"
"%d sekundžių",
"%d sekundžių"
],
"%d minutes": [
"%d minutės",
"%d minučių",
"%d minučių",
"%d minutės"
"%d minučių",
"%d minučių",
"%d minučių"
],
"%d hours": [
"%d valandos",
"%d valandų",
"%d valandų",
"%d valandos"
"%d valandų",
"%d valandų",
"%d valandų"
],
"%d days": [
"%d dienos",
"%d dienų",
"%d dienų",
"%d dienos"
"%d dienų",
"%d dienų",
"%d dienų"
],
"%d weeks": [
"%d savaitės",
"%d savaičių",
"%d savaičių",
"%d savaitės"
"%d savaičių",
"%d savaičių",
"%d savaičių"
],
"%d months": [
"%d mėnesio",
"%d mėnesių",
"%d mėnesių",
"%d mėnesio"
"%d mėnesių",
"%d mėnesių",
"%d mėnesių"
],
"%d years": [
"%d metų",
"%d metų",
"%d metų",
"%d metų",
"%d metų",
@@ -82,31 +98,41 @@
"Šis dokumentas nustos galioti po %d sekundės.",
"Šis dokumentas nustos galioti po %d sekundžių.",
"Šis dokumentas nustos galioti po %d sekundžių.",
"Šis dokumentas nustos galioti po %d sekundės."
"Šis dokumentas nustos galioti po %d sekundžių.",
"Šis dokumentas nustos galioti po %d sekundžių.",
"Šis dokumentas nustos galioti po %d sekundžių."
],
"This document will expire in %d minutes.": [
"Šis dokumentas nustos galioti po %d minutės.",
"Šis dokumentas nustos galioti po %d minučių.",
"Šis dokumentas nustos galioti po %d minučių.",
"Šis dokumentas nustos galioti po %d minutės."
"Šis dokumentas nustos galioti po %d minučių.",
"Šis dokumentas nustos galioti po %d minučių.",
"Šis dokumentas nustos galioti po %d minučių."
],
"This document will expire in %d hours.": [
"Šis dokumentas nustos galioti po %d valandos.",
"Šis dokumentas nustos galioti po %d valandų.",
"Šis dokumentas nustos galioti po %d valandų.",
"Šis dokumentas nustos galioti po %d valandos."
"Šis dokumentas nustos galioti po %d valandų.",
"Šis dokumentas nustos galioti po %d valandų.",
"Šis dokumentas nustos galioti po %d valandų."
],
"This document will expire in %d days.": [
"Šis dokumentas nustos galioti po %d dienos.",
"Šis dokumentas nustos galioti po %d dienų.",
"Šis dokumentas nustos galioti po %d dienų.",
"Šis dokumentas nustos galioti po %d dienos."
"Šis dokumentas nustos galioti po %d dienų.",
"Šis dokumentas nustos galioti po %d dienų.",
"Šis dokumentas nustos galioti po %d dienų."
],
"This document will expire in %d months.": [
"Šis dokumentas nustos galioti po %d mėnesio.",
"Šis dokumentas nustos galioti po %d mėnesių.",
"Šis dokumentas nustos galioti po %d mėnesių.",
"Šis dokumentas nustos galioti po %d mėnesio."
"Šis dokumentas nustos galioti po %d mėnesių.",
"Šis dokumentas nustos galioti po %d mėnesių.",
"Šis dokumentas nustos galioti po %d mėnesių."
],
"Please enter the password for this paste:": "Įveskite šio įdėjimo slaptažodį:",
"Could not decrypt data (Wrong key?)": "Nepavyko iššifruoti duomenų (Neteisingas raktas?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Naudoti esamą laiko juostą",
"Convert To UTC": "Konvertuoti į UTC",
"Close": "Užverti",
"Encrypted note on PrivateBin": "Šifruoti užrašai ties PrivateBin",
"Encrypted note on %s": "Šifruoti užrašai ties %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Norėdami matyti užrašus, aplankykite šį tinklalapį. Pasidalinus šiuo URL adresu su kitais žmonėmis, jiems taip pat bus leidžiama prieiga prie šių užrašų.",
"URL shortener may expose your decrypt key in URL.": "URL trumpinimo įrankis gali atskleisti URL adrese jūsų iššifravimo raktą.",
"Save paste": "Įrašyti įdėjimą",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.",
"Trying to shorten a URL that isn't pointing at our instance.": "Bandoma sutrumpinti URL adresą, kuris nenurodo į mūsų egzempliorių.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.",
"Error parsing YOURLS response.": "Klaida nagrinėjant YOURLS atsaką."
}

View File

@@ -1,32 +1,34 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd %s in de browser %s met behulp van 256 bits AES.",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de paste data zelf. Gegevens worden gecodeerd/gedecodeerd %s in de browser %s met behulp van 256-bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.",
"Because ignorance is bliss": "Onwetendheid is een zegen",
"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.": "Paste bestaat niet, is verlopen of verwijderd.",
"%s requires php %s or above to work. Sorry.": "%s vereist PHP %s of hoger om te kunnen werken. Sorry",
"%s requires configuration section [%s] to be present in configuration file.": "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand",
"Please wait %d seconds between each post.": [
"Alstublieft %d second wachten tussen elk bericht.",
"Alstublieft %d seconden wachten tussen elk bericht.",
"Alstublieft %d seconden wachten tussen elk bericht.",
"Alstublieft %d seconden wachten tussen elk bericht.",
"Alstublieft %d seconden wachten tussen elk bericht.",
"Alstublieft %d seconden wachten tussen elk bericht."
],
"Paste is limited to %s of encrypted data.": "Geplakte tekst is beperkt tot %s aan versleutelde gegevens",
"Invalid data.": "Ongeldige gegevens",
"You are unlucky. Try again.": "Helaas. Probeer het nog eens",
"Error saving comment. Sorry.": "Fout bij het opslaan van het commentaar. Sorry",
"Error saving paste. Sorry.": "Fout bij het opslaan van de geplakte tekst. Sorry.",
"Paste is limited to %s of encrypted data.": "Paste is beperkt tot %s aan versleutelde gegevens.",
"Invalid data.": "Ongeldige gegevens.",
"You are unlucky. Try again.": "Helaas. Probeer het nog eens.",
"Error saving comment. Sorry.": "Fout bij het opslaan van het commentaar. Sorry.",
"Error saving paste. Sorry.": "Fout bij het opslaan van de paste. Sorry.",
"Invalid paste ID.": "Ongeldige ID.",
"Paste is not of burn-after-reading type.": "Geplakte tekst is geen 'vernietig na lezen' type",
"Wrong deletion token. Paste was not deleted.": "Foutieve verwijdercode. Geplakte tekst is niet verwijderd.",
"Paste was properly deleted.": "Geplakte tekst is correct verwijderd.",
"Paste is not of burn-after-reading type.": "Paste is geen 'vernietig na lezen' type.",
"Wrong deletion token. Paste was not deleted.": "Foutieve verwijdercode. Paste is niet verwijderd.",
"Paste was properly deleted.": "Paste is correct verwijderd.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript vereist om %s te laten werken. Sorry voor het ongemak.",
"%s requires a modern browser to work.": "%s vereist een moderne browser om te kunnen werken ",
"%s requires a modern browser to work.": "%s vereist een moderne browser om te kunnen werken.",
"New": "Nieuw",
"Send": "Verzenden",
"Clone": "Clonen",
"Clone": "Klonen",
"Raw text": "Onbewerkte tekst",
"Expires": "Verloopt",
"Burn after reading": "Vernietig na lezen",
@@ -35,51 +37,67 @@
"Discussion": "Discussie",
"Toggle navigation": "Navigatie openen/sluiten",
"%d seconds": [
"%d second",
"%d seconde",
"%d seconden",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconden",
"%d seconden",
"%d seconden",
"%d seconden"
],
"%d minutes": [
"%d minuut",
"%d minuten",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minuten",
"%d minuten",
"%d minuten",
"%d minuten"
],
"%d hours": [
"%d uur",
"%d uren",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d uren",
"%d uren",
"%d uren",
"%d uren"
],
"%d days": [
"%d dag",
"%d dagen",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d dagen",
"%d dagen",
"%d dagen",
"%d dagen"
],
"%d weeks": [
"%d week",
"%d weken",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weken",
"%d weken",
"%d weken",
"%d weken"
],
"%d months": [
"%d maand",
"%d maanden",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d maanden",
"%d maanden",
"%d maanden",
"%d maanden"
],
"%d years": [
"%d jaar",
"%d jaaren",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d jaren",
"%d jaren",
"%d jaren",
"%d jaren",
"%d jaren"
],
"Never": "Nooit",
"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.",
"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. Katten zullen doodgaan als je misbruikt maakt van deze service.",
"This document will expire in %d seconds.": [
"Dit document verloopt over %d second.",
"Dit document verloopt over %d seconde.",
"Dit document verloopt over %d seconden.",
"Dit document verloopt over %d seconden.",
"Dit document verloopt over %d seconden.",
"Dit document verloopt over %d seconden.",
"Dit document verloopt over %d seconden."
@@ -88,34 +106,42 @@
"Dit document verloopt over %d minuut.",
"Dit document verloopt over %d minuten.",
"Dit document verloopt over %d minuten.",
"Dit document verloopt over %d minuten.",
"Dit document verloopt over %d minuten.",
"Dit document verloopt over %d minuten."
],
"This document will expire in %d hours.": [
"Dit document verloopt over %d uur.",
"Dit document verloopt over %d uren.",
"Dit document verloopt over %d uren.",
"Dit document verloopt over %d uren.",
"Dit document verloopt over %d uren.",
"Dit document verloopt over %d uren."
],
"This document will expire in %d days.": [
"Dit document verloopt over %d dag.",
"Dit document verloopt over %d dagen.",
"Dit document verloopt over %d dagen.",
"Dit document verloopt over %d dagen.",
"Dit document verloopt over %d dagen.",
"Dit document verloopt over %d dagen."
],
"This document will expire in %d months.": [
"Dit document verloopt over %d maand.",
"Dit document verloopt over %d maanden.",
"Dit document verloopt over %d maanden.",
"Dit document verloopt over %d maanden.",
"Dit document verloopt over %d maanden.",
"Dit document verloopt over %d maanden."
],
"Please enter the password for this paste:": "Voer het wachtwoord in voor deze geplakte tekst:",
"Please enter the password for this paste:": "Voer het wachtwoord in voor deze paste:",
"Could not decrypt data (Wrong key?)": "Kon de gegevens niet decoderen (verkeerde sleutel?)",
"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.",
"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.",
"Could not delete the paste, it was not stored in burn after reading mode.": "Verwijderen van de paste niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "ALLEEN VOOR JOUW OGEN BESTEMD. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.",
"Could not decrypt comment; Wrong key?": "Kon het commentaar niet decoderen; Verkeerde sleutel?",
"Reply": "Beantwoorden",
"Anonymous": "Anoniem",
"Avatar generated from IP address": "Anonieme avatar (van het IP adres)",
"Avatar generated from IP address": "Anonieme avatar (van het IP-adres)",
"Add comment": "Commentaar toevoegen",
"Optional nickname…": "Optionele bijnaam…",
"Post comment": "Plaats een commentaar",
@@ -125,11 +151,11 @@
"unknown status": "Onbekende status",
"server error or not responding": "Serverfout of server reageert niet",
"Could not post comment: %s": "Kon het commentaar niet plaatsen: %s",
"Sending paste…": "Geplakte tekst verzenden…",
"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>",
"Sending paste…": "Paste verzenden…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Je paste 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?)",
"Could not create paste: %s": "Kon de paste 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 paste niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
@@ -145,46 +171,49 @@
"Markdown": "Markdown",
"Download attachment": "Bijlage downloaden",
"Cloned: '%s'": "Gekloond: '%s'",
"The cloned file '%s' was attached to this paste.": "Het gekloonde bestand '%s' is bijgevoegd aan de geplakte tekst.",
"The cloned file '%s' was attached to this paste.": "Het gekloonde bestand '%s' is bijgevoegd aan de paste.",
"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",
"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",
"alternatively drag & drop a file or paste an image from the clipboard": "Je 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.",
"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",
"Invalid attachment.": "Ongeldige bijlage",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Je browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser.",
"Invalid attachment.": "Ongeldige bijlage.",
"Options": "Opties",
"Shorten URL": "URL verkorten",
"Editor": "Editor",
"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.": "%s vereist dat PATH eindigt in een '%s'. a.u.b. PATH updaten in je index.php.",
"Decrypt": "Decoderen",
"Enter password": "Voer het wachtwoord in",
"Loading…": "Laden…",
"Decrypting paste…": "Geplakte tekst decoderen…",
"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>.",
"+++ no paste text +++": "+++ geen geplakte tekst +++",
"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.",
"Decrypting paste…": "Paste decoderen…",
"Preparing new paste…": "Nieuwe paste 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 dan eens naar <a href=\"%s\"> veelgestelde vragen voor informatie over het oplossen van problemen</a>.",
"+++ no paste text +++": "+++ geen paste tekst +++",
"Could not get paste data: %s": "Kon geen paste data verkrijgen: %s",
"QR code": "QR-code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Deze website gebruikt een onveilige HTTP-verbinding! Gelieve deze enkel te gebruiken om te testen.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Voor meer informatie <a href=\"%s\">zie dit FAQ-artikel</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Je browser kan een HTTPS-verbinding nodig hebben om de WebCrypto API te ondersteunen. Probeer <a href=\"%s\">het met HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Je browser ondersteunt WebAssembly niet, wat wordt gebruikt voor zlib compressie. Je kunt niet-gecomprimeerde documenten maken, maar geen gecomprimeerde documenten lezen.",
"waiting on user to provide a password": "wachtend op gebruiker om een wachtwoord te geven",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Kon de gegevens niet decoderen. Heb je een verkeerd wachtwoord ingevoerd? Probeer het opnieuw met de knop bovenaan.",
"Retry": "Opnieuw proberen",
"Showing raw text…": "Platte tekst tonen…",
"Notice:": "Let op:",
"This link will expire after %s.": "Deze link vervalt na %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Deze link kan slechts eenmaal worden geopend, gebruik niet de terug- of verversknop in je 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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Recipient may become aware of your timezone, convert time to UTC?": "Ontvanger kan zich bewust worden van je tijdzone, tijd omzetten naar UTC?",
"Use Current Timezone": "Gebruik huidige tijdzone",
"Convert To UTC": "Omzetten naar UTC",
"Close": "Sluiten",
"Encrypted note on %s": "Versleutelde notitie op %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Bezoek deze link om de notitie te bekijken. Als je de URL aan iemand geeft, kan die de notitie ook bekijken.",
"URL shortener may expose your decrypt key in URL.": "URL-verkorter kan je ontcijferingssleutel in URL blootleggen.",
"Save paste": "Notitie opslaan",
"Your IP is not authorized to create pastes.": "Je IP-adres is niet gemachtigd om pastes te maken.",
"Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".",
"Error parsing YOURLS response.": "Foutmelding bij parsen van YOURLS respons."
}

View File

@@ -11,6 +11,8 @@
"Vennligst vent %d sekund mellom hvert innlegg.",
"Vennligst vent %d sekunder mellom hvert innlegg.",
"Vennligst vent %d sekunder mellom hvert innlegg.",
"Vennligst vent %d sekunder mellom hvert innlegg.",
"Vennligst vent %d sekunder mellom hvert innlegg.",
"Vennligst vent %d sekunder mellom hvert innlegg."
],
"Paste is limited to %s of encrypted data.": "Innlegg er begrenset til %s av kryptert data.",
@@ -38,39 +40,53 @@
"%d sekund",
"%d sekunder",
"%d sekunder",
"%d sekunder",
"%d sekunder",
"%d sekunder"
],
"%d minutes": [
"%d minutt",
"%d minutter",
"%d minutter",
"%d minutter",
"%d minutter",
"%d minutter"
],
"%d hours": [
"%d time",
"%d timer",
"%d timer",
"%d timer",
"%d timer",
"%d timer"
],
"%d days": [
"%d dag",
"%d dager",
"%d dager",
"%d dager",
"%d dager",
"%d dager"
],
"%d weeks": [
"%d uke",
"%d uker",
"%d uker",
"%d uker",
"%d uker",
"%d uker"
],
"%d months": [
"%d måned",
"%d måneder",
"%d måneder",
"%d måneder",
"%d måneder",
"%d måneder"
],
"%d years": [
"%d år",
"%d år",
"%d år",
"%d år",
"%d år",
@@ -82,30 +98,40 @@
"Dette dokumentet vil utløpe om %d sekund.",
"Dette dokumentet vil utløpe om %d sekunder.",
"Dette dokumentet vil utløpe om %d sekunder.",
"Dette dokumentet vil utløpe om %d sekunder.",
"Dette dokumentet vil utløpe om %d sekunder.",
"Dette dokumentet vil utløpe om %d sekunder."
],
"This document will expire in %d minutes.": [
"Dette dokumentet vil utløpe om %d minutt.",
"Dette dokumentet vil utløpe om %d minutter.",
"Dette dokumentet vil utløpe om %d minutter.",
"Dette dokumentet vil utløpe om %d minutter.",
"Dette dokumentet vil utløpe om %d minutter.",
"Dette dokumentet vil utløpe om %d minutter."
],
"This document will expire in %d hours.": [
"Dette dokumentet vil utløpe om %d time.",
"Dette dokumentet vil utløpe om %d timer.",
"Dette dokumentet vil utløpe om %d timer.",
"Dette dokumentet vil utløpe om %d timer.",
"Dette dokumentet vil utløpe om %d timer.",
"Dette dokumentet vil utløpe om %d timer."
],
"This document will expire in %d days.": [
"Dette dokumentet vil utløpe om %d dag.",
"Dette dokumentet vil utløpe om %d dager.",
"Dette dokumentet vil utløpe om %d dager.",
"Dette dokumentet vil utløpe om %d dager.",
"Dette dokumentet vil utløpe om %d dager.",
"Dette dokumentet vil utløpe om %d dager."
],
"This document will expire in %d months.": [
"Dette dokumentet vil utløpe om %d måned.",
"Dette dokumentet vil utløpe om %d måneder.",
"Dette dokumentet vil utløpe om %d måneder.",
"Dette dokumentet vil utløpe om %d måneder.",
"Dette dokumentet vil utløpe om %d måneder.",
"Dette dokumentet vil utløpe om %d måneder."
],
"Please enter the password for this paste:": "Vennligst skriv inn passordet for dette innlegget:",
@@ -142,7 +168,7 @@
"Format": "Format",
"Plain Text": "Ren Tekst",
"Source Code": "Kildekode",
"Markdown": "Oppmerket",
"Markdown": "Markdown",
"Download attachment": "Last ned vedlegg",
"Cloned: '%s'": "Kopiert: '%s'",
"The cloned file '%s' was attached to this paste.": "Den klonede filen '%s' var koblet til denne innlimingen.",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Bruk gjeldende tidssone",
"Convert To UTC": "Konverter til UTC",
"Close": "Steng",
"Encrypted note on PrivateBin": "Kryptert notat på PrivateBin",
"Encrypted note on %s": "Kryptert notat på %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL forkorter kan avsløre dekrypteringsnøkkelen.",
"Save paste": "Lagre utklipp",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Mercés d'esperar %d segonda entre cada publicacion.",
"Mercés d'esperar %d segondas entre cada publicacion.",
"Mercés d'esperar %d segondas entre cada publicacion.",
"Mercés d'esperar %d segondas entre cada publicacion.",
"Mercés d'esperar %d segondas entre cada publicacion.",
"Mercés d'esperar %d segondas entre cada publicacion."
],
"Paste is limited to %s of encrypted data.": "Lo tèxte es limitat a %s de donadas chifradas.",
@@ -38,42 +40,56 @@
"%d segonda",
"%d segondas",
"%d segondas",
"%d segondas",
"%d segondas",
"%d segondas"
],
"%d minutes": [
"%d minuta",
"%d minutas",
"%d minutas",
"%d minutas",
"%d minutas",
"%d minutas"
],
"%d hours": [
"%d ora",
"%d oras",
"%d oras",
"%d oras",
"%d oras",
"%d oras"
],
"%d days": [
"%d jorn",
"%d jorns",
"%d jorns",
"%d jorns",
"%d jorns",
"%d jorns"
],
"%d weeks": [
"%d setmana",
"%d setmanas",
"%d setmanas",
"%d setmanas",
"%d setmanas",
"%d setmanas"
],
"%d months": [
"%d mes",
"%d meses",
"%d meses",
"%d meses",
"%d meses",
"%d meses"
],
"%d years": [
"%d an",
"%d ans",
"%d ans",
"%d ans",
"%d ans",
"%d ans"
],
"Never": "Jamai",
@@ -82,30 +98,40 @@
"Aqueste document expirarà daquí %d segonda.",
"Aqueste document expirarà daquí %d segondas.",
"Aqueste document expirarà daquí %d segondas.",
"Aqueste document expirarà daquí %d segondas.",
"Aqueste document expirarà daquí %d segondas.",
"Aqueste document expirarà daquí %d segondas."
],
"This document will expire in %d minutes.": [
"Aqueste document expirarà daquí %d minuta.",
"Aqueste document expirarà daquí %d minutas.",
"Aqueste document expirarà daquí %d minutas.",
"Aqueste document expirarà daquí %d minutas.",
"Aqueste document expirarà daquí %d minutas.",
"Aqueste document expirarà daquí %d minutas."
],
"This document will expire in %d hours.": [
"Aqueste document expirarà daquí %d ora.",
"Aqueste document expirarà daquí %d oras.",
"Aqueste document expirarà daquí %d oras.",
"Aqueste document expirarà daquí %d oras.",
"Aqueste document expirarà daquí %d oras.",
"Aqueste document expirarà daquí %d oras."
],
"This document will expire in %d days.": [
"Aqueste document expirarà daquí %d jorn.",
"Aqueste document expirarà daquí %d jorns.",
"Aqueste document expirarà daquí %d jorns.",
"Aqueste document expirarà daquí %d jorns.",
"Aqueste document expirarà daquí %d jorns.",
"Aqueste document expirarà daquí %d jorns."
],
"This document will expire in %d months.": [
"Aqueste document expirarà daquí %d mes.",
"Aqueste document expirarà daquí %d meses.",
"Aqueste document expirarà daquí %d meses.",
"Aqueste document expirarà daquí %d meses.",
"Aqueste document expirarà daquí %d meses.",
"Aqueste document expirarà daquí %d meses."
],
"Please enter the password for this paste:": "Picatz lo senhal per aqueste tèxte:",
@@ -122,8 +148,8 @@
"Sending comment…": "Mandadís del comentari…",
"Comment posted.": "Comentari mandat.",
"Could not refresh display: %s": "Impossible dactualizar lafichatge:%s",
"unknown status": "Estatut desconegut",
"server error or not responding": "Lo servidor respond pas o a rescontrat una error",
"unknown status": "estatut desconegut",
"server error or not responding": "lo servidor respond pas o a rescontrat una error",
"Could not post comment: %s": "Impossible de mandar lo comentari:%s",
"Sending paste…": "Mandadís del tèxte…",
"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>",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Utilizar lactual",
"Convert To UTC": "Convertir en UTC",
"Close": "Tampar",
"Encrypted note on PrivateBin": "Nòtas chifradas sus PrivateBin",
"Encrypted note on %s": "Nòtas chifradas sus %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "Los espleches dacorchiment dURL pòdon expausar la clau de deschiframent dins lURL.",
"Save paste": "Enregistrar lo tèxt",
"Your IP is not authorized to create pastes.": "Vòstra adreça IP a pas lautorizacion de crear de tèxtes."
"Your IP is not authorized to create pastes.": "Vòstra adreça IP a pas lautorizacion de crear de tèxtes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Ensag dabracar una URL que mena pas a nòstra instància.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.",
"Error parsing YOURLS response.": "Error d'analisi de la responsa YOURLS."
}

View File

@@ -11,6 +11,8 @@
"Poczekaj %d sekundę pomiędzy każdą wklejką.",
"Poczekaj %d sekund pomiędzy każdą wklejką.",
"Poczekaj %d sekund pomiędzy każdą wklejką.",
"Poczekaj %d sekund pomiędzy każdą wklejką.",
"Poczekaj %d sekund pomiędzy każdą wklejką.",
"Poczekaj %d sekund pomiędzy każdą wklejką."
],
"Paste is limited to %s of encrypted data.": "Wklejka jest limitowana do %s zaszyfrowanych danych.",
@@ -35,12 +37,16 @@
"Discussion": "Dyskusja",
"Toggle navigation": "Przełącz nawigację",
"%d seconds": [
"%d second",
"%d second",
"%d second",
"%d second",
"%d second",
"%d second"
],
"%d minutes": [
"%d minut",
"%d minut",
"%d minut",
"%d minut",
"%d minut",
@@ -50,27 +56,37 @@
"%d godzina",
"%d godzina",
"%d godzinę",
"%d godzinę",
"%d godzinę",
"%d godzinę"
],
"%d days": [
"%d dzień",
"%d dzień",
"%d dzień",
"%d dzień",
"%d dzień",
"%d dzień"
],
"%d weeks": [
"%d tydzień",
"%d tydzień",
"%d tydzień",
"%d tydzień",
"%d tydzień",
"%d tydzień"
],
"%d months": [
"%d miesiąc",
"%d miesiąc",
"%d miesiąc",
"%d miesiąc",
"%d miesiąc",
"%d miesiąc"
],
"%d years": [
"%d rok",
"%d rok",
"%d rok",
"%d rok",
"%d rok",
@@ -82,30 +98,40 @@
"Ten dokument wygaśnie za %d sekundę.",
"Ten dokument wygaśnie za %d sekund.",
"Ten dokument wygaśnie za %d sekund.",
"Ten dokument wygaśnie za %d sekund.",
"Ten dokument wygaśnie za %d sekund.",
"Ten dokument wygaśnie za %d sekund."
],
"This document will expire in %d minutes.": [
"Ten dokument wygaśnie za %d minutę.",
"Ten dokument wygaśnie za %d minut.",
"Ten dokument wygaśnie za %d minut.",
"Ten dokument wygaśnie za %d minut.",
"Ten dokument wygaśnie za %d minut.",
"Ten dokument wygaśnie za %d minut."
],
"This document will expire in %d hours.": [
"Ten dokument wygaśnie za godzinę.",
"Ten dokument wygaśnie za %d godzin.",
"Ten dokument wygaśnie za %d godzin.",
"Ten dokument wygaśnie za %d godzin.",
"Ten dokument wygaśnie za %d godzin.",
"Ten dokument wygaśnie za %d godzin."
],
"This document will expire in %d days.": [
"Ten dokument wygaśnie za %d dzień.",
"Ten dokument wygaśnie za %d dni.",
"Ten dokument wygaśnie za %d dni.",
"Ten dokument wygaśnie za %d dni.",
"Ten dokument wygaśnie za %d dni.",
"Ten dokument wygaśnie za %d dni."
],
"This document will expire in %d months.": [
"Ten dokument wygaśnie za miesiąc.",
"Ten dokument wygaśnie za %d miesięcy.",
"Ten dokument wygaśnie za %d miesięcy.",
"Ten dokument wygaśnie za %d miesięcy.",
"Ten dokument wygaśnie za %d miesięcy.",
"Ten dokument wygaśnie za %d miesięcy."
],
"Please enter the password for this paste:": "Wpisz hasło dla tej wklejki:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Por favor espere %d segundo entre cada publicação.",
"Por favor espere %d segundos entre cada publicação.",
"Por favor espere %d segundos entre cada publicação.",
"Por favor espere %d segundos entre cada publicação.",
"Por favor espere %d segundos entre cada publicação.",
"Por favor espere %d segundos entre cada publicação."
],
"Paste is limited to %s of encrypted data.": "A cópia está limitada a %s de dados cifrados.",
@@ -38,42 +40,56 @@
"%d segundo",
"%d segundos",
"%d segundos",
"%d segundos",
"%d segundos",
"%d segundos"
],
"%d minutes": [
"%d minuto",
"%d minutos",
"%d minutos",
"%d minutos",
"%d minutos",
"%d minutos"
],
"%d hours": [
"%d hora",
"%d horas",
"%d horas (2° plural)",
"%d horas",
"%d horas",
"%d horas",
"%d horas"
],
"%d days": [
"%d dia",
"%d dias",
"%d dias",
"%d dias",
"%d dias",
"%d dias"
],
"%d weeks": [
"%d semana",
"%d semanas",
"%d semanas",
"%d semanas",
"%d semanas",
"%d semanas"
],
"%d months": [
"%d mês",
"%d meses",
"%d meses",
"%d meses",
"%d meses",
"%d meses"
],
"%d years": [
"%d ano",
"%d anos",
"%d anos",
"%d anos",
"%d anos",
"%d anos"
],
"Never": "Nunca",
@@ -82,30 +98,40 @@
"Este documento irá expirar em um segundo.",
"Este documento irá expirar em %d segundos.",
"Este documento irá expirar em %d segundos.",
"Este documento irá expirar em %d segundos.",
"Este documento irá expirar em %d segundos.",
"Este documento irá expirar em %d segundos."
],
"This document will expire in %d minutes.": [
"Este documento irá expirar em um minuto.",
"Este documento irá expirar em %d minutos.",
"Este documento irá expirar em %d minutos.",
"Este documento irá expirar em %d minutos.",
"Este documento irá expirar em %d minutos.",
"Este documento irá expirar em %d minutos."
],
"This document will expire in %d hours.": [
"Este documento irá expirar em uma hora.",
"Este documento irá expirar em %d horas.",
"Este documento irá expirar em %d horas.",
"Este documento irá expirar em %d horas.",
"Este documento irá expirar em %d horas.",
"Este documento irá expirar em %d horas."
],
"This document will expire in %d days.": [
"Este documento irá expirar em um dia.",
"Este documento irá expirar em %d dias.",
"Este documento irá expirar em %d dias.",
"Este documento irá expirar em %d dias.",
"Este documento irá expirar em %d dias.",
"Este documento irá expirar em %d dias."
],
"This document will expire in %d months.": [
"Este documento irá expirar em um mês.",
"Este documento irá expirar em %d meses.",
"Este documento irá expirar em %d meses.",
"Este documento irá expirar em %d meses.",
"Este documento irá expirar em %d meses.",
"Este documento irá expirar em %d meses."
],
"Please enter the password for this paste:": "Por favor, digite a senha para essa cópia:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Usar Fuso Horário Atual",
"Convert To UTC": "Converter para UTC",
"Close": "Fechar",
"Encrypted note on PrivateBin": "Nota criptografada no PrivateBin",
"Encrypted note on %s": "Nota criptografada no %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visite esse link para ver a nota. Dar a URL para qualquer um permite que eles também acessem a nota.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Save paste": "Salvar cópia",
"Your IP is not authorized to create pastes.": "Seu IP não está autorizado a criar cópias.",
"Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Пожалуйста, ожидайте %d секунду между каждыми записями.",
"Пожалуйста, ожидайте %d секунды между каждыми записями.",
"Пожалуйста, ожидайте %d секунд между каждыми записями.",
"Пожалуйста, ожидайте %d секунд между каждыми записями.",
"Пожалуйста, ожидайте %d секунд между каждыми записями.",
"Пожалуйста, ожидайте %d секунд между каждыми записями."
],
"Paste is limited to %s of encrypted data.": "Размер записи ограничен %s зашифрованных данных.",
@@ -38,42 +40,56 @@
"%d секунду",
"%d секунды",
"%d секунд",
"%d секунд",
"%d секунд",
"%d секунд"
],
"%d minutes": [
"%d минуту",
"%d минуты",
"%d минут",
"%d минут",
"%d минут",
"%d минут"
],
"%d hours": [
"%d час",
"%d часа",
"%d часов",
"%d часов",
"%d часов",
"%d часов"
],
"%d days": [
"%d день",
"%d дня",
"%d дней",
"%d дней",
"%d дней",
"%d дней"
],
"%d weeks": [
"%d неделю",
"%d недели",
"%d недель",
"%d недель",
"%d недель",
"%d недель"
],
"%d months": [
"%d месяц",
"%d месяца",
"%d месяцев",
"%d месяцев",
"%d месяцев",
"%d месяцев"
],
"%d years": [
"%d год",
"%d года",
"%d лет",
"%d лет",
"%d лет",
"%d лет"
],
"Never": "Никогда",
@@ -82,30 +98,40 @@
"Документ будет удален через %d секунду.",
"Документ будет удален через %d секунды.",
"Документ будет удален через %d секунд.",
"Документ будет удален через %d секунд.",
"Документ будет удален через %d секунд.",
"Документ будет удален через %d секунд."
],
"This document will expire in %d minutes.": [
"Документ будет удален через %d минуту.",
"Документ будет удален через %d минуты.",
"Документ будет удален через %d минут.",
"Документ будет удален через %d минут.",
"Документ будет удален через %d минут.",
"Документ будет удален через %d минут."
],
"This document will expire in %d hours.": [
"Документ будет удален через %d час.",
"Документ будет удален через %d часа.",
"Документ будет удален через %d часов.",
"Документ будет удален через %d часов.",
"Документ будет удален через %d часов.",
"Документ будет удален через %d часов."
],
"This document will expire in %d days.": [
"Документ будет удален через %d день.",
"Документ будет удален через %d дня.",
"Документ будет удален через %d дней.",
"Документ будет удален через %d дней.",
"Документ будет удален через %d дней.",
"Документ будет удален через %d дней."
],
"This document will expire in %d months.": [
"Документ будет удален через %d месяц.",
"Документ будет удален через %d месяца.",
"Документ будет удален через %d месяцев.",
"Документ будет удален через %d месяцев.",
"Документ будет удален через %d месяцев.",
"Документ будет удален через %d месяцев."
],
"Please enter the password for this paste:": "Пожалуйста, введите пароль от записи:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Использовать текущий часовой пояс",
"Convert To UTC": "Конвертировать в UTC",
"Close": "Закрыть",
"Encrypted note on PrivateBin": "Зашифрованная запись на PrivateBin",
"Encrypted note on %s": "Зашифрованная запись на %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Посетите эту ссылку чтобы просмотреть запись. Передача ссылки кому либо позволит им получить доступ к записи тоже.",
"URL shortener may expose your decrypt key in URL.": "Сервис сокращения ссылок может получить ваш ключ расшифровки из ссылки.",
"Save paste": "Сохранить запись",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Вашему IP адресу не разрешено создавать записи.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

219
i18n/sk.json Normal file
View File

@@ -0,0 +1,219 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s je minimalistický, open source online pastebin, kde server nemá žiadne znalosti o vložených údajoch. Údaje sú šifrované/dešifrované %sv prehliadači%s pomocou 256-bitového AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Viac informácií na <a href=\"https://privatebin.info/\">stránke projektu</a>.",
"Because ignorance is bliss": "Pretože nevedomosť je sladká",
"en": "sk",
"Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, jeho platnosť vypršala alebo bol vymazaný.",
"%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s alebo vyššie. Prepáčte.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby bola v konfiguračnom súbore prítomná sekcia [%s].",
"Please wait %d seconds between each post.": [
"Počet sekúnd do ďalšieho príspevku: %d",
"Počet sekúnd do ďalšieho príspevku: %d",
"Počet sekúnd do ďalšieho príspevku: %d",
"Počet sekúnd do ďalšieho príspevku: %d",
"Počet sekúnd do ďalšieho príspevku: %d",
"Počet sekúnd do ďalšieho príspevku: %d"
],
"Paste is limited to %s of encrypted data.": "Príspevok je obmedzený na %s zašifrovaných údajov.",
"Invalid data.": "Neplatné údaje.",
"You are unlucky. Try again.": "Ľutujem. Skúste to znova.",
"Error saving comment. Sorry.": "Pri ukladaní komentára sa vyskytla chyba.",
"Error saving paste. Sorry.": "Pri ukladaní príspevku sa vyskytla chyba.",
"Invalid paste ID.": "Chybne vložené ID.",
"Paste is not of burn-after-reading type.": "Príspevok nieje nastavený na zmazanie po prečítaní.",
"Wrong deletion token. Paste was not deleted.": "Nesprávny token odstránenia. Príspevok nebol odstránený.",
"Paste was properly deleted.": "Príspevok bol správne vymazaný.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Na fungovanie %s je potrebný JavaScript. Ospravedlňujeme sa za nepríjemnosti.",
"%s requires a modern browser to work.": "%s vyžaduje na fungovanie moderný prehliadač.",
"New": "Nový",
"Send": "Odoslať",
"Clone": "Klonovať",
"Raw text": "Surový text",
"Expires": "Expirácia",
"Burn after reading": "Po prečítaní zmazať",
"Open discussion": "Povoliť komentáre",
"Password (recommended)": "Heslo (doporučené)",
"Discussion": "Komentáre",
"Toggle navigation": "Prepnúť navigáciu",
"%d seconds": [
"%d sekunda",
"%d sekundy",
"%d sekúnd",
"%d sekúnd",
"%d sekúnd",
"%d sekúnd"
],
"%d minutes": [
"%d minúta",
"%d minúty",
"%d minút",
"%d minút",
"%d minút",
"%d minút"
],
"%d hours": [
"%d hodina",
"%d hodiny",
"%d hodín",
"%d hodín",
"%d hodín",
"%d hodín"
],
"%d days": [
"%d deň",
"%d dni",
"%d dní",
"%d dní",
"%d dní",
"%d dní"
],
"%d weeks": [
"%d týždeň",
"%d týždne",
"%d týždňov",
"%d týždňov",
"%d týždňov",
"%d týždňov"
],
"%d months": [
"%d mesiac",
"%d mesiace",
"%d mesiacov",
"%d mesiacov",
"%d mesiacov",
"%d mesiacov"
],
"%d years": [
"%d rok",
"%d roky",
"%d rokov",
"%d rokov",
"%d rokov",
"%d rokov"
],
"Never": "Nikdy",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Poznámka: Toto je testovacia služba: Údaje môžu byť kedykoľvek vymazané. Pri zneužití tejto služby zomrú mačiatka.",
"This document will expire in %d seconds.": [
"Platnosť tohto dokumentu vyprší o %d sekundu.",
"Platnosť tohto dokumentu vyprší o %d sekundy.",
"Platnosť tohto dokumentu vyprší o %d sekúnd.",
"Platnosť tohto dokumentu vyprší o %d sekúnd.",
"Platnosť tohto dokumentu vyprší o %d sekúnd.",
"Platnosť tohto dokumentu vyprší o %d sekúnd."
],
"This document will expire in %d minutes.": [
"Platnosť tohto dokumentu vyprší o %d minútu.",
"Platnosť tohto dokumentu vyprší o %d minúty.",
"Platnosť tohto dokumentu vyprší o %d minút.",
"Platnosť tohto dokumentu vyprší o %d minút.",
"Platnosť tohto dokumentu vyprší o %d minút.",
"Platnosť tohto dokumentu vyprší o %d minút."
],
"This document will expire in %d hours.": [
"Platnosť tohto dokumentu vyprší o %d hodinu.",
"Platnosť tohto dokumentu vyprší o %d hodiny.",
"Platnosť tohto dokumentu vyprší o %d hodín.",
"Platnosť tohto dokumentu vyprší o %d hodín.",
"Platnosť tohto dokumentu vyprší o %d hodín.",
"Platnosť tohto dokumentu vyprší o %d hodín."
],
"This document will expire in %d days.": [
"Platnosť tohto dokumentu vyprší o %d deň.",
"Platnosť tohto dokumentu vyprší o %d dni.",
"Platnosť tohto dokumentu vyprší o %d dní.",
"Platnosť tohto dokumentu vyprší o %d dní.",
"Platnosť tohto dokumentu vyprší o %d dní.",
"Platnosť tohto dokumentu vyprší o %d dní."
],
"This document will expire in %d months.": [
"Platnosť tohto dokumentu vyprší o %d mesiac.",
"Platnosť tohto dokumentu vyprší o %d mesiace.",
"Platnosť tohto dokumentu vyprší o %d mesiacov.",
"Platnosť tohto dokumentu vyprší o %d mesiacov.",
"Platnosť tohto dokumentu vyprší o %d mesiacov.",
"Platnosť tohto dokumentu vyprší o %d mesiacov."
],
"Please enter the password for this paste:": "Zadajte prosím heslo:",
"Could not decrypt data (Wrong key?)": "Nepodarilo sa dešifrovať údaje (nesprávny kľúč?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nepodarilo sa odstrániť príspevok, nebol uložený v režime zmazania po prečítaní.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "IBA PRE VAŠE OČI. Toto okno nezatvárajte, táto správa sa nedá znova zobraziť.",
"Could not decrypt comment; Wrong key?": "Nepodarilo sa dešifrovať komentár. Nesprávny kľúč?",
"Reply": "Odpovedať",
"Anonymous": "Anonymný",
"Avatar generated from IP address": "Avatar vygenerovaný z IP adresy",
"Add comment": "Pridať komentár",
"Optional nickname…": "Voliteľná prezývka…",
"Post comment": "Odoslať komentár",
"Sending comment…": "Odosielanie komentára…",
"Comment posted.": "Komentár odoslaný.",
"Could not refresh display: %s": "Nepodarilo sa obnoviť zobrazenie: %s",
"unknown status": "neznámy stav",
"server error or not responding": "chyba servera alebo server neodpovedá",
"Could not post comment: %s": "Nepodarilo sa pridať komentár: %s",
"Sending paste…": "Odosiela sa príspevok…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Váš príspevok je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(skopírujte stlačením [Ctrl]+[c])</span>",
"Delete data": "Odstrániť dáta",
"Could not create paste: %s": "Nepodarilo sa vytvoriť príspevok: %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 je možné dešifrovať príspevok: V URL adrese chýba dešifrovací kľúč (Použili ste presmerovač alebo skracovač adresy, ktorý odstráni časť adresy URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formát",
"Plain Text": "Čistý text",
"Source Code": "Zdrojový kód",
"Markdown": "Markdown",
"Download attachment": "Stiahnuť prílohu",
"Cloned: '%s'": "Naklonované: '%s'",
"The cloned file '%s' was attached to this paste.": "K tomuto príspevku bol pripojený klonovaný súbor '%s'.",
"Attach a file": "Priložiť súbor",
"alternatively drag & drop a file or paste an image from the clipboard": "prípadne presuňte súbor myšou alebo vložte obrázok zo schránky",
"File too large, to display a preview. Please download the attachment.": "Súbor je príliš veľký na zobrazenie ukážky. Stiahnite si prosím prílohu.",
"Remove attachment": "Odstrániť prílohu",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prehliadač nepodporuje nahrávanie šifrovaných súborov. Použite prosím novší prehliadač.",
"Invalid attachment.": "Neplatná príloha.",
"Options": "Možnosti",
"Shorten URL": "Skrátiť URL",
"Editor": "Editor",
"Preview": "Náhľad",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vyžaduje, aby PATH končila na \"%s\". Aktualizujte prosím PATH vo svojom index.php.",
"Decrypt": "Dešifrovať",
"Enter password": "Zadajte heslo",
"Loading…": "Načítava sa…",
"Decrypting paste…": "Dešifrovanie príspevku…",
"Preparing new paste…": "Príprava nového príspevku…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "V prípade, že táto správa nezmizne, pozrite si <a href=\"%s\">tieto často kladené otázky, kde nájdete informácie na riešenie problémov</a>.",
"+++ no paste text +++": "+++ žiadny vložený text +++",
"Could not get paste data: %s": "Nepodarilo sa načítať údaje príspevku: %s",
"QR code": "QR kód",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Táto webová stránka používa nezabezpečené pripojenie HTTP! Používajte ju len na testovanie.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Pre viac informácií si pozrite <a href=\"%s\">tento záznam FAQ</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Váš prehliadač môže na podporu rozhrania WebCrypto API vyžadovať pripojenie HTTPS. Skúste <a href=\"%s\">prepnúť na HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Váš prehliadač nepodporuje WebAssembly, ktorý sa používa na kompresiu zlib. Môžete vytvárať nekomprimované dokumenty, ale nemôžete čítať komprimované.",
"waiting on user to provide a password": "čakám na zadanie hesla",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Údaje sa nepodarilo dešifrovať. Zadali ste nesprávne heslo? Skúste to znova pomocou tlačidla v hornej časti.",
"Retry": "Opakovať",
"Showing raw text…": "Zobrazuje sa surový text…",
"Notice:": "Upozornenie:",
"This link will expire after %s.": "Platnosť odkazu vyprší za %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Tento odkaz je prístupný iba raz, nepoužívajte v prehliadači tlačidlo Späť ani Obnoviť.",
"Link:": "Odkaz:",
"Recipient may become aware of your timezone, convert time to UTC?": "Príjemca sa môže dozvedieť o vašom časovom pásme, previesť čas na UTC?",
"Use Current Timezone": "Použiť aktuálne časové pásmo",
"Convert To UTC": "Previesť na UTC",
"Close": "Zavrieť",
"Encrypted note on %s": "Zašifrovaná poznámka na %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Ak chcete zobraziť poznámku, navštívte tento odkaz. Poskytnutie adresy URL komukoľvek im umožní prístup aj k poznámke.",
"URL shortener may expose your decrypt key in URL.": "Skracovač adries URL môže odhaliť váš dešifrovací kľúč v adrese URL.",
"Save paste": "Uložiť príspevok",
"Your IP is not authorized to create pastes.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.",
"Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,6 +11,8 @@
"Prosim počakaj vsaj %d sekundo pred vsako naslednjo objavo.",
"Prosim počakaj vsaj %d sekundi pred vsako naslednjo objavo.",
"Prosim počakaj vsaj %d sekunde pred vsako naslednjo objavo.",
"Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.",
"Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.",
"Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo."
],
"Paste is limited to %s of encrypted data.": "Velikost prilepka je omejena na %s zakodiranih podatkov.",
@@ -38,42 +40,56 @@
"%d sekunda",
"%d sekundi",
"%d sekunde",
"%d sekund",
"%d sekund",
"%d sekund"
],
"%d minutes": [
"%d minuta",
"%d minuti",
"%d minute",
"%d minut",
"%d minut",
"%d minut"
],
"%d hours": [
"%d ura",
"%d uri",
"%d ure",
"%d ur",
"%d ur",
"%d ur"
],
"%d days": [
"%d dan",
"%d dneva",
"%d dnevi",
"%d dni",
"%d dni",
"%d dni"
],
"%d weeks": [
"%d teden",
"%d tedna",
"%d tedni",
"%d tednov",
"%d tednov",
"%d tednov"
],
"%d months": [
"%d mesec",
"%d meseca",
"%d meseci",
"%d mesecev",
"%d mesecev",
"%d mesecev"
],
"%d years": [
"%d leto",
"%d leti",
"%d leta",
"%d let",
"%d let",
"%d let"
],
"Never": "Nikoli",
@@ -82,30 +98,40 @@
"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.",
"Ta dokument bo potekel čez %d sekund.",
"Ta dokument bo potekel čez %d sekund."
],
"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.",
"Ta dokument bo potekel čez %d minut.",
"Ta dokument bo potekel čez %d minut."
],
"This document will expire in %d hours.": [
"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.",
"Ta dokument bo potekel čez %d ur.",
"Ta dokument bo potekel čez %d ur."
],
"This document will expire in %d days.": [
"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 dni.",
"Ta dokument bo potekel čez %d dni."
],
"This document will expire in %d months.": [
"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 mesecev.",
"Ta dokument bo potekel čez %d mesecev."
],
"Please enter the password for this paste:": "Prosim vnesi geslo tega prilepka:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -11,7 +11,9 @@
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
@@ -38,43 +40,57 @@
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th 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.",
@@ -82,31 +98,41 @@
"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 seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th 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 minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th 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 hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th 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 days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th 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)"
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th 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?)",
@@ -182,9 +208,12 @@
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"Encrypted note on PrivateBin": "Encrypted note on PrivateBin",
"Encrypted note on %s": "Encrypted note on %s",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

219
i18n/th.json Normal file
View File

@@ -0,0 +1,219 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s เป็น pastebin ออนไลน์แบบโอเพ่นซอร์สที่มีรูปแบบการใช้งานที่เรียบง่าย เซิร์ฟเวอร์ไม่สามารถรู้ได้ว่าข้อมูลโค้ดที่มาฝากนั้นเป็นข้อมูลอะไร โดยจะถูกเข้ารหัส/ถอดรหัสด้วยกระบวนการ AES จำนวน 256 บิต%sผ่านเบราว์เซอร์%s",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "ข้อมูลเพิ่มเติม ดูได้ที่<a href=\"https://privatebin.info/\">หน้าโครงการ</a>",
"Because ignorance is bliss": "ไม่รู้ไม่ชี้ดีที่สุด",
"en": "th",
"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 วินาที",
"กรุณาเว้นระยะเวลาการส่งข้อมูลอย่างน้อย %d วินาที",
"กรุณาเว้นระยะเวลาการส่งข้อมูลอย่างน้อย %d วินาที",
"กรุณาเว้นระยะเวลาการส่งข้อมูลอย่างน้อย %d วินาที",
"กรุณาเว้นระยะเวลาการส่งข้อมูลอย่างน้อย %d วินาที",
"กรุณาเว้นระยะเวลาการส่งข้อมูลอย่างน้อย %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.": "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.": "จำเป็นต้องใช้ JavaScript เพื่อให้ %s สามารถทำงานได้ ขออภัยในความไม่สะดวก",
"%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 วินาที",
"%d วินาที",
"%d วินาที"
],
"%d minutes": [
"%d นาที",
"%d นาที",
"%d นาที",
"%d นาที",
"%d นาที",
"%d นาที"
],
"%d hours": [
"%d ชั่วโมง",
"%d ชั่วโมง",
"%d ชั่วโมง",
"%d ชั่วโมง",
"%d ชั่วโมง",
"%d ชั่วโมง"
],
"%d days": [
"%d วัน",
"%d วัน",
"%d วัน",
"%d วัน",
"%d วัน",
"%d วัน"
],
"%d weeks": [
"%d สัปดาห์",
"%d สัปดาห์",
"%d สัปดาห์",
"%d สัปดาห์",
"%d สัปดาห์",
"%d สัปดาห์"
],
"%d months": [
"%d เดือน",
"%d เดือน",
"%d เดือน",
"%d เดือน",
"%d เดือน",
"%d เดือน"
],
"%d years": [
"%d ปี",
"%d ปี",
"%d ปี",
"%d ปี",
"%d ปี",
"%d ปี"
],
"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 วินาที",
"เอกสารนี้จะหมดอายุใน %d วินาที",
"เอกสารนี้จะหมดอายุใน %d วินาที",
"เอกสารนี้จะหมดอายุใน %d วินาที"
],
"This document will expire in %d minutes.": [
"เอกสารนี้จะหมดอายุใน %d นาที",
"เอกสารนี้จะหมดอายุใน %d นาที",
"เอกสารนี้จะหมดอายุใน %d นาที",
"เอกสารนี้จะหมดอายุใน %d นาที",
"เอกสารนี้จะหมดอายุใน %d นาที",
"เอกสารนี้จะหมดอายุใน %d นาที"
],
"This document will expire in %d hours.": [
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง",
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง",
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง",
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง",
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง",
"เอกสารนี้จะหมดอายุใน %d ชั่วโมง"
],
"This document will expire in %d days.": [
"เอกสารนี้จะหมดอายุใน %d วัน",
"เอกสารนี้จะหมดอายุใน %d วัน",
"เอกสารนี้จะหมดอายุใน %d วัน",
"เอกสารนี้จะหมดอายุใน %d วัน",
"เอกสารนี้จะหมดอายุใน %d วัน",
"เอกสารนี้จะหมดอายุใน %d วัน"
],
"This document will expire in %d months.": [
"เอกสารนี้จะหมดอายุใน %d เดือน",
"เอกสารนี้จะหมดอายุใน %d เดือน",
"เอกสารนี้จะหมดอายุใน %d เดือน",
"เอกสารนี้จะหมดอายุใน %d เดือน",
"เอกสารนี้จะหมดอายุใน %d เดือน",
"เอกสารนี้จะหมดอายุใน %d เดือน"
],
"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": "อวาตารสร้างมาจากไอพี",
"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?)": "ไม่สามารถถอดรหัสข้อมูลการฝากโค้ดได้: คีย์ถอดรหัสที่อยู่ใน URL หายไป (คุณได้ใช้ตัวเปลี่ยนเส้นทางหรือตัวย่อ URL ที่มีการตัดส่วนของ URL ออกหรือไม่)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"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.": "%s กำหนดให้ PATH ลงท้ายด้วย \"%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\">คำถามที่พบบ่อยนี้เพื่อใช้แก้ไขปัญหา</a>",
"+++ no paste text +++": "+++ ไม่มีข้อความการฝากโค้ด +++",
"Could not get paste data: %s": "ไม่สามารถดึงข้อมูลการฝากโค้ดได้: %s",
"QR code": "คิวอาร์โค้ด",
"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 เพื่อสนับสนุน API แบบ WebCrypto ลอง<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": "กำลังรอผู้ใช้กรอกรหัสผ่าน",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "ไม่สามารถถอดรหัสข้อมูลได้ คุณกรอกรหัสผ่านผิดหรือเปล่า กดปุ่มลองอีกครั้งด้านบน",
"Retry": "ลองอีกครั้ง",
"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 %s": "เขารหัสบันทึกย่อบน %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "ไปที่ลิงก์นี้เพื่อดูบันทึกย่อทั้งหมด ส่ง URL นี้ให้ใครก็ได้เพื่อให้สามารถเข้าถึงบันทึกย่อได้",
"URL shortener may expose your decrypt key in URL.": "เครื่องมือสร้างลิงก์ย่ออาจเปิดเผยคีย์ถอดรหัสของคุณใน URL ได้",
"Save paste": "ดาวน์โหลดข้อมูลการฝากโค้ด",
"Your IP is not authorized to create pastes.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด",
"Trying to shorten a URL that isn't pointing at our instance.": "กำลังพยายามใช้เครื่องมือสร้างลิงก์ย่อ ที่ไม่ได้ชี้ไปที่อินสแตนซ์ของเรา",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "เกิดข้อผิดพลาดในการเรียก YOURLS อาจเป็นปัญหามาจากการกำหนดค่า เช่น \"apiurl\" หรือ \"signature\" ไม่ถูกต้องหรือขาดหายไป",
"Error parsing YOURLS response.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS"
}

View File

@@ -1,135 +1,161 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s sunucunun burada paylaştığınız veriyi görmediği, minimal, açık kaynak bir pastebindir. Veriler tarayıcıda 256 bit AES kullanılarak şifrelenir/çözülür.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Daha fazla bilgi için <a href=\"https://privatebin.info/\">proje sayfası</a>'na göz atabilirsiniz.",
"Because ignorance is bliss": "Çünkü, cehalet mutluluktur",
"en": "tr",
"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.",
"%s requires php %s or above to work. Sorry.": "%s PHP %s veya daha üstünü gerektirir.",
"%s requires configuration section [%s] to be present in configuration file.": "%s konfigürasyon bölümünün [%s] bulunmasını gerektir.",
"Please wait %d seconds between each post.": [
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Lütfen paylaşımlar arasında %d saniye bekleyiniz.",
"Lütfen paylaşımlar arasında %d saniye bekleyiniz.",
"Lütfen paylaşımlar arasında %d saniye bekleyiniz.",
"Lütfen paylaşımlar arasında %d saniye bekleyiniz.",
"Lütfen paylaşımlar arasında %d saniye bekleyiniz.",
"Lütfen paylaşımlar arasında %d saniye bekleyiniz."
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Paste is limited to %s of encrypted data.": "Yazılar %s şifreli veriyle sınırlıdır.",
"Invalid data.": "Geçersiz veri.",
"You are unlucky. Try again.": "Lütfen tekrar deneyiniz.",
"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.",
"Error saving comment. Sorry.": "Yorum kaydedilemedi.",
"Error saving paste. Sorry.": "Yazı kaydedilemedi. Üzgünüz.",
"Invalid paste ID.": "Geçersiz yazı ID'si.",
"Paste is not of burn-after-reading type.": "Yazı okunduğunda silinmeyecek şekilde ayarlanmış.",
"Wrong deletion token. Paste was not deleted.": "Yanlış silme anahtarı. Yazı silinemedi.",
"Paste was properly deleted.": "Yazı başarıyla silindi.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript %s 'in çalışması için gereklidir. Rahatsızlıktan dolayı özür dileriz.",
"%s requires a modern browser to work.": "%s çalışmak için çağdaş bir tarayıcı gerektirir.",
"New": "Yeni",
"Send": "Gönder",
"Clone": "Kopyala",
"Raw text": "Raw text",
"Raw text": "ık yazı",
"Expires": "Süre Sonu",
"Burn after reading": "Burn after reading",
"Burn after reading": "Okuduktan sonra sil",
"Open discussion": "Açık Tartışmalar",
"Password (recommended)": "Password (recommended)",
"Password (recommended)": "Şifre (önerilir)",
"Discussion": "Tartışma",
"Toggle navigation": "Gezinmeyi değiştir",
"%d seconds": [
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)"
"%d saniye",
"%d saniye",
"%d saniye",
"%d saniye",
"%d saniye",
"%d saniye"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)"
"%d dakika",
"%d dakika",
"%d dakika",
"%d dakika",
"%d dakika",
"%d dakika"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)"
"%d saat",
"%d saat",
"%d saat",
"%d saat",
"%d saat",
"%d saat"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)"
"%d gün",
"%d gün",
"%d gün",
"%d gün",
"%d gün",
"%d gün"
],
"%d weeks": [
"%d hafta (tekil)",
"%d haftalar (çoğul)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)"
"%d hafta",
"%d haftalar",
"%d hafta",
"%d hafta",
"%d hafta",
"%d hafta"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)"
"%d ay",
"%d ay",
"%d ay",
"%d ay",
"%d ay",
"%d ay"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)"
"%d yıl",
"%d yıl",
"%d yıl",
"%d yıl",
"%d yıl",
"%d yıl"
],
"Never": "Never",
"Never": "Asla",
"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)"
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir."
],
"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)"
"Bu belge %d dakikada silinecektir.",
"Bu belge %d dakikada silinecektir.",
"Bu belge %d dakikada silinecektir.",
"Bu belge %d dakikada silinecektir.",
"Bu belge %d dakikada silinecektir.",
"Bu belge %d dakikada silinecektir."
],
"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)"
"Bu belge %d saatte silinecektir.",
"Bu belge %d saatte silinecektir.",
"Bu belge %d saatte silinecektir.",
"Bu belge %d saatte silinecektir.",
"Bu belge %d saatte silinecektir.",
"Bu belge %d saatte silinecektir."
],
"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)"
"Bu belge %d günde silinecektir.",
"Bu belge %d günde silinecektir.",
"Bu belge %d günde silinecektir.",
"Bu belge %d günde silinecektir.",
"Bu belge %d günde silinecektir.",
"Bu belge %d günde silinecektir."
],
"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)"
"Bu belge %d ayda silinecektir.",
"Bu belge %d ayda silinecektir.",
"Bu belge %d ayda silinecektir.",
"Bu belge %d ayda silinecektir.",
"Bu belge %d ayda silinecektir.",
"Bu belge %d ayda silinecektir."
],
"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?",
"Please enter the password for this paste:": "Lütfen bu yazı için şifrenizi girin:",
"Could not decrypt data (Wrong key?)": "Şifre çözülemedi (Yanlış anahtar mı kullandınız?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Yazı silinemedi, okunduktan sonra silinmek için ayarlanmadı.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "BU DOSYAYI SADECE SİZ GÖRÜNTÜLEYEBİLİRSİNİZ. Bu pencereyi kapatmayın, yazıyı tekrar görüntüleyemeyeceksiniz.",
"Could not decrypt comment; Wrong key?": "Dosya şifresi çözülemedi, doğru anahtarı girdiğinizden emin misiniz?",
"Reply": "Cevapla",
"Anonymous": "Anonim",
"Avatar generated from IP address": "Avatar generated from IP address",
"Avatar generated from IP address": "IP adresinden oluşturulmuş avatar",
"Add comment": "Yorum ekle",
"Optional nickname…": "Optional nickname…",
"Optional nickname…": "İsteğe bağlı takma isim…",
"Post comment": "Yorumu gönder",
"Sending comment…": "Sending comment…",
"Sending comment…": "Yorum gönderiliyor…",
"Comment posted.": "Yorum gönderildi.",
"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>",
"Could not refresh display: %s": "Görüntü yenilenemedi: %s",
"unknown status": "bilinmeyen durum",
"server error or not responding": "sunucu hatası veya yanıt vermiyor",
"Could not post comment: %s": "Yorum paylaşılamadı: %s",
"Sending paste…": "Yazı gönderiliyor…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Yazınız: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">([Ctrl]+[c] tuşlarına basarak kopyalayın.)</span>",
"Delete data": "Veriyi sil",
"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?)",
"Could not create paste: %s": "Yazı oluşturulamadı: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Yazı şifresi çözülemedi, çözme anahtarı URL'de bulunamadı. (Buraya bir yönlendirici veya URL kısaltıcı kullanarak gelmiş olabilirsiniz.)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
@@ -140,51 +166,54 @@
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Plain Text": "Plain Text",
"Source Code": "Source Code",
"Plain Text": "Düz Yazı",
"Source Code": "Kaynak Kodu",
"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",
"Download attachment": "Eki indir",
"Cloned: '%s'": "Klonlandı: '%s'",
"The cloned file '%s' was attached to this paste.": "Klonlanmış dosya '%s' bu yazıya eklendi.",
"Attach a file": "Dosya ekle",
"alternatively drag & drop a file or paste an image from the clipboard": "alternatif olarak dosyasyı yapıştırabilir veya sürükleyip bırakabilirsin",
"File too large, to display a preview. Please download the attachment.": "Dosya önizleme için çok büyük. Lütfen eki indirin.",
"Remove attachment": "Eki sil",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Tarayıcınız şifreli dosyaları desteklemiyor.",
"Invalid attachment.": "Geçersiz ek.",
"Options": "Seçenekler",
"Shorten URL": "URL kısaltma",
"Editor": "Düzenleyici",
"Preview": "Ön izleme",
"%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",
"Decrypt": "Şifreyi çöz",
"Enter password": "Şifreyi girin",
"Loading…": "Yükleniyor…",
"Decrypting paste…": "Decrypting paste…",
"Preparing new paste…": "Preparing new paste…",
"Decrypting paste…": "Yazı şifresi çözülüyor…",
"Preparing new paste…": "Yeni yazı hazırlanıyor…",
"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",
"Could not get paste data: %s": "Yazı verisi alınamıyor: %s",
"QR code": "QR kodu",
"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.",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Dosya şifresi çözülemedi, doğru şifreyi kullandığınıza emin misiniz? Üstteki buton ile tekrar deneyin.",
"Retry": "Yeniden Dene",
"Showing raw text…": "Showing raw text…",
"Showing raw text…": "ık yazı gösteriliyor…",
"Notice:": "Bildirim:",
"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.",
"This link will expire after %s.": "Bu bağlantı şu kadar zaman sonra etkisiz kalacaktır: %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Bu bağlantı sadece bir kere erişilebilir, lütfen sayfayı yenilemeyiniz.",
"Link:": "Bağlantı:",
"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",
"Recipient may become aware of your timezone, convert time to UTC?": "Alıcı zaman dilmini öğrenebilir, zaman dilimini UTC'ye çevirmek ister misin?",
"Use Current Timezone": "Şuanki zaman dilimini kullan",
"Convert To UTC": "UTC zaman dilimine çevir",
"Close": "Kapat",
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Encrypted note on %s": "%s üzerinde şifrelenmiş not",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Notu görmek için bu bağlantıyı ziyaret et. Bağlantıya sahip olan birisi notu görebilir.",
"URL shortener may expose your decrypt key in URL.": "URL kısaltıcı şifreleme anahtarınızı URL içerisinde gösterebilir.",
"Save paste": "Yazıyı kaydet",
"Your IP is not authorized to create pastes.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -8,10 +8,12 @@
"%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 second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)"
"Будь ласка, зачекайте %d секунду між створеннями.",
"Будь ласка, зачекайте %d секунди між створеннями.",
"Будь ласка, зачекайте %d секунд між створеннями.",
"Будь ласка, зачекайте %d секунд між створеннями.",
"Будь ласка, зачекайте %d секунд між створеннями.",
"Будь ласка, зачекайте %d секунд між створеннями."
],
"Paste is limited to %s of encrypted data.": "Розмір допису обмежений %s зашифрованих даних.",
"Invalid data.": "Неправильні дані.",
@@ -38,42 +40,56 @@
"%d секунду",
"%d секунди",
"%d секунд",
"%d секунд",
"%d секунд",
"%d секунд"
],
"%d minutes": [
"%d хвилину",
"%d хвилини",
"%d хвилин",
"%d хвилин",
"%d хвилин",
"%d хвилин"
],
"%d hours": [
"%d годину",
"%d години",
"%d годин",
"%d годин",
"%d годин",
"%d годин"
],
"%d days": [
"%d день",
"%d дні",
"%d днів",
"%d днів",
"%d днів",
"%d днів"
],
"%d weeks": [
"%d тиждень",
"%d тижні",
"%d тижнів",
"%d тижнів",
"%d тижнів",
"%d тижнів"
],
"%d months": [
"%d місяць",
"%d місяці",
"%d місяців",
"%d місяців",
"%d місяців",
"%d місяців"
],
"%d years": [
"%d рік",
"%d роки",
"%d років",
"%d років",
"%d років",
"%d років"
],
"Never": "Ніколи",
@@ -82,30 +98,40 @@
"Документ буде вилучений через %d секунду.",
"Документ буде вилучений через %d секунди.",
"Документ буде вилучений через %d секунд.",
"Документ буде вилучений через %d секунд.",
"Документ буде вилучений через %d секунд.",
"Документ буде вилучений через %d секунд."
],
"This document will expire in %d minutes.": [
"Документ буде вилучений через %d хвилину.",
"Документ буде вилучений через %d хвилини.",
"Документ буде вилучений через %d хвилин.",
"Документ буде вилучений через %d хвилин.",
"Документ буде вилучений через %d хвилин.",
"Документ буде вилучений через %d хвилин."
],
"This document will expire in %d hours.": [
"Документ буде вилучений через %d годину.",
"Документ буде вилучений через %d години.",
"Документ буде вилучений через %d годин.",
"Документ буде вилучений через %d годин.",
"Документ буде вилучений через %d годин.",
"Документ буде вилучений через %d годин."
],
"This document will expire in %d days.": [
"Документ буде вилучений через %d день.",
"Документ буде вилучений через %d дні.",
"Документ буде вилучений через %d днів.",
"Документ буде вилучений через %d днів.",
"Документ буде вилучений через %d днів.",
"Документ буде вилучений через %d днів."
],
"This document will expire in %d months.": [
"Документ буде вилучений через %d місяць.",
"Документ буде вилучений через %d місяці.",
"Документ буде вилучений через %d місяців.",
"Документ буде вилучений через %d місяців.",
"Документ буде вилучений через %d місяців.",
"Документ буде вилучений через %d місяців."
],
"Please enter the password for this paste:": "Будь ласка, введіть пароль від допису:",
@@ -170,21 +196,24 @@
"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.",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"waiting on user to provide a password": "очікування користувача для вводу паролю",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Не вдалося розшифрувати дані. Може, ви ввели неправильний пароль? Спробуйте знову за допомогою верхньої кнопки.",
"Retry": "Спробуйте ще раз",
"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 %s": "Зашифрована нотатка на %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Відвідайте посилання, щоб переглянути нотатку. Передача посилання будь-кому дозволить їм переглянути нотатку.",
"URL shortener may expose your decrypt key in URL.": "Сервіс скорочення посилань може викрити ваш ключ дешифрування з URL.",
"Save paste": "Зберегти вставку",
"Your IP is not authorized to create pastes.": "Вашому IP не дозволено створювати вставки.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response."
}

View File

@@ -8,6 +8,8 @@
"%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 秒只能粘贴一次。",
"每 %d 秒只能粘贴一次。",
"每 %d 秒只能粘贴一次。",
"每 %d 秒只能粘贴一次。",
"每 %d 秒只能粘贴一次。",
@@ -35,6 +37,8 @@
"Discussion": "讨论",
"Toggle navigation": "切换导航栏",
"%d seconds": [
"%d 秒",
"%d 秒",
"%d 秒",
"%d 秒",
"%d 秒",
@@ -44,33 +48,45 @@
"%d 分钟",
"%d 分钟",
"%d 秒",
"%d 秒",
"%d 秒",
"%d 秒"
],
"%d hours": [
"%d 小时",
"%d 小时",
"%d 小时",
"%d 小时",
"%d 小时",
"%d 小时"
],
"%d days": [
"%d 天",
"%d 天",
"%d 天",
"%d 天",
"%d 天",
"%d 天"
],
"%d weeks": [
"%d 周",
"%d 周",
"%d 周",
"%d 周",
"%d 周",
"%d 周"
],
"%d months": [
"%d 个月",
"%d 个月",
"%d 个月",
"%d 个月",
"%d 个月",
"%d 个月"
],
"%d years": [
"%d 年",
"%d 年",
"%d 年",
"%d 年",
"%d 年",
@@ -82,30 +98,40 @@
"这份文档将在一秒后过期。",
"这份文档将在 %d 秒后过期。",
"这份文档将在 %d 秒后过期。",
"这份文档将在 %d 秒后过期。",
"这份文档将在 %d 秒后过期。",
"这份文档将在 %d 秒后过期。"
],
"This document will expire in %d minutes.": [
"这份文档将在一分钟后过期。",
"这份文档将在 %d 分钟后过期。",
"这份文档将在 %d 分钟后过期。",
"这份文档将在 %d 分钟后过期。",
"这份文档将在 %d 分钟后过期。",
"这份文档将在 %d 分钟后过期。"
],
"This document will expire in %d hours.": [
"这份文档将在一小时后过期。",
"这份文档将在 %d 小时后过期。",
"这份文档将在 %d 小时后过期。",
"这份文档将在 %d 小时后过期。",
"这份文档将在 %d 小时后过期。",
"这份文档将在 %d 小时后过期。"
],
"This document will expire in %d days.": [
"这份文档将在一天后过期。",
"这份文档将在 %d 天后过期。",
"这份文档将在 %d 天后过期。",
"这份文档将在 %d 天后过期。",
"这份文档将在 %d 天后过期。",
"这份文档将在 %d 天后过期。"
],
"This document will expire in %d months.": [
"这份文档将在一个月后过期。",
"这份文档将在 %d 个月后过期。",
"这份文档将在 %d 个月后过期。",
"这份文档将在 %d 个月后过期。",
"这份文档将在 %d 个月后过期。",
"这份文档将在 %d 个月后过期。"
],
"Please enter the password for this paste:": "请输入这份粘贴内容的密码:",
@@ -182,9 +208,12 @@
"Use Current Timezone": "使用当前时区",
"Convert To UTC": "转换为 UTC",
"Close": "关闭",
"Encrypted note on PrivateBin": "PrivateBin 上的加密笔记",
"Encrypted note on %s": "%s 上的加密笔记",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "访问此链接来查看该笔记。将此 URL 发送给任何人即可允许其访问该笔记。",
"URL shortener may expose your decrypt key in URL.": "短链接服务可能会暴露您在 URL 中的解密密钥。",
"Save paste": "保存内容",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes."
"Your IP is not authorized to create pastes.": "您的 IP 无权创建粘贴。",
"Trying to shorten a URL that isn't pointing at our instance.": "尝试缩短一个不指向我们实例的URL。",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "调用 YOURLS 时出错。可能是配置问题例如“apiurl”或“signature”错误或缺失。",
"Error parsing YOURLS response.": "解析 YOURLS 响应时出错。"
}

View File

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

View File

@@ -10,14 +10,14 @@ global.fs = require('fs');
global.WebCrypto = require('@peculiar/webcrypto').Crypto;
// application libraries to test
global.$ = global.jQuery = require('./jquery-3.6.0');
global.$ = global.jQuery = require('./jquery-3.7.0');
global.RawDeflate = require('./rawinflate-0.3').RawDeflate;
global.zlib = require('./zlib-1.2.12').zlib;
global.zlib = require('./zlib-1.2.13').zlib;
require('./prettify');
global.prettyPrint = window.PR.prettyPrint;
global.prettyPrintOne = window.PR.prettyPrintOne;
global.showdown = require('./showdown-2.0.3');
global.DOMPurify = require('./purify-2.3.6');
global.showdown = require('./showdown-2.1.0');
global.DOMPurify = require('./purify-3.0.4');
global.baseX = require('./base-x-4.0.0').baseX;
global.Legacy = require('./legacy').Legacy;
require('./bootstrap-3.4.1');

2
js/jquery-3.6.0.js vendored

File diff suppressed because one or more lines are too long

2
js/jquery-3.7.0.js vendored Normal file

File diff suppressed because one or more lines are too long

1785
js/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "privatebin",
"version": "1.4.0",
"version": "1.6.0",
"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",
"directories": {

View File

@@ -6,7 +6,7 @@
* @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.4.0
* @version 1.6.0
* @name PrivateBin
* @namespace
*/
@@ -627,7 +627,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @prop {string[]}
* @readonly
*/
const supportedLanguages = ['bg', 'ca', 'co', 'cs', 'de', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh'];
const supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh'];
/**
* built in language
@@ -802,28 +802,34 @@ jQuery.PrivateBin = (function($, RawDeflate) {
me.getPluralForm = function(n) {
switch (language)
{
case 'ar':
return n === 0 ? 0 : (n === 1 ? 1 : (n === 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10 ? 3 : (n % 100 >= 11 ? 4 : 5))));
case 'cs':
return n === 1 ? 0 : (n >= 2 && n <=4 ? 1 : 2);
case 'sk':
return n === 1 ? 0 : (n >= 2 && n <= 4 ? 1 : 2);
case 'co':
case 'fr':
case 'oc':
case 'tr':
case 'zh':
return n > 1 ? 1 : 0;
case 'he':
return n === 1 ? 0 : (n === 2 ? 1 : ((n < 0 || n > 10) && (n % 10 === 0) ? 2 : 3));
case 'id':
case 'ja':
case 'jbo':
case 'th':
return 0;
case 'lt':
return n % 10 === 1 && n % 100 !== 11 ? 0 : ((n % 10 >= 2 && n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
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 'uk':
return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
case 'sl':
return n % 100 === 1 ? 1 : (n % 100 === 2 ? 2 : (n % 100 === 3 || n % 100 === 4 ? 3 : 0));
// bg, ca, de, en, es, et, fi, hu, it, nl, no, pt
// bg, ca, de, el, en, es, et, fi, hu, it, nl, no, pt
default:
return n !== 1 ? 1 : 0;
}
@@ -3646,7 +3652,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
function changeBurnAfterReading()
{
if ($burnAfterReading.is(':checked')) {
if (me.getBurnAfterReading()) {
$openDiscussionOption.addClass('buttondisabled');
$openDiscussion.prop('checked', false);
@@ -3666,7 +3672,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
function changeOpenDiscussion()
{
if ($openDiscussion.is(':checked')) {
if (me.getOpenDiscussion()) {
$burnAfterReadingOption.addClass('buttondisabled');
$burnAfterReading.prop('checked', false);
@@ -4316,7 +4322,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
me.getBurnAfterReading = function()
{
return $burnAfterReading.is(':checked');
return $burnAfterReading.prop('checked');
};
/**
@@ -4328,7 +4334,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
me.getOpenDiscussion = function()
{
return $openDiscussion.is(':checked');
return $openDiscussion.prop('checked');
};
/**

File diff suppressed because one or more lines are too long

2
js/purify-3.0.4.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

View File

@@ -26,9 +26,9 @@
let buff;
if (typeof fetch === 'undefined') {
buff = fs.readFileSync('zlib-1.2.12.wasm');
buff = fs.readFileSync('zlib-1.2.13.wasm');
} else {
const resp = await fetch('js/zlib-1.2.12.wasm');
const resp = await fetch('js/zlib-1.2.13.wasm');
buff = await resp.arrayBuffer();
}
const module = await WebAssembly.compile(buff);

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin;
@@ -53,6 +53,7 @@ class Configuration
'languagedefault' => '',
'urlshortener' => '',
'qrcode' => true,
'email' => true,
'icon' => 'identicon',
'cspheader' => 'default-src \'none\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; 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',
'zerobincompatibility' => false,
@@ -93,6 +94,10 @@ class Configuration
'model_options' => array(
'dir' => 'data',
),
'yourls' => array(
'signature' => '',
'apiurl' => '',
),
);
/**
@@ -153,8 +158,25 @@ class Configuration
)
) {
$values = array(
'bucket' => getenv('PRIVATEBIN_GCS_BUCKET') ? getenv('PRIVATEBIN_GCS_BUCKET') : null,
'prefix' => 'pastes',
'bucket' => getenv('PRIVATEBIN_GCS_BUCKET') ? getenv('PRIVATEBIN_GCS_BUCKET') : null,
'prefix' => 'pastes',
'uniformacl' => false,
);
} elseif (
$section == 'model_options' && in_array(
$this->_configuration['model']['class'],
array('S3Storage')
)
) {
$values = array(
'region' => null,
'version' => null,
'endpoint' => null,
'accesskey' => null,
'secretkey' => null,
'use_path_style_endpoint' => null,
'bucket' => null,
'prefix' => '',
);
}
@@ -215,6 +237,14 @@ class Configuration
if (!array_key_exists($this->_configuration['expire']['default'], $this->_configuration['expire_options'])) {
$this->_configuration['expire']['default'] = key($this->_configuration['expire_options']);
}
// ensure the basepath ends in a slash, if one is set
if (
strlen($this->_configuration['main']['basepath']) &&
substr_compare($this->_configuration['main']['basepath'], '/', -1) !== 0
) {
$this->_configuration['main']['basepath'] .= '/';
}
}
/**

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin;
@@ -28,14 +28,14 @@ class Controller
*
* @const string
*/
const VERSION = '1.4.0';
const VERSION = '1.6.0';
/**
* minimal required PHP version
*
* @const string
*/
const MIN_PHP_VERSION = '5.6.0';
const MIN_PHP_VERSION = '7.3.0';
/**
* show the same error message if the paste expired or does not exist
@@ -136,6 +136,9 @@ class Controller
case 'jsonld':
$this->_jsonld($this->_request->getParam('jsonld'));
return;
case 'yourlsproxy':
$this->_yourlsproxy($this->_request->getParam('link'));
break;
}
// output JSON or HTML
@@ -341,8 +344,11 @@ class Controller
header('Content-Security-Policy: ' . $this->_conf->getKey('cspheader'));
header('Cross-Origin-Resource-Policy: same-origin');
header('Cross-Origin-Embedder-Policy: require-corp');
header('Cross-Origin-Opener-Policy: same-origin');
header('Permissions-Policy: interest-cohort=()');
// disabled, because it prevents links from a paste to the same site to
// be opened. Didn't work with `same-origin-allow-popups` either.
// See issue https://github.com/PrivateBin/PrivateBin/issues/970 for details.
// header('Cross-Origin-Opener-Policy: same-origin');
header('Permissions-Policy: browsing-topics=()');
header('Referrer-Policy: no-referrer');
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: deny');
@@ -375,9 +381,15 @@ class Controller
);
$page = new View;
$page->assign('NAME', $this->_conf->getKey('name'));
$page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath')));
$page->assign('CSPHEADER', $metacspheader);
$page->assign('ERROR', I18n::_($this->_error));
$page->assign('NAME', $this->_conf->getKey('name'));
if ($this->_request->getOperation() === 'yourlsproxy') {
$page->assign('SHORTURL', $this->_status);
$page->draw('yourlsproxy');
return;
}
$page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath')));
$page->assign('STATUS', I18n::_($this->_status));
$page->assign('VERSION', self::VERSION);
$page->assign('DISCUSSION', $this->_conf->getKey('discussion'));
@@ -399,10 +411,10 @@ class Controller
$page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire'));
$page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener'));
$page->assign('QRCODE', $this->_conf->getKey('qrcode'));
$page->assign('EMAIL', $this->_conf->getKey('email'));
$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('CSPHEADER', $metacspheader);
$page->draw($this->_conf->getKey('template'));
}
@@ -414,10 +426,13 @@ class Controller
*/
private function _jsonld($type)
{
if (
$type !== 'paste' && $type !== 'comment' &&
$type !== 'pastemeta' && $type !== 'commentmeta'
) {
if (!in_array($type, array(
'comment',
'commentmeta',
'paste',
'pastemeta',
'types',
))) {
$type = '';
}
$content = '{}';
@@ -429,6 +444,13 @@ class Controller
file_get_contents($file)
);
}
if ($type === 'types') {
$content = str_replace(
implode('", "', array_keys($this->_conf->getDefaults()['expire_options'])),
implode('", "', array_keys($this->_conf->getSection('expire_options'))),
$content
);
}
header('Content-type: application/ld+json');
header('Access-Control-Allow-Origin: *');
@@ -436,6 +458,22 @@ class Controller
echo $content;
}
/**
* proxies link to YOURLS, updates status or error with response
*
* @access private
* @param string $link
*/
private function _yourlsproxy($link)
{
$yourls = new YourlsProxy($this->_conf, $link);
if ($yourls->isError()) {
$this->_error = $yourls->getError();
} else {
$this->_status = $yourls->getUrl();
}
}
/**
* prepares JSON encoded status message
*

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin\Data;
@@ -15,61 +15,17 @@ namespace PrivateBin\Data;
/**
* AbstractData
*
* Abstract model for data access, implemented as a singleton.
* Abstract model for data access
*/
abstract class AbstractData
{
/**
* Singleton instance
*
* @access protected
* @static
* @var AbstractData
*/
protected static $_instance = null;
/**
* cache for the traffic limiter
*
* @access private
* @static
* @access protected
* @var array
*/
protected static $_last_cache = array();
/**
* Enforce singleton, disable constructor
*
* Instantiate using {@link getInstance()}, this object implements the singleton pattern.
*
* @access protected
*/
protected function __construct()
{
}
/**
* Enforce singleton, disable cloning
*
* Instantiate using {@link getInstance()}, this object implements the singleton pattern.
*
* @access private
*/
private function __clone()
{
}
/**
* Get instance of singleton
*
* @access public
* @static
* @param array $options
* @return AbstractData
*/
public static function getInstance(array $options)
{
}
protected $_last_cache = array();
/**
* Create a paste.
@@ -150,9 +106,9 @@ abstract class AbstractData
public function purgeValues($namespace, $time)
{
if ($namespace === 'traffic_limiter') {
foreach (self::$_last_cache as $key => $last_submission) {
foreach ($this->_last_cache as $key => $last_submission) {
if ($last_submission <= $time) {
unset(self::$_last_cache[$key]);
unset($this->_last_cache[$key]);
}
}
}
@@ -207,6 +163,14 @@ abstract class AbstractData
}
}
/**
* Returns all paste ids
*
* @access public
* @return array
*/
abstract public function getAllPastes();
/**
* Get next free slot for comment from postdate.
*

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin\Data;
@@ -25,59 +25,43 @@ use PrivateBin\Json;
*/
class Database extends AbstractData
{
/**
* cache for select queries
*
* @var array
*/
private static $_cache = array();
/**
* instance of database connection
*
* @access private
* @static
* @var PDO
*/
private static $_db;
private $_db;
/**
* table prefix
*
* @access private
* @static
* @var string
*/
private static $_prefix = '';
private $_prefix = '';
/**
* database type
*
* @access private
* @static
* @var string
*/
private static $_type = '';
private $_type = '';
/**
* get instance of singleton
* instantiates a new Database data backend
*
* @access public
* @static
* @param array $options
* @throws Exception
* @return Database
* @return
*/
public static function getInstance(array $options)
public function __construct(array $options)
{
// if needed initialize the singleton
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
// set table prefix if given
if (array_key_exists('tbl', $options)) {
self::$_prefix = $options['tbl'];
$this->_prefix = $options['tbl'];
}
// initialize the db connection with new options
@@ -94,16 +78,16 @@ class Database extends AbstractData
$db_tables_exist = true;
// setup type and dabase connection
self::$_type = strtolower(
$this->_type = strtolower(
substr($options['dsn'], 0, strpos($options['dsn'], ':'))
);
// MySQL uses backticks to quote identifiers by default,
// tell it to expect ANSI SQL double quotes
if (self::$_type === 'mysql' && defined('PDO::MYSQL_ATTR_INIT_COMMAND')) {
$options['opt'][PDO::MYSQL_ATTR_INIT_COMMAND] = "SET sql_mode='ANSI_QUOTES'";
if ($this->_type === 'mysql' && defined('PDO::MYSQL_ATTR_INIT_COMMAND')) {
$options['opt'][PDO::MYSQL_ATTR_INIT_COMMAND] = "SET SESSION sql_mode='ANSI_QUOTES'";
}
$tableQuery = self::_getTableQuery(self::$_type);
self::$_db = new PDO(
$tableQuery = $this->_getTableQuery($this->_type);
$this->_db = new PDO(
$options['dsn'],
$options['usr'],
$options['pwd'],
@@ -111,43 +95,41 @@ class Database extends AbstractData
);
// check if the database contains the required tables
$tables = self::$_db->query($tableQuery)->fetchAll(PDO::FETCH_COLUMN, 0);
$tables = $this->_db->query($tableQuery)->fetchAll(PDO::FETCH_COLUMN, 0);
// create paste table if necessary
if (!in_array(self::_sanitizeIdentifier('paste'), $tables)) {
self::_createPasteTable();
if (!in_array($this->_sanitizeIdentifier('paste'), $tables)) {
$this->_createPasteTable();
$db_tables_exist = false;
}
// create comment table if necessary
if (!in_array(self::_sanitizeIdentifier('comment'), $tables)) {
self::_createCommentTable();
if (!in_array($this->_sanitizeIdentifier('comment'), $tables)) {
$this->_createCommentTable();
$db_tables_exist = false;
}
// create config table if necessary
$db_version = Controller::VERSION;
if (!in_array(self::_sanitizeIdentifier('config'), $tables)) {
self::_createConfigTable();
if (!in_array($this->_sanitizeIdentifier('config'), $tables)) {
$this->_createConfigTable();
// if we only needed to create the config table, the DB is older then 0.22
if ($db_tables_exist) {
$db_version = '0.21';
}
} else {
$db_version = self::_getConfig('VERSION');
$db_version = $this->_getConfig('VERSION');
}
// update database structure if necessary
if (version_compare($db_version, Controller::VERSION, '<')) {
self::_upgradeDatabase($db_version);
$this->_upgradeDatabase($db_version);
}
} else {
throw new Exception(
'Missing configuration for key dsn, usr, pwd or opt in the section model_options, please check your configuration file', 6
);
}
return self::$_instance;
}
/**
@@ -160,22 +142,12 @@ class Database extends AbstractData
*/
public function create($pasteid, array $paste)
{
if (
array_key_exists($pasteid, self::$_cache)
) {
if (false !== self::$_cache[$pasteid]) {
return false;
} else {
unset(self::$_cache[$pasteid]);
}
}
$expire_date = 0;
$opendiscussion = $burnafterreading = false;
$attachment = $attachmentname = null;
$meta = $paste['meta'];
$isVersion1 = array_key_exists('data', $paste);
list($createdKey) = self::_getVersionedKeys($isVersion1 ? 1 : 2);
list($createdKey) = $this->_getVersionedKeys($isVersion1 ? 1 : 2);
$created = (int) $meta[$createdKey];
unset($meta[$createdKey], $paste['meta']);
if (array_key_exists('expire_date', $meta)) {
@@ -204,8 +176,8 @@ class Database extends AbstractData
$burnafterreading = $paste['adata'][3];
}
try {
return self::_exec(
'INSERT INTO "' . self::_sanitizeIdentifier('paste') .
return $this->_exec(
'INSERT INTO "' . $this->_sanitizeIdentifier('paste') .
'" VALUES(?,?,?,?,?,?,?,?,?)',
array(
$pasteid,
@@ -233,64 +205,59 @@ class Database extends AbstractData
*/
public function read($pasteid)
{
if (array_key_exists($pasteid, self::$_cache)) {
return self::$_cache[$pasteid];
}
self::$_cache[$pasteid] = false;
try {
$paste = self::_select(
'SELECT * FROM "' . self::_sanitizeIdentifier('paste') .
$row = $this->_select(
'SELECT * FROM "' . $this->_sanitizeIdentifier('paste') .
'" WHERE "dataid" = ?', array($pasteid), true
);
} catch (Exception $e) {
$paste = false;
$row = false;
}
if ($paste === false) {
if ($row === false) {
return false;
}
// create array
$data = Json::decode($paste['data']);
$data = Json::decode($row['data']);
$isVersion2 = array_key_exists('v', $data) && $data['v'] >= 2;
if ($isVersion2) {
self::$_cache[$pasteid] = $data;
list($createdKey) = self::_getVersionedKeys(2);
$paste = $data;
list($createdKey) = $this->_getVersionedKeys(2);
} else {
self::$_cache[$pasteid] = array('data' => $paste['data']);
list($createdKey) = self::_getVersionedKeys(1);
$paste = array('data' => $row['data']);
list($createdKey) = $this->_getVersionedKeys(1);
}
try {
$paste['meta'] = Json::decode($paste['meta']);
$row['meta'] = Json::decode($row['meta']);
} catch (Exception $e) {
$paste['meta'] = array();
$row['meta'] = array();
}
$paste = self::upgradePreV1Format($paste);
self::$_cache[$pasteid]['meta'] = $paste['meta'];
self::$_cache[$pasteid]['meta'][$createdKey] = (int) $paste['postdate'];
$expire_date = (int) $paste['expiredate'];
$row = self::upgradePreV1Format($row);
$paste['meta'] = $row['meta'];
$paste['meta'][$createdKey] = (int) $row['postdate'];
$expire_date = (int) $row['expiredate'];
if ($expire_date > 0) {
self::$_cache[$pasteid]['meta']['expire_date'] = $expire_date;
$paste['meta']['expire_date'] = $expire_date;
}
if ($isVersion2) {
return self::$_cache[$pasteid];
return $paste;
}
// support v1 attachments
if (array_key_exists('attachment', $paste) && strlen($paste['attachment'])) {
self::$_cache[$pasteid]['attachment'] = $paste['attachment'];
if (array_key_exists('attachmentname', $paste) && strlen($paste['attachmentname'])) {
self::$_cache[$pasteid]['attachmentname'] = $paste['attachmentname'];
if (array_key_exists('attachment', $row) && !empty($row['attachment'])) {
$paste['attachment'] = $row['attachment'];
if (array_key_exists('attachmentname', $row) && !empty($row['attachmentname'])) {
$paste['attachmentname'] = $row['attachmentname'];
}
}
if ($paste['opendiscussion']) {
self::$_cache[$pasteid]['meta']['opendiscussion'] = true;
if ($row['opendiscussion']) {
$paste['meta']['opendiscussion'] = true;
}
if ($paste['burnafterreading']) {
self::$_cache[$pasteid]['meta']['burnafterreading'] = true;
if ($row['burnafterreading']) {
$paste['meta']['burnafterreading'] = true;
}
return self::$_cache[$pasteid];
return $paste;
}
/**
@@ -301,19 +268,14 @@ class Database extends AbstractData
*/
public function delete($pasteid)
{
self::_exec(
'DELETE FROM "' . self::_sanitizeIdentifier('paste') .
$this->_exec(
'DELETE FROM "' . $this->_sanitizeIdentifier('paste') .
'" WHERE "dataid" = ?', array($pasteid)
);
self::_exec(
'DELETE FROM "' . self::_sanitizeIdentifier('comment') .
$this->_exec(
'DELETE FROM "' . $this->_sanitizeIdentifier('comment') .
'" WHERE "pasteid" = ?', array($pasteid)
);
if (
array_key_exists($pasteid, self::$_cache)
) {
unset(self::$_cache[$pasteid]);
}
}
/**
@@ -325,12 +287,15 @@ class Database extends AbstractData
*/
public function exists($pasteid)
{
if (
!array_key_exists($pasteid, self::$_cache)
) {
self::$_cache[$pasteid] = $this->read($pasteid);
try {
$row = $this->_select(
'SELECT "dataid" FROM "' . $this->_sanitizeIdentifier('paste') .
'" WHERE "dataid" = ?', array($pasteid), true
);
} catch (Exception $e) {
return false;
}
return (bool) self::$_cache[$pasteid];
return (bool) $row;
}
/**
@@ -352,7 +317,7 @@ class Database extends AbstractData
$version = 2;
$data = Json::encode($comment);
}
list($createdKey, $iconKey) = self::_getVersionedKeys($version);
list($createdKey, $iconKey) = $this->_getVersionedKeys($version);
$meta = $comment['meta'];
unset($comment['meta']);
foreach (array('nickname', $iconKey) as $key) {
@@ -361,8 +326,8 @@ class Database extends AbstractData
}
}
try {
return self::_exec(
'INSERT INTO "' . self::_sanitizeIdentifier('comment') .
return $this->_exec(
'INSERT INTO "' . $this->_sanitizeIdentifier('comment') .
'" VALUES(?,?,?,?,?,?,?)',
array(
$commentid,
@@ -388,8 +353,8 @@ class Database extends AbstractData
*/
public function readComments($pasteid)
{
$rows = self::_select(
'SELECT * FROM "' . self::_sanitizeIdentifier('comment') .
$rows = $this->_select(
'SELECT * FROM "' . $this->_sanitizeIdentifier('comment') .
'" WHERE "pasteid" = ?', array($pasteid)
);
@@ -406,7 +371,7 @@ class Database extends AbstractData
$version = 1;
$comments[$i] = array('data' => $row['data']);
}
list($createdKey, $iconKey) = self::_getVersionedKeys($version);
list($createdKey, $iconKey) = $this->_getVersionedKeys($version);
$comments[$i]['id'] = $row['dataid'];
$comments[$i]['parentid'] = $row['parentid'];
$comments[$i]['meta'] = array($createdKey => (int) $row['postdate']);
@@ -433,8 +398,8 @@ class Database extends AbstractData
public function existsComment($pasteid, $parentid, $commentid)
{
try {
return (bool) self::_select(
'SELECT "dataid" FROM "' . self::_sanitizeIdentifier('comment') .
return (bool) $this->_select(
'SELECT "dataid" FROM "' . $this->_sanitizeIdentifier('comment') .
'" WHERE "pasteid" = ? AND "parentid" = ? AND "dataid" = ?',
array($pasteid, $parentid, $commentid), true
);
@@ -455,15 +420,15 @@ class Database extends AbstractData
public function setValue($value, $namespace, $key = '')
{
if ($namespace === 'traffic_limiter') {
self::$_last_cache[$key] = $value;
$this->_last_cache[$key] = $value;
try {
$value = Json::encode(self::$_last_cache);
$value = Json::encode($this->_last_cache);
} catch (Exception $e) {
return false;
}
}
return self::_exec(
'UPDATE "' . self::_sanitizeIdentifier('config') .
return $this->_exec(
'UPDATE "' . $this->_sanitizeIdentifier('config') .
'" SET "value" = ? WHERE "id" = ?',
array($value, strtoupper($namespace))
);
@@ -483,8 +448,8 @@ class Database extends AbstractData
$value = $this->_getConfig($configKey);
if ($value === '') {
// initialize the row, so that setValue can rely on UPDATE queries
self::_exec(
'INSERT INTO "' . self::_sanitizeIdentifier('config') .
$this->_exec(
'INSERT INTO "' . $this->_sanitizeIdentifier('config') .
'" VALUES(?,?)',
array($configKey, '')
);
@@ -492,7 +457,8 @@ class Database extends AbstractData
// migrate filesystem based salt into database
$file = 'data' . DIRECTORY_SEPARATOR . 'salt.php';
if ($namespace === 'salt' && is_readable($file)) {
$value = Filesystem::getInstance(array('dir' => 'data'))->getValue('salt');
$fs = new Filesystem(array('dir' => 'data'));
$value = $fs->getValue('salt');
$this->setValue($value, 'salt');
@unlink($file);
return $value;
@@ -500,12 +466,12 @@ class Database extends AbstractData
}
if ($value && $namespace === 'traffic_limiter') {
try {
self::$_last_cache = Json::decode($value);
$this->_last_cache = Json::decode($value);
} catch (Exception $e) {
self::$_last_cache = array();
$this->_last_cache = array();
}
if (array_key_exists($key, self::$_last_cache)) {
return self::$_last_cache[$key];
if (array_key_exists($key, $this->_last_cache)) {
return $this->_last_cache[$key];
}
}
return (string) $value;
@@ -520,39 +486,42 @@ class Database extends AbstractData
*/
protected function _getExpiredPastes($batchsize)
{
$pastes = array();
$rows = self::_select(
'SELECT "dataid" FROM "' . self::_sanitizeIdentifier('paste') .
$statement = $this->_db->prepare(
'SELECT "dataid" FROM "' . $this->_sanitizeIdentifier('paste') .
'" WHERE "expiredate" < ? AND "expiredate" != ? ' .
(self::$_type === 'oci' ? 'FETCH NEXT ? ROWS ONLY' : 'LIMIT ?'),
array(time(), 0, $batchsize)
($this->_type === 'oci' ? 'FETCH NEXT ? ROWS ONLY' : 'LIMIT ?')
);
if (is_array($rows) && count($rows)) {
foreach ($rows as $row) {
$pastes[] = $row['dataid'];
}
}
return $pastes;
$statement->execute(array(time(), 0, $batchsize));
return $statement->fetchAll(PDO::FETCH_COLUMN, 0);
}
/**
* @inheritDoc
*/
public function getAllPastes()
{
return $this->_db->query(
'SELECT "dataid" FROM "' . $this->_sanitizeIdentifier('paste') . '"'
)->fetchAll(PDO::FETCH_COLUMN, 0);
}
/**
* execute a statement
*
* @access private
* @static
* @param string $sql
* @param array $params
* @throws PDOException
* @return bool
*/
private static function _exec($sql, array $params)
private function _exec($sql, array $params)
{
$statement = self::$_db->prepare($sql);
$statement = $this->_db->prepare($sql);
foreach ($params as $key => &$parameter) {
$position = $key + 1;
if (is_int($parameter)) {
$statement->bindParam($position, $parameter, PDO::PARAM_INT);
} elseif (strlen($parameter) >= 4000) {
} elseif (is_string($parameter) && strlen($parameter) >= 4000) {
$statement->bindParam($position, $parameter, PDO::PARAM_STR, strlen($parameter));
} else {
$statement->bindParam($position, $parameter);
@@ -567,33 +536,32 @@ class Database extends AbstractData
* run a select statement
*
* @access private
* @static
* @param string $sql
* @param array $params
* @param bool $firstOnly if only the first row should be returned
* @throws PDOException
* @return array|false
*/
private static function _select($sql, array $params, $firstOnly = false)
private function _select($sql, array $params, $firstOnly = false)
{
$statement = self::$_db->prepare($sql);
$statement = $this->_db->prepare($sql);
$statement->execute($params);
if ($firstOnly) {
$result = $statement->fetch(PDO::FETCH_ASSOC);
} elseif (self::$_type === 'oci') {
} elseif ($this->_type === 'oci') {
// workaround for https://bugs.php.net/bug.php?id=46728
$result = array();
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
$result[] = array_map('self::_sanitizeClob', $row);
$result[] = array_map('PrivateBin\Data\Database::_sanitizeClob', $row);
}
} else {
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
}
$statement->closeCursor();
if (self::$_type === 'oci' && is_array($result)) {
if ($this->_type === 'oci' && is_array($result)) {
// returned CLOB values are streams, convert these into strings
$result = $firstOnly ?
array_map('self::_sanitizeClob', $result) :
array_map('PrivateBin\Data\Database::_sanitizeClob', $result) :
$result;
}
return $result;
@@ -603,11 +571,10 @@ class Database extends AbstractData
* get version dependent key names
*
* @access private
* @static
* @param int $version
* @return array
*/
private static function _getVersionedKeys($version)
private function _getVersionedKeys($version)
{
if ($version === 1) {
return array('postdate', 'vizhash');
@@ -619,12 +586,11 @@ class Database extends AbstractData
* get table list query, depending on the database type
*
* @access private
* @static
* @param string $type
* @throws Exception
* @return string
*/
private static function _getTableQuery($type)
private function _getTableQuery($type)
{
switch ($type) {
case 'ibm':
@@ -675,15 +641,14 @@ class Database extends AbstractData
* get a value by key from the config table
*
* @access private
* @static
* @param string $key
* @return string
*/
private static function _getConfig($key)
private function _getConfig($key)
{
try {
$row = self::_select(
'SELECT "value" FROM "' . self::_sanitizeIdentifier('config') .
$row = $this->_select(
'SELECT "value" FROM "' . $this->_sanitizeIdentifier('config') .
'" WHERE "id" = ?', array($key), true
);
} catch (PDOException $e) {
@@ -696,14 +661,13 @@ class Database extends AbstractData
* get the primary key clauses, depending on the database driver
*
* @access private
* @static
* @param string $key
* @return array
*/
private static function _getPrimaryKeyClauses($key = 'dataid')
private function _getPrimaryKeyClauses($key = 'dataid')
{
$main_key = $after_key = '';
switch (self::$_type) {
switch ($this->_type) {
case 'mysql':
case 'oci':
$after_key = ", PRIMARY KEY (\"$key\")";
@@ -721,12 +685,11 @@ class Database extends AbstractData
* PostgreSQL and OCI uses a different API for BLOBs then SQL, hence we use TEXT and CLOB
*
* @access private
* @static
* @return string
*/
private static function _getDataType()
private function _getDataType()
{
switch (self::$_type) {
switch ($this->_type) {
case 'oci':
return 'CLOB';
case 'pgsql':
@@ -742,12 +705,11 @@ class Database extends AbstractData
* PostgreSQL and OCI use different APIs for BLOBs then SQL, hence we use TEXT and CLOB
*
* @access private
* @static
* @return string
*/
private static function _getAttachmentType()
private function _getAttachmentType()
{
switch (self::$_type) {
switch ($this->_type) {
case 'oci':
return 'CLOB';
case 'pgsql':
@@ -763,12 +725,11 @@ class Database extends AbstractData
* OCI doesn't accept TEXT so it has to be VARCHAR2(4000)
*
* @access private
* @static
* @return string
*/
private static function _getMetaType()
private function _getMetaType()
{
switch (self::$_type) {
switch ($this->_type) {
case 'oci':
return 'VARCHAR2(4000)';
default:
@@ -780,16 +741,15 @@ class Database extends AbstractData
* create the paste table
*
* @access private
* @static
*/
private static function _createPasteTable()
private function _createPasteTable()
{
list($main_key, $after_key) = self::_getPrimaryKeyClauses();
$dataType = self::_getDataType();
$attachmentType = self::_getAttachmentType();
$metaType = self::_getMetaType();
self::$_db->exec(
'CREATE TABLE "' . self::_sanitizeIdentifier('paste') . '" ( ' .
list($main_key, $after_key) = $this->_getPrimaryKeyClauses();
$dataType = $this->_getDataType();
$attachmentType = $this->_getAttachmentType();
$metaType = $this->_getMetaType();
$this->_db->exec(
'CREATE TABLE "' . $this->_sanitizeIdentifier('paste') . '" ( ' .
"\"dataid\" CHAR(16) NOT NULL$main_key, " .
"\"data\" $attachmentType, " .
'"postdate" INT, ' .
@@ -806,14 +766,13 @@ class Database extends AbstractData
* create the paste table
*
* @access private
* @static
*/
private static function _createCommentTable()
private function _createCommentTable()
{
list($main_key, $after_key) = self::_getPrimaryKeyClauses();
$dataType = self::_getDataType();
self::$_db->exec(
'CREATE TABLE "' . self::_sanitizeIdentifier('comment') . '" ( ' .
list($main_key, $after_key) = $this->_getPrimaryKeyClauses();
$dataType = $this->_getDataType();
$this->_db->exec(
'CREATE TABLE "' . $this->_sanitizeIdentifier('comment') . '" ( ' .
"\"dataid\" CHAR(16) NOT NULL$main_key, " .
'"pasteid" CHAR(16), ' .
'"parentid" CHAR(16), ' .
@@ -822,24 +781,26 @@ class Database extends AbstractData
"\"vizhash\" $dataType, " .
"\"postdate\" INT$after_key )"
);
if (self::$_type === 'oci') {
self::$_db->exec(
if ($this->_type === 'oci') {
$this->_db->exec(
'declare
already_exists exception;
columns_indexed exception;
pragma exception_init( already_exists, -955 );
pragma exception_init(columns_indexed, -1408);
begin
execute immediate \'create index "comment_parent" on "' . self::_sanitizeIdentifier('comment') . '" ("pasteid")\';
execute immediate \'create index "comment_parent" on "' . $this->_sanitizeIdentifier('comment') . '" ("pasteid")\';
exception
when already_exists or columns_indexed then
NULL;
end;'
);
} else {
self::$_db->exec(
'CREATE INDEX IF NOT EXISTS "comment_parent" ON "' .
self::_sanitizeIdentifier('comment') . '" ("pasteid")'
// CREATE INDEX IF NOT EXISTS not supported as of Oracle MySQL <= 8.0
$this->_db->exec(
'CREATE INDEX "' .
$this->_sanitizeIdentifier('comment_parent') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("pasteid")'
);
}
}
@@ -848,19 +809,18 @@ class Database extends AbstractData
* create the paste table
*
* @access private
* @static
*/
private static function _createConfigTable()
private function _createConfigTable()
{
list($main_key, $after_key) = self::_getPrimaryKeyClauses('id');
$charType = self::$_type === 'oci' ? 'VARCHAR2(16)' : 'CHAR(16)';
$textType = self::_getMetaType();
self::$_db->exec(
'CREATE TABLE "' . self::_sanitizeIdentifier('config') .
list($main_key, $after_key) = $this->_getPrimaryKeyClauses('id');
$charType = $this->_type === 'oci' ? 'VARCHAR2(16)' : 'CHAR(16)';
$textType = $this->_getMetaType();
$this->_db->exec(
'CREATE TABLE "' . $this->_sanitizeIdentifier('config') .
"\" ( \"id\" $charType NOT NULL$main_key, \"value\" $textType$after_key )"
);
self::_exec(
'INSERT INTO "' . self::_sanitizeIdentifier('config') .
$this->_exec(
'INSERT INTO "' . $this->_sanitizeIdentifier('config') .
'" VALUES(?,?)',
array('VERSION', Controller::VERSION)
);
@@ -888,86 +848,88 @@ class Database extends AbstractData
* sanitizes identifiers
*
* @access private
* @static
* @param string $identifier
* @return string
*/
private static function _sanitizeIdentifier($identifier)
private function _sanitizeIdentifier($identifier)
{
return preg_replace('/[^A-Za-z0-9_]+/', '', self::$_prefix . $identifier);
return preg_replace('/[^A-Za-z0-9_]+/', '', $this->_prefix . $identifier);
}
/**
* upgrade the database schema from an old version
*
* @access private
* @static
* @param string $oldversion
*/
private static function _upgradeDatabase($oldversion)
private function _upgradeDatabase($oldversion)
{
$dataType = self::_getDataType();
$attachmentType = self::_getAttachmentType();
$dataType = $this->_getDataType();
$attachmentType = $this->_getAttachmentType();
switch ($oldversion) {
case '0.21':
// create the meta column if necessary (pre 0.21 change)
try {
self::$_db->exec(
'SELECT "meta" FROM "' . self::_sanitizeIdentifier('paste') . '" ' .
(self::$_type === 'oci' ? 'FETCH NEXT 1 ROWS ONLY' : 'LIMIT 1')
$this->_db->exec(
'SELECT "meta" FROM "' . $this->_sanitizeIdentifier('paste') . '" ' .
($this->_type === 'oci' ? 'FETCH NEXT 1 ROWS ONLY' : 'LIMIT 1')
);
} catch (PDOException $e) {
self::$_db->exec('ALTER TABLE "' . self::_sanitizeIdentifier('paste') . '" ADD COLUMN "meta" TEXT');
$this->_db->exec('ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . '" ADD COLUMN "meta" TEXT');
}
// SQLite only allows one ALTER statement at a time...
self::$_db->exec(
'ALTER TABLE "' . self::_sanitizeIdentifier('paste') .
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" ADD COLUMN \"attachment\" $attachmentType"
);
self::$_db->exec(
'ALTER TABLE "' . self::_sanitizeIdentifier('paste') . "\" ADD COLUMN \"attachmentname\" $dataType"
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . "\" ADD COLUMN \"attachmentname\" $dataType"
);
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB, so there is no need to change it there
if (self::$_type !== 'sqlite') {
self::$_db->exec(
'ALTER TABLE "' . self::_sanitizeIdentifier('paste') .
if ($this->_type !== 'sqlite') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType"
);
self::$_db->exec(
'ALTER TABLE "' . self::_sanitizeIdentifier('comment') .
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('comment') .
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType, " .
"MODIFY COLUMN \"nickname\" $dataType, MODIFY COLUMN \"vizhash\" $dataType"
);
} else {
self::$_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "paste_dataid" ON "' .
self::_sanitizeIdentifier('paste') . '" ("dataid")'
$this->_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('paste_dataid') . '" ON "' .
$this->_sanitizeIdentifier('paste') . '" ("dataid")'
);
self::$_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "comment_dataid" ON "' .
self::_sanitizeIdentifier('comment') . '" ("dataid")'
$this->_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('comment_dataid') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("dataid")'
);
}
self::$_db->exec(
'CREATE INDEX IF NOT EXISTS "comment_parent" ON "' .
self::_sanitizeIdentifier('comment') . '" ("pasteid")'
// CREATE INDEX IF NOT EXISTS not supported as of Oracle MySQL <= 8.0
$this->_db->exec(
'CREATE INDEX "' .
$this->_sanitizeIdentifier('comment_parent') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("pasteid")'
);
// 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') .
if ($this->_type !== 'sqlite' && $this->_type !== 'pgsql') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" MODIFY COLUMN \"data\" $attachmentType"
);
}
// no break, continue with updates for all newer versions
default:
self::_exec(
'UPDATE "' . self::_sanitizeIdentifier('config') .
$this->_exec(
'UPDATE "' . $this->_sanitizeIdentifier('config') .
'" SET "value" = ? WHERE "id" = ?',
array(Controller::VERSION, 'VERSION')
);

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin\Data;
@@ -22,6 +22,22 @@ use PrivateBin\Json;
*/
class Filesystem extends AbstractData
{
/**
* glob() pattern of the two folder levels and the paste files under the
* configured path. Needs to return both files with and without .php suffix,
* so they can be hardened by _prependRename(), which is hooked into exists().
*
* > Note that wildcard patterns are not regular expressions, although they
* > are a bit similar.
*
* @link https://man7.org/linux/man-pages/man7/glob.7.html
* @const string
*/
const PASTE_FILE_PATTERN = DIRECTORY_SEPARATOR . '[a-f0-9][a-f0-9]' .
DIRECTORY_SEPARATOR . '[a-f0-9][a-f0-9]' . DIRECTORY_SEPARATOR .
'[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]' .
'[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]*';
/**
* first line in paste or comment files, to protect their contents from browsing exposed data directories
*
@@ -40,33 +56,26 @@ class Filesystem extends AbstractData
* path in which to persist something
*
* @access private
* @static
* @var string
*/
private static $_path = 'data';
private $_path = 'data';
/**
* get instance of singleton
* instantiates a new Filesystem data backend
*
* @access public
* @static
* @param array $options
* @return Filesystem
* @return
*/
public static function getInstance(array $options)
public function __construct(array $options)
{
// if needed initialize the singleton
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
// if given update the data directory
if (
is_array($options) &&
array_key_exists('dir', $options)
) {
self::$_path = $options['dir'];
$this->_path = $options['dir'];
}
return self::$_instance;
}
/**
@@ -79,7 +88,7 @@ class Filesystem extends AbstractData
*/
public function create($pasteid, array $paste)
{
$storagedir = self::_dataid2path($pasteid);
$storagedir = $this->_dataid2path($pasteid);
$file = $storagedir . $pasteid . '.php';
if (is_file($file)) {
return false;
@@ -87,7 +96,7 @@ class Filesystem extends AbstractData
if (!is_dir($storagedir)) {
mkdir($storagedir, 0700, true);
}
return self::_store($file, $paste);
return $this->_store($file, $paste);
}
/**
@@ -101,7 +110,7 @@ class Filesystem extends AbstractData
{
if (
!$this->exists($pasteid) ||
!$paste = self::_get(self::_dataid2path($pasteid) . $pasteid . '.php')
!$paste = $this->_get($this->_dataid2path($pasteid) . $pasteid . '.php')
) {
return false;
}
@@ -116,7 +125,7 @@ class Filesystem extends AbstractData
*/
public function delete($pasteid)
{
$pastedir = self::_dataid2path($pasteid);
$pastedir = $this->_dataid2path($pasteid);
if (is_dir($pastedir)) {
// Delete the paste itself.
if (is_file($pastedir . $pasteid . '.php')) {
@@ -124,7 +133,7 @@ class Filesystem extends AbstractData
}
// Delete discussion if it exists.
$discdir = self::_dataid2discussionpath($pasteid);
$discdir = $this->_dataid2discussionpath($pasteid);
if (is_dir($discdir)) {
// Delete all files in discussion directory
$dir = dir($discdir);
@@ -148,20 +157,20 @@ class Filesystem extends AbstractData
*/
public function exists($pasteid)
{
$basePath = self::_dataid2path($pasteid) . $pasteid;
$basePath = $this->_dataid2path($pasteid) . $pasteid;
$pastePath = $basePath . '.php';
// convert to PHP protected files if needed
if (is_readable($basePath)) {
self::_prependRename($basePath, $pastePath);
$this->_prependRename($basePath, $pastePath);
// convert comments, too
$discdir = self::_dataid2discussionpath($pasteid);
$discdir = $this->_dataid2discussionpath($pasteid);
if (is_dir($discdir)) {
$dir = dir($discdir);
while (false !== ($filename = $dir->read())) {
if (substr($filename, -4) !== '.php' && strlen($filename) >= 16) {
$commentFilename = $discdir . $filename . '.php';
self::_prependRename($discdir . $filename, $commentFilename);
$this->_prependRename($discdir . $filename, $commentFilename);
}
}
$dir->close();
@@ -182,7 +191,7 @@ class Filesystem extends AbstractData
*/
public function createComment($pasteid, $parentid, $commentid, array $comment)
{
$storagedir = self::_dataid2discussionpath($pasteid);
$storagedir = $this->_dataid2discussionpath($pasteid);
$file = $storagedir . $pasteid . '.' . $commentid . '.' . $parentid . '.php';
if (is_file($file)) {
return false;
@@ -190,7 +199,7 @@ class Filesystem extends AbstractData
if (!is_dir($storagedir)) {
mkdir($storagedir, 0700, true);
}
return self::_store($file, $comment);
return $this->_store($file, $comment);
}
/**
@@ -203,7 +212,7 @@ class Filesystem extends AbstractData
public function readComments($pasteid)
{
$comments = array();
$discdir = self::_dataid2discussionpath($pasteid);
$discdir = $this->_dataid2discussionpath($pasteid);
if (is_dir($discdir)) {
$dir = dir($discdir);
while (false !== ($filename = $dir->read())) {
@@ -212,14 +221,19 @@ class Filesystem extends AbstractData
// - commentid is the comment identifier itself.
// - parentid is the comment this comment replies to (It can be pasteid)
if (is_file($discdir . $filename)) {
$comment = self::_get($discdir . $filename);
$comment = $this->_get($discdir . $filename);
$items = explode('.', $filename);
// Add some meta information not contained in file.
$comment['id'] = $items[1];
$comment['parentid'] = $items[2];
// Store in array
$key = $this->getOpenSlot($comments, (int) $comment['meta']['created']);
$key = $this->getOpenSlot(
$comments,
(int) array_key_exists('created', $comment['meta']) ?
$comment['meta']['created'] : // v2 comments
$comment['meta']['postdate'] // v1 comments
);
$comments[$key] = $comment;
}
}
@@ -243,7 +257,7 @@ class Filesystem extends AbstractData
public function existsComment($pasteid, $parentid, $commentid)
{
return is_file(
self::_dataid2discussionpath($pasteid) .
$this->_dataid2discussionpath($pasteid) .
$pasteid . '.' . $commentid . '.' . $parentid . '.php'
);
}
@@ -261,20 +275,20 @@ class Filesystem extends AbstractData
{
switch ($namespace) {
case 'purge_limiter':
return self::_storeString(
self::$_path . DIRECTORY_SEPARATOR . 'purge_limiter.php',
return $this->_storeString(
$this->_path . DIRECTORY_SEPARATOR . 'purge_limiter.php',
'<?php' . PHP_EOL . '$GLOBALS[\'purge_limiter\'] = ' . $value . ';'
);
case 'salt':
return self::_storeString(
self::$_path . DIRECTORY_SEPARATOR . 'salt.php',
return $this->_storeString(
$this->_path . DIRECTORY_SEPARATOR . 'salt.php',
'<?php # |' . $value . '|'
);
case 'traffic_limiter':
self::$_last_cache[$key] = $value;
return self::_storeString(
self::$_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php',
'<?php' . PHP_EOL . '$GLOBALS[\'traffic_limiter\'] = ' . var_export(self::$_last_cache, true) . ';'
$this->_last_cache[$key] = $value;
return $this->_storeString(
$this->_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php',
'<?php' . PHP_EOL . '$GLOBALS[\'traffic_limiter\'] = ' . var_export($this->_last_cache, true) . ';'
);
}
return false;
@@ -292,14 +306,14 @@ class Filesystem extends AbstractData
{
switch ($namespace) {
case 'purge_limiter':
$file = self::$_path . DIRECTORY_SEPARATOR . 'purge_limiter.php';
$file = $this->_path . DIRECTORY_SEPARATOR . 'purge_limiter.php';
if (is_readable($file)) {
require $file;
return $GLOBALS['purge_limiter'];
}
break;
case 'salt':
$file = self::$_path . DIRECTORY_SEPARATOR . 'salt.php';
$file = $this->_path . DIRECTORY_SEPARATOR . 'salt.php';
if (is_readable($file)) {
$items = explode('|', file_get_contents($file));
if (is_array($items) && count($items) == 3) {
@@ -308,12 +322,12 @@ class Filesystem extends AbstractData
}
break;
case 'traffic_limiter':
$file = self::$_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php';
$file = $this->_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php';
if (is_readable($file)) {
require $file;
self::$_last_cache = $GLOBALS['traffic_limiter'];
if (array_key_exists($key, self::$_last_cache)) {
return self::$_last_cache[$key];
$this->_last_cache = $GLOBALS['traffic_limiter'];
if (array_key_exists($key, $this->_last_cache)) {
return $this->_last_cache[$key];
}
}
break;
@@ -325,11 +339,10 @@ class Filesystem extends AbstractData
* get the data
*
* @access public
* @static
* @param string $filename
* @return array|false $data
*/
private static function _get($filename)
private function _get($filename)
{
return Json::decode(
substr(
@@ -348,65 +361,42 @@ class Filesystem extends AbstractData
*/
protected function _getExpiredPastes($batchsize)
{
$pastes = array();
$firstLevel = array_filter(
scandir(self::$_path),
'self::_isFirstLevelDir'
);
if (count($firstLevel) > 0) {
// try at most 10 times the $batchsize pastes before giving up
for ($i = 0, $max = $batchsize * 10; $i < $max; ++$i) {
$firstKey = array_rand($firstLevel);
$secondLevel = array_filter(
scandir(self::$_path . DIRECTORY_SEPARATOR . $firstLevel[$firstKey]),
'self::_isSecondLevelDir'
);
// skip this folder in the next checks if it is empty
if (count($secondLevel) == 0) {
unset($firstLevel[$firstKey]);
continue;
}
$secondKey = array_rand($secondLevel);
$path = self::$_path . DIRECTORY_SEPARATOR .
$firstLevel[$firstKey] . DIRECTORY_SEPARATOR .
$secondLevel[$secondKey];
if (!is_dir($path)) {
continue;
}
$thirdLevel = array_filter(
array_map(
function ($filename) {
return strlen($filename) >= 20 ?
substr($filename, 0, -4) :
$filename;
},
scandir($path)
),
'PrivateBin\\Model\\Paste::isValidId'
);
if (count($thirdLevel) == 0) {
continue;
}
$thirdKey = array_rand($thirdLevel);
$pasteid = $thirdLevel[$thirdKey];
if (in_array($pasteid, $pastes)) {
continue;
}
if ($this->exists($pasteid)) {
$data = $this->read($pasteid);
if (
array_key_exists('expire_date', $data['meta']) &&
$data['meta']['expire_date'] < time()
) {
$pastes[] = $pasteid;
if (count($pastes) >= $batchsize) {
break;
}
$pastes = array();
$count = 0;
$opened = 0;
$limit = $batchsize * 10; // try at most 10 times $batchsize pastes before giving up
$time = time();
$files = $this->getAllPastes();
shuffle($files);
foreach ($files as $pasteid) {
if ($this->exists($pasteid)) {
$data = $this->read($pasteid);
if (
array_key_exists('expire_date', $data['meta']) &&
$data['meta']['expire_date'] < $time
) {
$pastes[] = $pasteid;
if (++$count >= $batchsize) {
break;
}
}
if (++$opened >= $limit) {
break;
}
}
}
return $pastes;
}
/**
* @inheritDoc
*/
public function getAllPastes()
{
$pastes = array();
foreach (new \GlobIterator($this->_path . self::PASTE_FILE_PATTERN) as $file) {
if ($file->isFile()) {
$pastes[] = $file->getBasename('.php');
}
}
return $pastes;
@@ -423,13 +413,12 @@ class Filesystem extends AbstractData
* eg. input 'e3570978f9e4aa90' --> output 'data/e3/57/'
*
* @access private
* @static
* @param string $dataid
* @return string
*/
private static function _dataid2path($dataid)
private function _dataid2path($dataid)
{
return self::$_path . DIRECTORY_SEPARATOR .
return $this->_path . DIRECTORY_SEPARATOR .
substr($dataid, 0, 2) . DIRECTORY_SEPARATOR .
substr($dataid, 2, 2) . DIRECTORY_SEPARATOR;
}
@@ -440,56 +429,27 @@ class Filesystem extends AbstractData
* eg. input 'e3570978f9e4aa90' --> output 'data/e3/57/e3570978f9e4aa90.discussion/'
*
* @access private
* @static
* @param string $dataid
* @return string
*/
private static function _dataid2discussionpath($dataid)
private function _dataid2discussionpath($dataid)
{
return self::_dataid2path($dataid) . $dataid .
return $this->_dataid2path($dataid) . $dataid .
'.discussion' . DIRECTORY_SEPARATOR;
}
/**
* Check that the given element is a valid first level directory.
*
* @access private
* @static
* @param string $element
* @return bool
*/
private static function _isFirstLevelDir($element)
{
return self::_isSecondLevelDir($element) &&
is_dir(self::$_path . DIRECTORY_SEPARATOR . $element);
}
/**
* Check that the given element is a valid second level directory.
*
* @access private
* @static
* @param string $element
* @return bool
*/
private static function _isSecondLevelDir($element)
{
return (bool) preg_match('/^[a-f0-9]{2}$/', $element);
}
/**
* store the data
*
* @access public
* @static
* @param string $filename
* @param array $data
* @return bool
*/
private static function _store($filename, array $data)
private function _store($filename, array $data)
{
try {
return self::_storeString(
return $this->_storeString(
$filename,
self::PROTECTION_LINE . PHP_EOL . Json::encode($data)
);
@@ -502,20 +462,19 @@ class Filesystem extends AbstractData
* store a string
*
* @access public
* @static
* @param string $filename
* @param string $data
* @return bool
*/
private static function _storeString($filename, $data)
private function _storeString($filename, $data)
{
// Create storage directory if it does not exist.
if (!is_dir(self::$_path)) {
if (!@mkdir(self::$_path, 0700)) {
if (!is_dir($this->_path)) {
if (!@mkdir($this->_path, 0700)) {
return false;
}
}
$file = self::$_path . DIRECTORY_SEPARATOR . '.htaccess';
$file = $this->_path . DIRECTORY_SEPARATOR . '.htaccess';
if (!is_file($file)) {
$writtenBytes = 0;
if ($fileCreated = @touch($file)) {
@@ -553,12 +512,11 @@ class Filesystem extends AbstractData
* rename a file, prepending the protection line at the beginning
*
* @access public
* @static
* @param string $srcFile
* @param string $destFile
* @return void
*/
private static function _prependRename($srcFile, $destFile)
private function _prependRename($srcFile, $destFile)
{
// don't overwrite already converted file
if (!is_readable($destFile)) {

View File

@@ -14,45 +14,43 @@ class GoogleCloudStorage extends AbstractData
* GCS client
*
* @access private
* @static
* @var StorageClient
*/
private static $_client = null;
private $_client = null;
/**
* GCS bucket
*
* @access private
* @static
* @var Bucket
*/
private static $_bucket = null;
private $_bucket = null;
/**
* object prefix
*
* @access private
* @static
* @var string
*/
private static $_prefix = 'pastes';
private $_prefix = 'pastes';
/**
* returns a Google Cloud Storage data backend.
* bucket acl type
*
* @access private
* @var bool
*/
private $_uniformacl = false;
/**
* instantiantes a new Google Cloud Storage data backend.
*
* @access public
* @static
* @param array $options
* @return GoogleCloudStorage
* @return
*/
public static function getInstance(array $options)
public function __construct(array $options)
{
// if needed initialize the singleton
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
$bucket = null;
if (getenv('PRIVATEBIN_GCS_BUCKET')) {
$bucket = getenv('PRIVATEBIN_GCS_BUCKET');
}
@@ -60,21 +58,22 @@ class GoogleCloudStorage extends AbstractData
$bucket = $options['bucket'];
}
if (is_array($options) && array_key_exists('prefix', $options)) {
self::$_prefix = $options['prefix'];
$this->_prefix = $options['prefix'];
}
if (is_array($options) && array_key_exists('uniformacl', $options)) {
$this->_uniformacl = $options['uniformacl'];
}
if (empty(self::$_client)) {
self::$_client = class_exists('StorageClientStub', false) ?
new \StorageClientStub(array()) :
new StorageClient(array('suppressKeyFileNotice' => true));
$this->_client = class_exists('StorageClientStub', false) ?
new \StorageClientStub(array()) :
new StorageClient(array('suppressKeyFileNotice' => true));
if (isset($bucket)) {
$this->_bucket = $this->_client->bucket($bucket);
}
self::$_bucket = self::$_client->bucket($bucket);
return self::$_instance;
}
/**
* returns the google storage object key for $pasteid in self::$_bucket.
* returns the google storage object key for $pasteid in $this->_bucket.
*
* @access private
* @param $pasteid string to get the key for
@@ -82,14 +81,14 @@ class GoogleCloudStorage extends AbstractData
*/
private function _getKey($pasteid)
{
if (self::$_prefix != '') {
return self::$_prefix . '/' . $pasteid;
if ($this->_prefix != '') {
return $this->_prefix . '/' . $pasteid;
}
return $pasteid;
}
/**
* Uploads the payload in the self::$_bucket under the specified key.
* Uploads the payload in the $this->_bucket under the specified key.
* The entire payload is stored as a JSON document. The metadata is replicated
* as the GCS object's metadata except for the fields attachment, attachmentname
* and salt.
@@ -106,17 +105,20 @@ class GoogleCloudStorage extends AbstractData
$metadata[$k] = strval($v);
}
try {
self::$_bucket->upload(Json::encode($payload), array(
$data = array(
'name' => $key,
'chunkSize' => 262144,
'predefinedAcl' => 'private',
'metadata' => array(
'content-type' => 'application/json',
'metadata' => $metadata,
),
));
);
if (!$this->_uniformacl) {
$data['predefinedAcl'] = 'private';
}
$this->_bucket->upload(Json::encode($payload), $data);
} catch (Exception $e) {
error_log('failed to upload ' . $key . ' to ' . self::$_bucket->name() . ', ' .
error_log('failed to upload ' . $key . ' to ' . $this->_bucket->name() . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
@@ -141,13 +143,13 @@ class GoogleCloudStorage extends AbstractData
public function read($pasteid)
{
try {
$o = self::$_bucket->object($this->_getKey($pasteid));
$o = $this->_bucket->object($this->_getKey($pasteid));
$data = $o->downloadAsString();
return Json::decode($data);
} catch (NotFoundException $e) {
return false;
} catch (Exception $e) {
error_log('failed to read ' . $pasteid . ' from ' . self::$_bucket->name() . ', ' .
error_log('failed to read ' . $pasteid . ' from ' . $this->_bucket->name() . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
@@ -161,9 +163,9 @@ class GoogleCloudStorage extends AbstractData
$name = $this->_getKey($pasteid);
try {
foreach (self::$_bucket->objects(array('prefix' => $name . '/discussion/')) as $comment) {
foreach ($this->_bucket->objects(array('prefix' => $name . '/discussion/')) as $comment) {
try {
self::$_bucket->object($comment->name())->delete();
$this->_bucket->object($comment->name())->delete();
} catch (NotFoundException $e) {
// ignore if already deleted.
}
@@ -173,7 +175,7 @@ class GoogleCloudStorage extends AbstractData
}
try {
self::$_bucket->object($name)->delete();
$this->_bucket->object($name)->delete();
} catch (NotFoundException $e) {
// ignore if already deleted
}
@@ -184,7 +186,7 @@ class GoogleCloudStorage extends AbstractData
*/
public function exists($pasteid)
{
$o = self::$_bucket->object($this->_getKey($pasteid));
$o = $this->_bucket->object($this->_getKey($pasteid));
return $o->exists();
}
@@ -208,8 +210,8 @@ class GoogleCloudStorage extends AbstractData
$comments = array();
$prefix = $this->_getKey($pasteid) . '/discussion/';
try {
foreach (self::$_bucket->objects(array('prefix' => $prefix)) as $key) {
$comment = JSON::decode(self::$_bucket->object($key->name())->downloadAsString());
foreach ($this->_bucket->objects(array('prefix' => $prefix)) as $key) {
$comment = JSON::decode($this->_bucket->object($key->name())->downloadAsString());
$comment['id'] = basename($key->name());
$slot = $this->getOpenSlot($comments, (int) $comment['meta']['created']);
$comments[$slot] = $comment;
@@ -226,7 +228,7 @@ class GoogleCloudStorage extends AbstractData
public function existsComment($pasteid, $parentid, $commentid)
{
$name = $this->_getKey($pasteid) . '/discussion/' . $parentid . '/' . $commentid;
$o = self::$_bucket->object($name);
$o = $this->_bucket->object($name);
return $o->exists();
}
@@ -237,7 +239,7 @@ class GoogleCloudStorage extends AbstractData
{
$path = 'config/' . $namespace;
try {
foreach (self::$_bucket->objects(array('prefix' => $path)) as $object) {
foreach ($this->_bucket->objects(array('prefix' => $path)) as $object) {
$name = $object->name();
if (strlen($name) > strlen($path) && substr($name, strlen($path), 1) !== '/') {
continue;
@@ -277,17 +279,20 @@ class GoogleCloudStorage extends AbstractData
$metadata['value'] = strval($value);
}
try {
self::$_bucket->upload($value, array(
$data = array(
'name' => $key,
'chunkSize' => 262144,
'predefinedAcl' => 'private',
'metadata' => array(
'content-type' => 'application/json',
'metadata' => $metadata,
),
));
);
if (!$this->_uniformacl) {
$data['predefinedAcl'] = 'private';
}
$this->_bucket->upload($value, $data);
} catch (Exception $e) {
error_log('failed to set key ' . $key . ' to ' . self::$_bucket->name() . ', ' .
error_log('failed to set key ' . $key . ' to ' . $this->_bucket->name() . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
@@ -305,7 +310,7 @@ class GoogleCloudStorage extends AbstractData
$key = 'config/' . $namespace . '/' . $key;
}
try {
$o = self::$_bucket->object($key);
$o = $this->_bucket->object($key);
return $o->downloadAsString();
} catch (NotFoundException $e) {
return '';
@@ -320,12 +325,12 @@ class GoogleCloudStorage extends AbstractData
$expired = array();
$now = time();
$prefix = self::$_prefix;
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
try {
foreach (self::$_bucket->objects(array('prefix' => $prefix)) as $object) {
foreach ($this->_bucket->objects(array('prefix' => $prefix)) as $object) {
$metadata = $object->info()['metadata'];
if ($metadata != null && array_key_exists('expire_date', $metadata)) {
$expire_at = intval($metadata['expire_date']);
@@ -343,4 +348,28 @@ class GoogleCloudStorage extends AbstractData
}
return $expired;
}
/**
* @inheritDoc
*/
public function getAllPastes()
{
$pastes = array();
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
try {
foreach ($this->_bucket->objects(array('prefix' => $prefix)) as $object) {
$candidate = substr($object->name(), strlen($prefix));
if (strpos($candidate, '/') === false) {
$pastes[] = $candidate;
}
}
} catch (NotFoundException $e) {
// no objects in the bucket yet
}
return $pastes;
}
}

475
lib/Data/S3Storage.php Normal file
View File

@@ -0,0 +1,475 @@
<?php
/**
* S3.php
*
* an S3 compatible data backend for PrivateBin with CEPH/RadosGW in mind
* see https://docs.ceph.com/en/latest/radosgw/s3/php/
* based on lib/Data/GoogleCloudStorage.php from PrivateBin version 1.6.0
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2022 Felix J. Ogris (https://ogris.de/)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.1
*
* Installation:
* 1. Make sure you have composer.lock and composer.json in the document root of your PasteBin
* 2. If not, grab a copy from https://github.com/PrivateBin/PrivateBin
* 3. As non-root user, install the AWS SDK for PHP:
* composer require aws/aws-sdk-php
* (On FreeBSD, install devel/php-composer2 prior, e.g.: make -C /usr/ports/devel/php-composer2 install clean)
* 4. In cfg/conf.php, comment out all [model] and [model_options] settings
* 5. Still in cfg/conf.php, add a new [model] section:
* [model]
* class = S3Storage
* 6. Add a new [model_options] as well, e.g. for a Rados gateway as part of your CEPH cluster:
* [model_options]
* region = ""
* version = "2006-03-01"
* endpoint = "https://s3.my-ceph.invalid"
* use_path_style_endpoint = true
* bucket = "my-bucket"
* prefix = "privatebin" (place all PrivateBin data beneath this prefix)
* accesskey = "my-rados-user"
* secretkey = "my-rados-pass"
*/
namespace PrivateBin\Data;
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
use PrivateBin\Json;
class S3Storage extends AbstractData
{
/**
* S3 client
*
* @access private
* @var S3Client
*/
private $_client = null;
/**
* S3 client options
*
* @access private
* @var array
*/
private $_options = array();
/**
* S3 bucket
*
* @access private
* @var string
*/
private $_bucket = null;
/**
* S3 prefix for all PrivateBin data in this bucket
*
* @access private
* @var string
*/
private $_prefix = '';
/**
* instantiates a new S3 data backend.
*
* @access public
* @param array $options
* @return
*/
public function __construct(array $options)
{
if (is_array($options)) {
// AWS SDK will try to load credentials from environment if credentials are not passed via configuration
// ref: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html#default-credential-chain
if (isset($options['accesskey']) && isset($options['secretkey'])) {
$this->_options['credentials'] = array();
$this->_options['credentials']['key'] = $options['accesskey'];
$this->_options['credentials']['secret'] = $options['secretkey'];
}
if (array_key_exists('region', $options)) {
$this->_options['region'] = $options['region'];
}
if (array_key_exists('version', $options)) {
$this->_options['version'] = $options['version'];
}
if (array_key_exists('endpoint', $options)) {
$this->_options['endpoint'] = $options['endpoint'];
}
if (array_key_exists('use_path_style_endpoint', $options)) {
$this->_options['use_path_style_endpoint'] = filter_var($options['use_path_style_endpoint'], FILTER_VALIDATE_BOOLEAN);
}
if (array_key_exists('bucket', $options)) {
$this->_bucket = $options['bucket'];
}
if (array_key_exists('prefix', $options)) {
$this->_prefix = $options['prefix'];
}
}
$this->_client = new S3Client($this->_options);
}
/**
* returns all objects in the given prefix.
*
* @access private
* @param $prefix string with prefix
* @return array all objects in the given prefix
*/
private function _listAllObjects($prefix)
{
$allObjects = array();
$options = array(
'Bucket' => $this->_bucket,
'Prefix' => $prefix,
);
do {
$objectsListResponse = $this->_client->listObjects($options);
$objects = $objectsListResponse['Contents'] ?? array();
foreach ($objects as $object) {
$allObjects[] = $object;
$options['Marker'] = $object['Key'];
}
} while ($objectsListResponse['IsTruncated']);
return $allObjects;
}
/**
* returns the S3 storage object key for $pasteid in $this->_bucket.
*
* @access private
* @param $pasteid string to get the key for
* @return string
*/
private function _getKey($pasteid)
{
if ($this->_prefix != '') {
return $this->_prefix . '/' . $pasteid;
}
return $pasteid;
}
/**
* Uploads the payload in the $this->_bucket under the specified key.
* The entire payload is stored as a JSON document. The metadata is replicated
* as the S3 object's metadata except for the fields attachment, attachmentname
* and salt.
*
* @param $key string to store the payload under
* @param $payload array to store
* @return bool true if successful, otherwise false.
*/
private function _upload($key, $payload)
{
$metadata = array_key_exists('meta', $payload) ? $payload['meta'] : array();
unset($metadata['attachment'], $metadata['attachmentname'], $metadata['salt']);
foreach ($metadata as $k => $v) {
$metadata[$k] = strval($v);
}
try {
$this->_client->putObject(array(
'Bucket' => $this->_bucket,
'Key' => $key,
'Body' => Json::encode($payload),
'ContentType' => 'application/json',
'Metadata' => $metadata,
));
} catch (S3Exception $e) {
error_log('failed to upload ' . $key . ' to ' . $this->_bucket . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
return true;
}
/**
* @inheritDoc
*/
public function create($pasteid, array $paste)
{
if ($this->exists($pasteid)) {
return false;
}
return $this->_upload($this->_getKey($pasteid), $paste);
}
/**
* @inheritDoc
*/
public function read($pasteid)
{
try {
$object = $this->_client->getObject(array(
'Bucket' => $this->_bucket,
'Key' => $this->_getKey($pasteid),
));
$data = $object['Body']->getContents();
return Json::decode($data);
} catch (S3Exception $e) {
error_log('failed to read ' . $pasteid . ' from ' . $this->_bucket . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
}
/**
* @inheritDoc
*/
public function delete($pasteid)
{
$name = $this->_getKey($pasteid);
try {
$comments = $this->_listAllObjects($name . '/discussion/');
foreach ($comments as $comment) {
try {
$this->_client->deleteObject(array(
'Bucket' => $this->_bucket,
'Key' => $comment['Key'],
));
} catch (S3Exception $e) {
// ignore if already deleted.
}
}
} catch (S3Exception $e) {
// there are no discussions associated with the paste
}
try {
$this->_client->deleteObject(array(
'Bucket' => $this->_bucket,
'Key' => $name,
));
} catch (S3Exception $e) {
// ignore if already deleted
}
}
/**
* @inheritDoc
*/
public function exists($pasteid)
{
return $this->_client->doesObjectExistV2($this->_bucket, $this->_getKey($pasteid));
}
/**
* @inheritDoc
*/
public function createComment($pasteid, $parentid, $commentid, array $comment)
{
if ($this->existsComment($pasteid, $parentid, $commentid)) {
return false;
}
$key = $this->_getKey($pasteid) . '/discussion/' . $parentid . '/' . $commentid;
return $this->_upload($key, $comment);
}
/**
* @inheritDoc
*/
public function readComments($pasteid)
{
$comments = array();
$prefix = $this->_getKey($pasteid) . '/discussion/';
try {
$entries = $this->_listAllObjects($prefix);
foreach ($entries as $entry) {
$object = $this->_client->getObject(array(
'Bucket' => $this->_bucket,
'Key' => $entry['Key'],
));
$body = JSON::decode($object['Body']->getContents());
$items = explode('/', $entry['Key']);
$body['id'] = $items[3];
$body['parentid'] = $items[2];
$slot = $this->getOpenSlot($comments, (int) $object['Metadata']['created']);
$comments[$slot] = $body;
}
} catch (S3Exception $e) {
// no comments found
}
return $comments;
}
/**
* @inheritDoc
*/
public function existsComment($pasteid, $parentid, $commentid)
{
$name = $this->_getKey($pasteid) . '/discussion/' . $parentid . '/' . $commentid;
return $this->_client->doesObjectExistV2($this->_bucket, $name);
}
/**
* @inheritDoc
*/
public function purgeValues($namespace, $time)
{
$path = $this->_prefix;
if ($path != '') {
$path .= '/';
}
$path .= 'config/' . $namespace;
try {
foreach ($this->_listAllObjects($path) as $object) {
$name = $object['Key'];
if (strlen($name) > strlen($path) && substr($name, strlen($path), 1) !== '/') {
continue;
}
$head = $this->_client->headObject(array(
'Bucket' => $this->_bucket,
'Key' => $name,
));
if ($head->get('Metadata') != null && array_key_exists('value', $head->get('Metadata'))) {
$value = $head->get('Metadata')['value'];
if (is_numeric($value) && intval($value) < $time) {
try {
$this->_client->deleteObject(array(
'Bucket' => $this->_bucket,
'Key' => $name,
));
} catch (S3Exception $e) {
// deleted by another instance.
}
}
}
}
} catch (S3Exception $e) {
// no objects in the bucket yet
}
}
/**
* For S3, the value will also be stored in the metadata for the
* namespaces traffic_limiter and purge_limiter.
* @inheritDoc
*/
public function setValue($value, $namespace, $key = '')
{
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
if ($key === '') {
$key = $prefix . 'config/' . $namespace;
} else {
$key = $prefix . 'config/' . $namespace . '/' . $key;
}
$metadata = array('namespace' => $namespace);
if ($namespace != 'salt') {
$metadata['value'] = strval($value);
}
try {
$this->_client->putObject(array(
'Bucket' => $this->_bucket,
'Key' => $key,
'Body' => $value,
'ContentType' => 'application/json',
'Metadata' => $metadata,
));
} catch (S3Exception $e) {
error_log('failed to set key ' . $key . ' to ' . $this->_bucket . ', ' .
trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
return false;
}
return true;
}
/**
* @inheritDoc
*/
public function getValue($namespace, $key = '')
{
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
if ($key === '') {
$key = $prefix . 'config/' . $namespace;
} else {
$key = $prefix . 'config/' . $namespace . '/' . $key;
}
try {
$object = $this->_client->getObject(array(
'Bucket' => $this->_bucket,
'Key' => $key,
));
return $object['Body']->getContents();
} catch (S3Exception $e) {
return '';
}
}
/**
* @inheritDoc
*/
protected function _getExpiredPastes($batchsize)
{
$expired = array();
$now = time();
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
try {
foreach ($this->_listAllObjects($prefix) as $object) {
$head = $this->_client->headObject(array(
'Bucket' => $this->_bucket,
'Key' => $object['Key'],
));
if ($head->get('Metadata') != null && array_key_exists('expire_date', $head->get('Metadata'))) {
$expire_at = intval($head->get('Metadata')['expire_date']);
if ($expire_at != 0 && $expire_at < $now) {
array_push($expired, $object['Key']);
}
}
if (count($expired) > $batchsize) {
break;
}
}
} catch (S3Exception $e) {
// no objects in the bucket yet
}
return $expired;
}
/**
* @inheritDoc
*/
public function getAllPastes()
{
$pastes = array();
$prefix = $this->_prefix;
if ($prefix != '') {
$prefix .= '/';
}
try {
foreach ($this->_listAllObjects($prefix) as $object) {
$candidate = substr($object['Key'], strlen($prefix));
if (strpos($candidate, '/') === false) {
$pastes[] = $candidate;
}
}
} catch (S3Exception $e) {
// no objects in the bucket yet
}
return $pastes;
}
}

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin;
@@ -66,6 +66,6 @@ class Filter
$size = $size / 1024;
++$i;
}
return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]);
return number_format($size, $i ? 2 : 0, '.', ' ') . ' ' . I18n::_($iec[$i]);
}
}

View File

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

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin;
@@ -84,7 +84,7 @@ class I18n
*/
public static function _($messageId)
{
return forward_static_call_array('self::translate', func_get_args());
return forward_static_call_array('PrivateBin\I18n::translate', func_get_args());
}
/**
@@ -315,30 +315,36 @@ class I18n
protected static function _getPluralForm($n)
{
switch (self::$_language) {
case 'ar':
return $n === 0 ? 0 : ($n === 1 ? 1 : ($n === 2 ? 2 : ($n % 100 >= 3 && $n % 100 <= 10 ? 3 : ($n % 100 >= 11 ? 4 : 5))));
case 'cs':
return $n == 1 ? 0 : ($n >= 2 && $n <= 4 ? 1 : 2);
case 'sk':
return $n === 1 ? 0 : ($n >= 2 && $n <= 4 ? 1 : 2);
case 'co':
case 'fr':
case 'oc':
case 'tr':
case 'zh':
return $n > 1 ? 1 : 0;
case 'he':
return $n === 1 ? 0 : ($n === 2 ? 1 : (($n < 0 || $n > 10) && ($n % 10 === 0) ? 2 : 3));
case 'id':
case 'ja':
case 'jbo':
case 'th':
return 0;
case 'lt':
return $n % 10 === 1 && $n % 100 !== 11 ? 0 : (($n % 10 >= 2 && $n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
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 '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':
return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0));
// bg, ca, de, en, es, et, fi, hu, it, nl, no, pt
return $n % 100 === 1 ? 1 : ($n % 100 === 2 ? 2 : ($n % 100 === 3 || $n % 100 === 4 ? 3 : 0));
default:
return $n != 1 ? 1 : 0;
// bg, ca, de, el, en, es, et, fi, hu, it, nl, no, pt
return $n !== 1 ? 1 : 0;
}
}

View File

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

View File

@@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin;
@@ -81,10 +81,8 @@ class Model
public function getStore()
{
if ($this->_store === null) {
$this->_store = forward_static_call(
'PrivateBin\\Data\\' . $this->_conf->getKey('class', 'model') . '::getInstance',
$this->_conf->getSection('model_options')
);
$class = 'PrivateBin\\Data\\' . $this->_conf->getKey('class', 'model');
$this->_store = new $class($this->_conf->getSection('model_options'));
}
return $this->_store;
}

View File

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

View File

@@ -7,13 +7,14 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.0
* @version 1.6.0
*/
namespace PrivateBin\Model;
use Exception;
use Identicon\Identicon;
use Jdenticon\Identicon as Jdenticon;
use PrivateBin\Persistence\TrafficLimiter;
use PrivateBin\Vizhash16x16;
@@ -167,6 +168,16 @@ class Comment extends AbstractModel
if ($icon == 'identicon') {
$identicon = new Identicon();
$pngdata = $identicon->getImageDataUri($hmac, 16);
} elseif ($icon == 'jdenticon') {
$jdenticon = new Jdenticon(array(
'hash' => $hmac,
'size' => 16,
'style' => array(
'backgroundColor' => '#fff0', // fully transparent, for dark mode
'padding' => 0,
),
));
$pngdata = $jdenticon->getImageDataUri('png');
} elseif ($icon == 'vizhash') {
$vh = new Vizhash16x16();
$pngdata = 'data:image/png;base64,' . base64_encode(

View File

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

View File

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

View File

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

View File

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

View File

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

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