init web ems all
This commit is contained in:
23
phpMyAdmin/vendor/phpmyadmin/motranslator/.github/stale.yml
vendored
Executable file
23
phpMyAdmin/vendor/phpmyadmin/motranslator/.github/stale.yml
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
daysUntilStale: 60
|
||||
# Number of days of inactivity before a stale Issue or Pull Request is closed
|
||||
daysUntilClose: 7
|
||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
||||
exemptLabels:
|
||||
- pinned
|
||||
- security
|
||||
# Label to use when marking as stale
|
||||
staleLabel: wontfix
|
||||
# Comment to post when marking as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when removing the stale label. Set to `false` to disable
|
||||
unmarkComment: false
|
||||
# Comment to post when closing a stale Issue or Pull Request. Set to `false` to disable
|
||||
closeComment: false
|
||||
# Limit to only `issues` or `pulls`
|
||||
only: pulls
|
||||
86
phpMyAdmin/vendor/phpmyadmin/motranslator/CHANGES.md
vendored
Executable file
86
phpMyAdmin/vendor/phpmyadmin/motranslator/CHANGES.md
vendored
Executable file
@@ -0,0 +1,86 @@
|
||||
# Version 4.0
|
||||
|
||||
* Released on 2018-02-12.
|
||||
* The library no longer changes system locales.
|
||||
|
||||
# Version 3.4
|
||||
|
||||
* Released on 2017-12-15.
|
||||
* Added Translator::setTranslation method.
|
||||
|
||||
# Version 3.3
|
||||
|
||||
* Released on 2017-06-01.
|
||||
* Add support for switching locales for Loader instance.
|
||||
|
||||
# Version 3.2
|
||||
|
||||
* Released on 2017-05-23.
|
||||
* Various fixes when handling corrupted mo files.
|
||||
|
||||
# Version 3.1
|
||||
|
||||
* Released on 2017-05-15.
|
||||
* Documentation improvements.
|
||||
|
||||
# Version 3.0
|
||||
|
||||
* Released on 2017-01-23.
|
||||
* All classes moved to the PhpMyAdmin namespace.
|
||||
|
||||
# Version 2.2
|
||||
|
||||
* Released on 2017-01-07.
|
||||
* Coding style cleanup.
|
||||
* Avoid installing tests using composer.
|
||||
|
||||
# Version 2.1
|
||||
|
||||
* Released on 2016-12-21.
|
||||
* Various code cleanups.
|
||||
* Added support for PHP 5.3.
|
||||
|
||||
# Version 2.0
|
||||
|
||||
* Released on 2016-10-13.
|
||||
* Consistently use camelCase in API.
|
||||
* No more relies on using eval().
|
||||
* Depends on symfony/expression-language for calculations.
|
||||
|
||||
# Version 1.2
|
||||
|
||||
* Released on 2016-09-22.
|
||||
* Stricter validation of plural expression.
|
||||
|
||||
# Version 1.1
|
||||
|
||||
* Released on 2016-08-29.
|
||||
* Improved handling of corrupted mo files.
|
||||
* Minor performance improvements.
|
||||
* Stricter validation of plural expression.
|
||||
|
||||
# Version 1.0
|
||||
|
||||
* Released on 2016-04-27.
|
||||
* Documentation improvements.
|
||||
* Testsuite improvements.
|
||||
|
||||
# Version 0.4
|
||||
|
||||
* Released on 2016-03-02.
|
||||
* Fixed test failures with hhvm due to broken putenv.
|
||||
|
||||
# Version 0.3
|
||||
|
||||
* Released on 2016-03-01.
|
||||
* Added Loader::detectlocale method.
|
||||
|
||||
# Version 0.2
|
||||
|
||||
* Released on 2016-02-24.
|
||||
* Marked PHP 5.4 and 5.5 as supported.
|
||||
|
||||
# Version 0.1
|
||||
|
||||
* Released on 2016-02-23.
|
||||
* Initial release.
|
||||
42
phpMyAdmin/vendor/phpmyadmin/motranslator/CONTRIBUTING.md
vendored
Executable file
42
phpMyAdmin/vendor/phpmyadmin/motranslator/CONTRIBUTING.md
vendored
Executable file
@@ -0,0 +1,42 @@
|
||||
# Contributing to motranslator
|
||||
|
||||
## Reporting issues
|
||||
|
||||
Our issue tracker is hosted at GitHub:
|
||||
|
||||
https://github.com/phpmyadmin/motranslator/issues
|
||||
|
||||
Please search for existing issues before reporting new ones.
|
||||
|
||||
## Working with Git checkout
|
||||
|
||||
The dependencies are managed by Composer, to get them all installed (or update
|
||||
on consequent runs) do:
|
||||
|
||||
```
|
||||
composer update
|
||||
```
|
||||
|
||||
## Submitting patches
|
||||
|
||||
Please submit your patches using GitHub pull requests, this allows us to review
|
||||
them and to run automated tests on the code.
|
||||
|
||||
## Coding standards
|
||||
|
||||
We do follow PSR-1 and PSR-2 coding standards.
|
||||
|
||||
You can use php-cs-fixer to fix the code to match our expectations:
|
||||
|
||||
```
|
||||
php-cs-fixer fix .
|
||||
```
|
||||
|
||||
## Testsuite
|
||||
|
||||
Our code comes with quite comprehensive testsuite, it is automatically executed
|
||||
on every commit and pull request, you can also run it locally:
|
||||
|
||||
```
|
||||
./vendor/bin/phpunit -c phpunit.xml
|
||||
```
|
||||
339
phpMyAdmin/vendor/phpmyadmin/motranslator/LICENSE
vendored
Executable file
339
phpMyAdmin/vendor/phpmyadmin/motranslator/LICENSE
vendored
Executable file
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
28
phpMyAdmin/vendor/phpmyadmin/motranslator/PERFORMANCE.md
vendored
Executable file
28
phpMyAdmin/vendor/phpmyadmin/motranslator/PERFORMANCE.md
vendored
Executable file
@@ -0,0 +1,28 @@
|
||||
# Performance
|
||||
|
||||
This library was tweaked for best performance for single use - translating
|
||||
application with many strings using mo file. Current benchmarks show it's about
|
||||
four times faster than original php-gettext.
|
||||
|
||||
There are two benchmark scripts in the code:
|
||||
|
||||
* ``benchmark-context.php`` - benchmarks context usage
|
||||
* ``benchmark-plural.php`` - benchmarks plural evaluation
|
||||
* ``benchmark.php`` - benchmarks file parsing
|
||||
|
||||
## Performance measurements
|
||||
|
||||
The performance improvements based on individual changes in the code:
|
||||
|
||||
| Stage | Seconds |
|
||||
| -------------- | --------------- |
|
||||
| Original code | 4.7929680347443 |
|
||||
| Remove nocache | 4.6308250427246 |
|
||||
| Direct endian | 4.5883052349091 |
|
||||
| Remove attribs | 4.5297479629517 |
|
||||
| String reader | 1.8148958683014 |
|
||||
| No offset | 1.2436759471893 |
|
||||
| Less attribs | 1.1722540855408 |
|
||||
| Remove shift | 1.0970499515533 |
|
||||
| Magic order | 1.0868430137634 |
|
||||
|
||||
147
phpMyAdmin/vendor/phpmyadmin/motranslator/README.md
vendored
Executable file
147
phpMyAdmin/vendor/phpmyadmin/motranslator/README.md
vendored
Executable file
@@ -0,0 +1,147 @@
|
||||
# motranslator
|
||||
|
||||
Translation API for PHP using Gettext MO files.
|
||||
|
||||
[](https://travis-ci.org/phpmyadmin/motranslator)
|
||||
[](https://codecov.io/github/phpmyadmin/motranslator?branch=master)
|
||||
[](https://scrutinizer-ci.com/g/phpmyadmin/motranslator/?branch=master)
|
||||
[](https://packagist.org/packages/phpmyadmin/motranslator)
|
||||
|
||||
## Features
|
||||
|
||||
* All strings are stored in memory for fast lookup
|
||||
* Fast loading of MO files
|
||||
* Low level API for reading MO files
|
||||
* Emulation of Gettext API
|
||||
* No use of `eval()` for plural equation
|
||||
|
||||
## Limitations
|
||||
|
||||
* Not suitable for huge MO files which you don't want to store in memory
|
||||
* Input and output encoding has to match (preferably UTF-8)
|
||||
|
||||
## Installation
|
||||
|
||||
Please use [Composer][1] to install:
|
||||
|
||||
```
|
||||
composer require phpmyadmin/motranslator
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
The API documentation is available at
|
||||
<https://develdocs.phpmyadmin.net/motranslator/>.
|
||||
|
||||
|
||||
## Object API usage
|
||||
|
||||
```php
|
||||
// Create loader object
|
||||
$loader = new PhpMyAdmin\MoTranslator\Loader();
|
||||
|
||||
// Set locale
|
||||
$loader->setlocale('cs');
|
||||
|
||||
// Set default text domain
|
||||
$loader->textdomain('domain');
|
||||
|
||||
// Set path where to look for a domain
|
||||
$loader->bindtextdomain('domain', __DIR__ . '/data/locale/');
|
||||
|
||||
// Get translator
|
||||
$translator = $loader->getTranslator();
|
||||
|
||||
// Now you can use Translator API (see below)
|
||||
```
|
||||
|
||||
## Low level API usage
|
||||
|
||||
```php
|
||||
// Directly load the mo file
|
||||
$translator = new PhpMyAdmin\MoTranslator\Translator('./path/to/file.mo');
|
||||
|
||||
// Now you can use Translator API (see below)
|
||||
```
|
||||
|
||||
## Translator API usage
|
||||
|
||||
```php
|
||||
// Translate string
|
||||
echo $translator->gettext('String');
|
||||
|
||||
// Translate plural string
|
||||
echo $translator->ngettext('String', 'Plural string', $count);
|
||||
|
||||
// Translate string with context
|
||||
echo $translator->pgettext('Context', 'String');
|
||||
|
||||
// Translate plural string with context
|
||||
echo $translator->npgettext('Context', 'String', 'Plural string', $count);
|
||||
```
|
||||
|
||||
## Gettext compatibility usage
|
||||
|
||||
```php
|
||||
// Load compatibility layer
|
||||
PhpMyAdmin\MoTranslator\Loader::loadFunctions();
|
||||
|
||||
// Configure
|
||||
_setlocale(LC_MESSAGES, 'cs');
|
||||
_textdomain('phpmyadmin');
|
||||
_bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
|
||||
_bind_textdomain_codeset('phpmyadmin', 'UTF-8');
|
||||
|
||||
// Use functions
|
||||
echo _gettext('Type');
|
||||
echo __('Type');
|
||||
|
||||
// It also support other Gettext functions
|
||||
_dnpgettext($domain, $msgctxt, $msgid, $msgidPlural, $number);
|
||||
_dngettext($domain, $msgid, $msgidPlural, $number);
|
||||
_npgettext($msgctxt, $msgid, $msgidPlural, $number);
|
||||
_ngettext($msgid, $msgidPlural, $number);
|
||||
_dpgettext($domain, $msgctxt, $msgid);
|
||||
_dgettext($domain, $msgid);
|
||||
_pgettext($msgctxt, $msgid);
|
||||
```
|
||||
|
||||
## History
|
||||
|
||||
This library is based on [php-gettext][2]. It adds some performance
|
||||
improvements and ability to install using [Composer][1].
|
||||
|
||||
## Motivation
|
||||
|
||||
Motivation for this library includes:
|
||||
|
||||
* The [php-gettext][2] library is not maintained anymore
|
||||
* It doesn't work with recent PHP version (phpMyAdmin has patched version)
|
||||
* It relies on `eval()` function for plural equations what can have severe security implications, see CVE-2016-6175
|
||||
* It's not possible to install it using [Composer][1]
|
||||
* There was place for performance improvements in the library
|
||||
|
||||
### Why not to use native gettext in PHP?
|
||||
|
||||
We've tried that, but it's not a viable solution:
|
||||
|
||||
* You can not use locales not known to system, what is something you can not
|
||||
control from web application. This gets even more tricky with minimalist
|
||||
virtualisation containers.
|
||||
* Changing the MO file usually leads to PHP segmentation fault. It (or rather
|
||||
Gettext library) caches headers of MO file and if it's content is changed
|
||||
(for example new version is uploaded to server) it tries to access new data
|
||||
with old references. This is bug known for ages:
|
||||
https://bugs.php.net/bug.php?id=45943
|
||||
|
||||
### Why use Gettext and not JSON, YAML or whatever?
|
||||
|
||||
We want translators to be able to use their favorite tools and we want us to be
|
||||
able to use wide range of tools available with Gettext as well such as
|
||||
[web based translation using Weblate][3]. Using custom format usually adds
|
||||
another barrier for translators and we want to make it easy for them to
|
||||
contribute.
|
||||
|
||||
[1]:https://getcomposer.org/
|
||||
[2]:https://launchpad.net/php-gettext
|
||||
[3]:https://weblate.org/
|
||||
3
phpMyAdmin/vendor/phpmyadmin/motranslator/codecov.yml
vendored
Executable file
3
phpMyAdmin/vendor/phpmyadmin/motranslator/codecov.yml
vendored
Executable file
@@ -0,0 +1,3 @@
|
||||
comment:
|
||||
layout: header, changes, diff
|
||||
coverage: {}
|
||||
37
phpMyAdmin/vendor/phpmyadmin/motranslator/composer.json
vendored
Executable file
37
phpMyAdmin/vendor/phpmyadmin/motranslator/composer.json
vendored
Executable file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "phpmyadmin/motranslator",
|
||||
"description": "Translation API for PHP using Gettext MO files",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"keywords": ["gettext", "mo", "translator", "i18n"],
|
||||
"homepage": "https://github.com/phpmyadmin/motranslator",
|
||||
"authors": [
|
||||
{
|
||||
"name": "The phpMyAdmin Team",
|
||||
"email": "developers@phpmyadmin.net",
|
||||
"homepage": "https://www.phpmyadmin.net/team/"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/phpmyadmin/motranslator/issues",
|
||||
"source": "https://github.com/phpmyadmin/motranslator"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"symfony/expression-language": "^4.0 || ^3.2 || ^2.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"apigen/apigen": "^4.1",
|
||||
"phpunit/php-code-coverage": "*",
|
||||
"phpunit/phpunit": "~4.8 || ~5.7 || ~6.5"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PhpMyAdmin\\MoTranslator\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"PhpMyAdmin\\MoTranslator\\Tests\\": "tests"
|
||||
}
|
||||
}
|
||||
}
|
||||
32
phpMyAdmin/vendor/phpmyadmin/motranslator/phpunit.xml
vendored
Executable file
32
phpMyAdmin/vendor/phpmyadmin/motranslator/phpunit.xml
vendored
Executable file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
beStrictAboutOutputDuringTests="true"
|
||||
colors="true"
|
||||
verbose="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false">
|
||||
<logging>
|
||||
<log type="coverage-clover" target="coverage.xml" />
|
||||
</logging>
|
||||
<testsuites>
|
||||
<testsuite name="Main">
|
||||
<directory suffix=".php">./tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">src/</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
<php>
|
||||
<ini name="display_errors" value="On" />
|
||||
<ini name="display_startup_errors" value="On" />
|
||||
<ini name="error_reporting" value="E_ALL" />
|
||||
</php>
|
||||
</phpunit>
|
||||
247
phpMyAdmin/vendor/phpmyadmin/motranslator/src/Loader.php
vendored
Executable file
247
phpMyAdmin/vendor/phpmyadmin/motranslator/src/Loader.php
vendored
Executable file
@@ -0,0 +1,247 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2005 Steven Armstrong <sa at c-area dot ch>
|
||||
Copyright (c) 2009 Danilo Segan <danilo@kvota.net>
|
||||
Copyright (c) 2016 Michal Čihař <michal@cihar.com>
|
||||
|
||||
This file is part of MoTranslator.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
namespace PhpMyAdmin\MoTranslator;
|
||||
|
||||
class Loader
|
||||
{
|
||||
/**
|
||||
* Loader instance.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @var Loader
|
||||
*/
|
||||
private static $_instance;
|
||||
|
||||
/**
|
||||
* Default gettext domain to use.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $default_domain = '';
|
||||
|
||||
/**
|
||||
* Configured locale.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $locale = '';
|
||||
|
||||
/**
|
||||
* Loaded domains.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $domains = array();
|
||||
|
||||
/**
|
||||
* Bound paths for domains.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $paths = array('' => './');
|
||||
|
||||
/**
|
||||
* Returns the singleton Loader object.
|
||||
*
|
||||
* @return Loader object
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
if (empty(self::$_instance)) {
|
||||
self::$_instance = new self();
|
||||
}
|
||||
|
||||
return self::$_instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads global localizaton functions.
|
||||
*/
|
||||
public static function loadFunctions()
|
||||
{
|
||||
require_once __DIR__ . '/functions.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Figure out all possible locale names and start with the most
|
||||
* specific ones. I.e. for sr_CS.UTF-8@latin, look through all of
|
||||
* sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr.
|
||||
*
|
||||
* @param string $locale Locale code
|
||||
*
|
||||
* @return array list of locales to try for any POSIX-style locale specification
|
||||
*/
|
||||
public static function listLocales($locale)
|
||||
{
|
||||
$locale_names = array();
|
||||
|
||||
$lang = null;
|
||||
$country = null;
|
||||
$charset = null;
|
||||
$modifier = null;
|
||||
|
||||
if ($locale) {
|
||||
if (preg_match('/^(?P<lang>[a-z]{2,3})' // language code
|
||||
. '(?:_(?P<country>[A-Z]{2}))?' // country code
|
||||
. '(?:\\.(?P<charset>[-A-Za-z0-9_]+))?' // charset
|
||||
. '(?:@(?P<modifier>[-A-Za-z0-9_]+))?$/', // @ modifier
|
||||
$locale, $matches)) {
|
||||
extract($matches);
|
||||
|
||||
if ($modifier) {
|
||||
if ($country) {
|
||||
if ($charset) {
|
||||
array_push($locale_names, "${lang}_$country.$charset@$modifier");
|
||||
}
|
||||
array_push($locale_names, "${lang}_$country@$modifier");
|
||||
} elseif ($charset) {
|
||||
array_push($locale_names, "${lang}.$charset@$modifier");
|
||||
}
|
||||
array_push($locale_names, "$lang@$modifier");
|
||||
}
|
||||
if ($country) {
|
||||
if ($charset) {
|
||||
array_push($locale_names, "${lang}_$country.$charset");
|
||||
}
|
||||
array_push($locale_names, "${lang}_$country");
|
||||
} elseif ($charset) {
|
||||
array_push($locale_names, "${lang}.$charset");
|
||||
}
|
||||
array_push($locale_names, $lang);
|
||||
}
|
||||
|
||||
// If the locale name doesn't match POSIX style, just include it as-is.
|
||||
if (!in_array($locale, $locale_names)) {
|
||||
array_push($locale_names, $locale);
|
||||
}
|
||||
}
|
||||
|
||||
return $locale_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Translator object for domain or for default domain.
|
||||
*
|
||||
* @param string $domain Translation domain
|
||||
*
|
||||
* @return Translator
|
||||
*/
|
||||
public function getTranslator($domain = '')
|
||||
{
|
||||
if (empty($domain)) {
|
||||
$domain = $this->default_domain;
|
||||
}
|
||||
|
||||
if (!isset($this->domains[$this->locale])) {
|
||||
$this->domains[$this->locale] = array();
|
||||
}
|
||||
|
||||
if (!isset($this->domains[$this->locale][$domain])) {
|
||||
if (isset($this->paths[$domain])) {
|
||||
$base = $this->paths[$domain];
|
||||
} else {
|
||||
$base = './';
|
||||
}
|
||||
|
||||
$locale_names = $this->listLocales($this->locale);
|
||||
|
||||
$filename = '';
|
||||
foreach ($locale_names as $locale) {
|
||||
$filename = "$base/$locale/LC_MESSAGES/$domain.mo";
|
||||
if (file_exists($filename)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// We don't care about invalid path, we will get fallback
|
||||
// translator here
|
||||
$this->domains[$this->locale][$domain] = new Translator($filename);
|
||||
}
|
||||
|
||||
return $this->domains[$this->locale][$domain];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the path for a domain.
|
||||
*
|
||||
* @param string $domain Domain name
|
||||
* @param string $path Path where to find locales
|
||||
*/
|
||||
public function bindtextdomain($domain, $path)
|
||||
{
|
||||
$this->paths[$domain] = $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the default domain.
|
||||
*
|
||||
* @param string $domain Domain name
|
||||
*/
|
||||
public function textdomain($domain)
|
||||
{
|
||||
$this->default_domain = $domain;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a requested locale.
|
||||
*
|
||||
* @param string $locale Locale name
|
||||
*
|
||||
* @return string Set or current locale
|
||||
*/
|
||||
public function setlocale($locale)
|
||||
{
|
||||
if (!empty($locale)) {
|
||||
$this->locale = $locale;
|
||||
}
|
||||
|
||||
return $this->locale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects currently configured locale.
|
||||
*
|
||||
* It checks:
|
||||
*
|
||||
* - global lang variable
|
||||
* - environment for LC_ALL, LC_MESSAGES and LANG
|
||||
*
|
||||
* @return string with locale name
|
||||
*/
|
||||
public function detectlocale()
|
||||
{
|
||||
if (isset($GLOBALS['lang'])) {
|
||||
return $GLOBALS['lang'];
|
||||
} elseif (getenv('LC_ALL')) {
|
||||
return getenv('LC_ALL');
|
||||
} elseif (getenv('LC_MESSAGES')) {
|
||||
return getenv('LC_MESSAGES');
|
||||
} elseif (getenv('LANG')) {
|
||||
return getenv('LANG');
|
||||
}
|
||||
|
||||
return 'en';
|
||||
}
|
||||
}
|
||||
30
phpMyAdmin/vendor/phpmyadmin/motranslator/src/ReaderException.php
vendored
Executable file
30
phpMyAdmin/vendor/phpmyadmin/motranslator/src/ReaderException.php
vendored
Executable file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2003, 2005, 2006, 2009 Danilo Segan <danilo@kvota.net>.
|
||||
Copyright (c) 2016 Michal Čihař <michal@cihar.com>
|
||||
|
||||
This file is part of MoTranslator.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
namespace PhpMyAdmin\MoTranslator;
|
||||
|
||||
/**
|
||||
* Exception thrown when file can not be read.
|
||||
*/
|
||||
class ReaderException extends \Exception
|
||||
{
|
||||
}
|
||||
97
phpMyAdmin/vendor/phpmyadmin/motranslator/src/StringReader.php
vendored
Executable file
97
phpMyAdmin/vendor/phpmyadmin/motranslator/src/StringReader.php
vendored
Executable file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2003, 2005, 2006, 2009 Danilo Segan <danilo@kvota.net>.
|
||||
Copyright (c) 2016 Michal Čihař <michal@cihar.com>
|
||||
|
||||
This file is part of MoTranslator.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
namespace PhpMyAdmin\MoTranslator;
|
||||
|
||||
/**
|
||||
* Simple wrapper around string buffer for
|
||||
* random access and values parsing.
|
||||
*/
|
||||
class StringReader
|
||||
{
|
||||
private $_str;
|
||||
private $_len;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $filename Name of file to load
|
||||
*/
|
||||
public function __construct($filename)
|
||||
{
|
||||
$this->_str = file_get_contents($filename);
|
||||
$this->_len = strlen($this->_str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read number of bytes from given offset.
|
||||
*
|
||||
* @param int $pos Offset
|
||||
* @param int $bytes Number of bytes to read
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function read($pos, $bytes)
|
||||
{
|
||||
if ($pos + $bytes > $this->_len) {
|
||||
throw new ReaderException('Not enough bytes!');
|
||||
}
|
||||
|
||||
return substr($this->_str, $pos, $bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a 32bit integer from the stream.
|
||||
*
|
||||
* @param string $unpack Unpack string
|
||||
* @param int $pos Position
|
||||
*
|
||||
* @return int Ingerer from the stream
|
||||
*/
|
||||
public function readint($unpack, $pos)
|
||||
{
|
||||
$data = unpack($unpack, $this->read($pos, 4));
|
||||
$result = $data[1];
|
||||
|
||||
/* We're reading unsigned int, but PHP will happily
|
||||
* give us negative number on 32-bit platforms.
|
||||
*
|
||||
* See also documentation:
|
||||
* https://secure.php.net/manual/en/function.unpack.php#refsect1-function.unpack-notes
|
||||
*/
|
||||
return $result < 0 ? PHP_INT_MAX : $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads an array of integers from the stream.
|
||||
*
|
||||
* @param string $unpack Unpack string
|
||||
* @param int $pos Position
|
||||
* @param int $count How many elements should be read
|
||||
*
|
||||
* @return array Array of Integers
|
||||
*/
|
||||
public function readintarray($unpack, $pos, $count)
|
||||
{
|
||||
return unpack($unpack . $count, $this->read($pos, 4 * $count));
|
||||
}
|
||||
}
|
||||
375
phpMyAdmin/vendor/phpmyadmin/motranslator/src/Translator.php
vendored
Executable file
375
phpMyAdmin/vendor/phpmyadmin/motranslator/src/Translator.php
vendored
Executable file
@@ -0,0 +1,375 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2003, 2009 Danilo Segan <danilo@kvota.net>.
|
||||
Copyright (c) 2005 Nico Kaiser <nico@siriux.net>
|
||||
Copyright (c) 2016 Michal Čihař <michal@cihar.com>
|
||||
|
||||
This file is part of MoTranslator.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
namespace PhpMyAdmin\MoTranslator;
|
||||
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
||||
|
||||
/**
|
||||
* Provides a simple gettext replacement that works independently from
|
||||
* the system's gettext abilities.
|
||||
* It can read MO files and use them for translating strings.
|
||||
*
|
||||
* It caches ll strings and translations to speed up the string lookup.
|
||||
*/
|
||||
class Translator
|
||||
{
|
||||
/**
|
||||
* None error.
|
||||
*/
|
||||
const ERROR_NONE = 0;
|
||||
/**
|
||||
* File does not exist.
|
||||
*/
|
||||
const ERROR_DOES_NOT_EXIST = 1;
|
||||
/**
|
||||
* File has bad magic number.
|
||||
*/
|
||||
const ERROR_BAD_MAGIC = 2;
|
||||
/**
|
||||
* Error while reading file, probably too short.
|
||||
*/
|
||||
const ERROR_READING = 3;
|
||||
|
||||
/**
|
||||
* Big endian mo file magic bytes.
|
||||
*/
|
||||
const MAGIC_BE = "\x95\x04\x12\xde";
|
||||
/**
|
||||
* Little endian mo file magic bytes.
|
||||
*/
|
||||
const MAGIC_LE = "\xde\x12\x04\x95";
|
||||
|
||||
/**
|
||||
* Parse error code (0 if no error).
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $error = self::ERROR_NONE;
|
||||
|
||||
/**
|
||||
* Cache header field for plural forms.
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
private $pluralequation = null;
|
||||
/**
|
||||
* @var ExpressionLanguage|null Evaluator for plurals
|
||||
*/
|
||||
private $pluralexpression = null;
|
||||
/**
|
||||
* @var int|null number of plurals
|
||||
*/
|
||||
private $pluralcount = null;
|
||||
/**
|
||||
* Array with original -> translation mapping.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $cache_translations = array();
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $filename Name of mo file to load
|
||||
*/
|
||||
public function __construct($filename)
|
||||
{
|
||||
if (!is_readable($filename)) {
|
||||
$this->error = self::ERROR_DOES_NOT_EXIST;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$stream = new StringReader($filename);
|
||||
|
||||
try {
|
||||
$magic = $stream->read(0, 4);
|
||||
if (strcmp($magic, self::MAGIC_LE) == 0) {
|
||||
$unpack = 'V';
|
||||
} elseif (strcmp($magic, self::MAGIC_BE) == 0) {
|
||||
$unpack = 'N';
|
||||
} else {
|
||||
$this->error = self::ERROR_BAD_MAGIC;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Parse header */
|
||||
$total = $stream->readint($unpack, 8);
|
||||
$originals = $stream->readint($unpack, 12);
|
||||
$translations = $stream->readint($unpack, 16);
|
||||
|
||||
/* get original and translations tables */
|
||||
$table_originals = $stream->readintarray($unpack, $originals, $total * 2);
|
||||
$table_translations = $stream->readintarray($unpack, $translations, $total * 2);
|
||||
|
||||
/* read all strings to the cache */
|
||||
for ($i = 0; $i < $total; ++$i) {
|
||||
$original = $stream->read($table_originals[$i * 2 + 2], $table_originals[$i * 2 + 1]);
|
||||
$translation = $stream->read($table_translations[$i * 2 + 2], $table_translations[$i * 2 + 1]);
|
||||
$this->cache_translations[$original] = $translation;
|
||||
}
|
||||
} catch (ReaderException $e) {
|
||||
$this->error = self::ERROR_READING;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a string.
|
||||
*
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated string (or original, if not found)
|
||||
*/
|
||||
public function gettext($msgid)
|
||||
{
|
||||
if (array_key_exists($msgid, $this->cache_translations)) {
|
||||
return $this->cache_translations[$msgid];
|
||||
}
|
||||
|
||||
return $msgid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a string is translated.
|
||||
*
|
||||
* @param string $msgid String to be checked
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($msgid)
|
||||
{
|
||||
return array_key_exists($msgid, $this->cache_translations);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitize plural form expression for use in ExpressionLanguage.
|
||||
*
|
||||
* @param string $expr Expression to sanitize
|
||||
*
|
||||
* @return string sanitized plural form expression
|
||||
*/
|
||||
public static function sanitizePluralExpression($expr)
|
||||
{
|
||||
// Parse equation
|
||||
$expr = explode(';', $expr);
|
||||
if (count($expr) >= 2) {
|
||||
$expr = $expr[1];
|
||||
} else {
|
||||
$expr = $expr[0];
|
||||
}
|
||||
$expr = trim(strtolower($expr));
|
||||
// Strip plural prefix
|
||||
if (substr($expr, 0, 6) === 'plural') {
|
||||
$expr = ltrim(substr($expr, 6));
|
||||
}
|
||||
// Strip equals
|
||||
if (substr($expr, 0, 1) === '=') {
|
||||
$expr = ltrim(substr($expr, 1));
|
||||
}
|
||||
|
||||
// Cleanup from unwanted chars
|
||||
$expr = preg_replace('@[^n0-9:\(\)\?=!<>/%&| ]@', '', $expr);
|
||||
|
||||
return $expr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts number of plurals from plurals form expression.
|
||||
*
|
||||
* @param string $expr Expression to process
|
||||
*
|
||||
* @return int Total number of plurals
|
||||
*/
|
||||
public static function extractPluralCount($expr)
|
||||
{
|
||||
$parts = explode(';', $expr, 2);
|
||||
$nplurals = explode('=', trim($parts[0]), 2);
|
||||
if (strtolower(rtrim($nplurals[0])) != 'nplurals') {
|
||||
return 1;
|
||||
}
|
||||
if (count($nplurals) == 1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return intval($nplurals[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse full PO header and extract only plural forms line.
|
||||
*
|
||||
* @param string $header Gettext header
|
||||
*
|
||||
* @return string verbatim plural form header field
|
||||
*/
|
||||
public static function extractPluralsForms($header)
|
||||
{
|
||||
$headers = explode("\n", $header);
|
||||
$expr = 'nplurals=2; plural=n == 1 ? 0 : 1;';
|
||||
foreach ($headers as $header) {
|
||||
if (stripos($header, 'Plural-Forms:') === 0) {
|
||||
$expr = substr($header, 13);
|
||||
}
|
||||
}
|
||||
|
||||
return $expr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get possible plural forms from MO header.
|
||||
*
|
||||
* @return string plural form header
|
||||
*/
|
||||
private function getPluralForms()
|
||||
{
|
||||
// lets assume message number 0 is header
|
||||
// this is true, right?
|
||||
|
||||
// cache header field for plural forms
|
||||
if (is_null($this->pluralequation)) {
|
||||
if (isset($this->cache_translations[''])) {
|
||||
$header = $this->cache_translations[''];
|
||||
} else {
|
||||
$header = '';
|
||||
}
|
||||
$expr = $this->extractPluralsForms($header);
|
||||
$this->pluralequation = $this->sanitizePluralExpression($expr);
|
||||
$this->pluralcount = $this->extractPluralCount($expr);
|
||||
}
|
||||
|
||||
return $this->pluralequation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects which plural form to take.
|
||||
*
|
||||
* @param int $n count of objects
|
||||
*
|
||||
* @return int array index of the right plural form
|
||||
*/
|
||||
private function selectString($n)
|
||||
{
|
||||
if (is_null($this->pluralexpression)) {
|
||||
$this->pluralexpression = new ExpressionLanguage();
|
||||
}
|
||||
try {
|
||||
$plural = $this->pluralexpression->evaluate(
|
||||
$this->getPluralForms(), array('n' => $n)
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$plural = 0;
|
||||
}
|
||||
|
||||
if ($plural >= $this->pluralcount) {
|
||||
$plural = $this->pluralcount - 1;
|
||||
}
|
||||
|
||||
return $plural;
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of gettext.
|
||||
*
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
public function ngettext($msgid, $msgidPlural, $number)
|
||||
{
|
||||
// this should contains all strings separated by NULLs
|
||||
$key = implode(chr(0), array($msgid, $msgidPlural));
|
||||
if (!array_key_exists($key, $this->cache_translations)) {
|
||||
return ($number != 1) ? $msgidPlural : $msgid;
|
||||
}
|
||||
|
||||
// find out the appropriate form
|
||||
$select = $this->selectString($number);
|
||||
|
||||
$result = $this->cache_translations[$key];
|
||||
$list = explode(chr(0), $result);
|
||||
|
||||
if (!isset($list[$select])) {
|
||||
return $list[0];
|
||||
}
|
||||
|
||||
return $list[$select];
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate with context.
|
||||
*
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
public function pgettext($msgctxt, $msgid)
|
||||
{
|
||||
$key = implode(chr(4), array($msgctxt, $msgid));
|
||||
$ret = $this->gettext($key);
|
||||
if (strpos($ret, chr(4)) !== false) {
|
||||
return $msgid;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of pgettext.
|
||||
*
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
public function npgettext($msgctxt, $msgid, $msgidPlural, $number)
|
||||
{
|
||||
$key = implode(chr(4), array($msgctxt, $msgid));
|
||||
$ret = $this->ngettext($key, $msgidPlural, $number);
|
||||
if (strpos($ret, chr(4)) !== false) {
|
||||
return $msgid;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set translation in place
|
||||
*
|
||||
* @param string $msgid String to be set
|
||||
* @param string $msgstr Translation
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setTranslation($msgid, $msgstr)
|
||||
{
|
||||
$this->cache_translations[$msgid] = $msgstr;
|
||||
}
|
||||
}
|
||||
215
phpMyAdmin/vendor/phpmyadmin/motranslator/src/functions.php
vendored
Executable file
215
phpMyAdmin/vendor/phpmyadmin/motranslator/src/functions.php
vendored
Executable file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2005 Steven Armstrong <sa at c-area dot ch>
|
||||
Copyright (c) 2009 Danilo Segan <danilo@kvota.net>
|
||||
Copyright (c) 2016 Michal Čihař <michal@cihar.com>
|
||||
|
||||
This file is part of MoTranslator.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
use PhpMyAdmin\MoTranslator\Loader;
|
||||
|
||||
/**
|
||||
* Sets a requested locale.
|
||||
*
|
||||
* @param int $category Locale category, ignored
|
||||
* @param string $locale Locale name
|
||||
*
|
||||
* @return string Set or current locale
|
||||
*/
|
||||
function _setlocale($category, $locale)
|
||||
{
|
||||
return Loader::getInstance()->setlocale($locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the path for a domain.
|
||||
*
|
||||
* @param string $domain Domain name
|
||||
* @param string $path Path where to find locales
|
||||
*/
|
||||
function _bindtextdomain($domain, $path)
|
||||
{
|
||||
Loader::getInstance()->bindtextdomain($domain, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy compatibility function, MoTranslator assumes
|
||||
* everything is using same character set on input and
|
||||
* output.
|
||||
*
|
||||
* Generally it is wise to output in UTF-8 and have
|
||||
* mo files in UTF-8.
|
||||
*
|
||||
* @param mixed $domain Domain where to set character set
|
||||
* @param mixed $codeset Character set to set
|
||||
*/
|
||||
function _bind_textdomain_codeset($domain, $codeset)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the default domain.
|
||||
*
|
||||
* @param string $domain Domain name
|
||||
*/
|
||||
function _textdomain($domain)
|
||||
{
|
||||
Loader::getInstance()->textdomain($domain);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a string.
|
||||
*
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated string (or original, if not found)
|
||||
*/
|
||||
function _gettext($msgid)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator()->gettext(
|
||||
$msgid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a string, alias for _gettext.
|
||||
*
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated string (or original, if not found)
|
||||
*/
|
||||
function __($msgid)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator()->gettext(
|
||||
$msgid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of gettext.
|
||||
*
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _ngettext($msgid, $msgidPlural, $number)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator()->ngettext(
|
||||
$msgid, $msgidPlural, $number
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate with context.
|
||||
*
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _pgettext($msgctxt, $msgid)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator()->pgettext(
|
||||
$msgctxt, $msgid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of pgettext.
|
||||
*
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _npgettext($msgctxt, $msgid, $msgidPlural, $number)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator()->npgettext(
|
||||
$msgctxt, $msgid, $msgidPlural, $number
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a string.
|
||||
*
|
||||
* @param string $domain Domain to use
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated string (or original, if not found)
|
||||
*/
|
||||
function _dgettext($domain, $msgid)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator($domain)->gettext(
|
||||
$msgid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of gettext.
|
||||
*
|
||||
* @param string $domain Domain to use
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _dngettext($domain, $msgid, $msgidPlural, $number)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator($domain)->ngettext(
|
||||
$msgid, $msgidPlural, $number
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate with context.
|
||||
*
|
||||
* @param string $domain Domain to use
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid String to be translated
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _dpgettext($domain, $msgctxt, $msgid)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator($domain)->pgettext(
|
||||
$msgctxt, $msgid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plural version of pgettext.
|
||||
*
|
||||
* @param string $domain Domain to use
|
||||
* @param string $msgctxt Context
|
||||
* @param string $msgid Single form
|
||||
* @param string $msgidPlural Plural form
|
||||
* @param int $number Number of objects
|
||||
*
|
||||
* @return string translated plural form
|
||||
*/
|
||||
function _dnpgettext($domain, $msgctxt, $msgid, $msgidPlural, $number)
|
||||
{
|
||||
return Loader::getInstance()->getTranslator($domain)->npgettext(
|
||||
$msgctxt, $msgid, $msgidPlural, $number
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user