From: Radek Czajka Date: Mon, 30 Aug 2010 23:56:26 +0000 (+0200) Subject: Merge branch 'production' X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/67df302167539474edd02b57c2e8bd30349d7625?hp=958978dc2189eb10877ed310eb8313858e589b4a Merge branch 'production' --- diff --git a/.gitignore b/.gitignore index f11a79bab..a3f95c013 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,31 @@ localsettings.py dev.sqlite +*.db +*~ +*.orig + +# Compress output +/wolnelektury/static/css/all.min*.css +/wolnelektury/static/js/all*.min.js +/wolnelektury/static/css/book.min*.css +/wolnelektury/static/js/book*.min.js +/wolnelektury/static/js/jquery.min.js # Python garbage *.pyc .coverage +pip-log.txt +nosetests.xml # Mac OS X garbage .DS_Store # Windows garbage thumbs.db + +# Eclipse +.project +.settings +.pydevproject +.tmp_* + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..56b9c4254 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/librarian"] + path = lib/librarian + url = git://github.com/fnp/librarian.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..2def0e883 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + 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 +them 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 000000000..7bd984478 --- /dev/null +++ b/NOTICE @@ -0,0 +1,19 @@ + + FNP Wolnelektury + + Copyright © 2010 Fundacja Nowoczesna Polska + + For full list of contributors see AUTHORS file. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . \ No newline at end of file diff --git a/README b/README deleted file mode 100644 index fa3064e1c..000000000 --- a/README +++ /dev/null @@ -1,93 +0,0 @@ -Dependencies -============ - - * [Django 1.0](http://djangoproject.com/) (application framework) - * [lxml 2.0.0](http://codespeak.net/lxml/) (for importing books) - * [librarian 1.1](http://redmine.nowoczesnapolska.org.pl/projects/show/librarian) (for importing books) - * Python libraries from lib directory - * Django applications from apps directory - - -How to deploy -============= - -Just execute this commands: - - cd wolnelektury.pl - source setpythonpath.sh - cd wolnelektury - ./manage.py syncdbc - ./manage.py importbooks ../books/01 ../books/02 ../books/03 - ../setmainpage.py - -[TODO] - - -Używany kod open-source -======================= - -django ------- - - Źródła: [djangoproject.com](http://www.djangoproject.com/) - - Autorzy: [wielu autorów](http://code.djangoproject.com/browser/django/trunk/AUTHORS) - - Licencja: [BSD License](http://code.djangoproject.com/browser/django/trunk/LICENSE) - - Typ: framework - -django-chunks -------------- - - Źródła: [Google Code](http://code.google.com/p/django-chunks/) - - Autorzy: Clint Ecker - - Licencja: [New BSD License](http://www.opensource.org/licenses/bsd-license.php) - - Typ: biblioteka (aplikacja django) - -django-pagination ------------------ - - Źródła: [Google Code](http://code.google.com/p/django-pagination/) - - Autorzy: James Tauber , leidel@gmail.com - - Licencja: [New BSD License](http://www.opensource.org/licenses/bsd-license.php) - - Typ: biblioteka (aplikacja django) - -django-compress ---------------- - - Źródła: [Google Code](http://code.google.com/p/django-compress/) - - Autorzy: Andreas Pelme - - Licencja: [MIT License](http://www.opensource.org/licenses/mit-license.php) - - Typ: biblioteka (aplikacja django) - -django-newtagging ------------------ - - Źródła: [BitBucket](http://www.bitbucket.org/zuber/django-newtagging/) - - Autorzy: Marek Stępniowski - - Licencja: [MIT License](http://www.opensource.org/licenses/mit-license.php) - - Typ: biblioteka (aplikacja django) - - Nota: Aplikacja wzorowana na [django-tagging](http://code.google.com/p/django-tagging/), która jest również wydana na licencji [MIT](http://www.opensource.org/licenses/mit-license.php) Około połowa kodu jest dzielona. - -south ------ -- Źródła: [aercode.org](http://south.aeracode.org/) -- Autorzy: Andrew Godwin , Andy McCurdy -- Licencja: [Apache License 2.0](http://www.opensource.org/licenses/apache2.0.php) -- Typ: biblioteka (aplikacja django) - -feedparser ----------- - - Źródła: [Google Code](http://code.google.com/p/feedparser/) - - Autorzy: Mark Pilgrim - - Licencja: [MIT License](http://www.opensource.org/licenses/mit-license.php) - - Typ: biblioteka - -markupstring ------------- - - Żródła: [ASPN Cookbook](http://code.activestate.com/recipes/389023/) - - Autorzy: Thomas Hinkle - - Licencja: [MIT License](http://code.activestate.com/help/terms/) - - Typ: biblioteka - - Nota: Zmienione przez Marka Stępniowskiego tak, żeby akceptowało ciągi znaków Unicode - -lxml ----- - - Żródła: [codespeak.net](http://codespeak.net/lxml/index.html#download) - - Autorzy: [wielu autorów](http://codespeak.net/lxml/credits.html) - - Licencja: [BSD License](http://codespeak.net/lxml/index.html#license) - - Typ: biblioteka - diff --git a/README.md b/README.md new file mode 100644 index 000000000..725dc7c2d --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +License +------- + + ![AGPL Logo](http://www.gnu.org/graphics/agplv3-155x51.png) + + Copyright © 2008,2009,2010 Fundacja Nowoczesna Polska + + For full list of contributors see AUTHORS section at the end. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Dependencies +============ + + * All packages listed in requirements.txt + * Python libraries from lib directory + * Django applications from apps directory + +How to deploy (development version) +============= + +1. Checkout the source code from Github +2. Install libraries (we recommend using pip): + + pip install -r requirements.txt + +3. Setup your local configuration based on settings.py. You need to generate a new SECRET_KEY, database stuff and domain related stuff. +4. Populate database: + + ./wolnelektury/manage.py syncdb + ./wolnelektury/manage.py migrate + +5. Run the server + + ./wolnelektury/manage.py runserver + + +6. Import some books which are available on http://www.wolnelektury.pl or on bitbucket mirror: http://bitbucket.org/lqc/wlbooks/ + If you use Bitbucket, you also need Mercurial to fetch books (you can install it using: pip install mercurial). + After downloading books, log into administration, go to Books and choose 'Browse' to select book file, + then fire 'Import book' to upload it. Some books have invalid XML, so you can get an error + (just ignore it and look for other books). + +7. We provide localization of the software in following languages: Polish, Russian, German, English, Spanish, French and Lithuanian. + Translation strings are based on gettext and can be found under 'locale' dir. + There are also JavaScript files for jQuery countdown plugin (static/js/jquery.countdown-*.js). + +Full list of used open-source software +====================================== + +External +-------- + +django +-------- + - Source: [djangoproject.com](http://www.djangoproject.com/) + - Authors: [many authors](http://code.djangoproject.com/browser/django/trunk/AUTHORS) + - License: [BSD License](http://code.djangoproject.com/browser/django/trunk/LICENSE) + - Type: framework + +django-pagination +----------------- + - Source: [Google Code](http://code.google.com/p/django-pagination/) + - Authors: James Tauber , leidel@gmail.com + - License: [New BSD License](http://www.opensource.org/licenses/bsd-license.php) + - Type: library (django application) + +django-rosetta +----------------- + - Source: [Google Code](http://code.google.com/p/django-rosetta/) + - Authors: James Tauber , leidel@gmail.com + - License: [MIT License](http://www.opensource.org/licenses/mit-license.php) + - Type: library (django application) + + +Django South +------------ +- Source: [aercode.org](http://south.aeracode.org/) +- Authors: Andrew Godwin , Andy McCurdy +- License: [Apache License 2.0](http://www.opensource.org/licenses/apache2.0.php) +- Type: library (django application) + +lxml +--------- + - Source: [codespeak.net](http://codespeak.net/lxml/index.html#download) + - Authors: [many authors](http://codespeak.net/lxml/credits.html) + - License: [BSD License](http://codespeak.net/lxml/index.html#license) + - Type: library + +feedparser +---------- + - Source: [Google Code](http://code.google.com/p/feedparser/) + - Authors: Mark Pilgrim + - License: [MIT License](http://www.opensource.org/licenses/mit-license.php) + - Type: library + + +Internal (means we hacked on sources of those): +--------- + +django-compress +--------------- + - Source: [Google Code](http://code.google.com/p/django-compress/) + - Authors: Andreas Pelme + - License: [MIT License](http://www.opensource.org/licenses/mit-license.php) + - Type: library (Django application) + + django-chunks +------------- + - Source: [Google Code](http://code.google.com/p/django-chunks/) + - Authors: Clint Ecker + - License: [New BSD License](http://www.opensource.org/licenses/bsd-license.php) + - Type: library (Django application) + +django-newtagging +----------------- + - Source: [BitBucket](http://www.bitbucket.org/zuber/django-newtagging/) + - Authors: Marek Stępniowski + - License: [MIT License](http://www.opensource.org/licenses/mit-license.php) + - Type: library (Django aplication) + - Notes: Aplication based on [django-tagging](http://code.google.com/p/django-tagging/), also [MIT](http://www.opensource.org/licenses/mit-license.php) license. + +django-piston (0.2.3rc) +------------------------ + - http://bitbucket.org/jespern/django-piston/wiki/Home + +markupstring +------------ + - Source: [ASPN Cookbook](http://code.activestate.com/recipes/389023/) + - Authors: Thomas Hinkle + - License: [MIT License](http://code.activestate.com/help/terms/) + - Type: library + - Notes: Patched by Marek Stępniowski to accept Unicode strings + + +Authors +======= + + * Marek Stępniowski + * Łukasz Rekucki diff --git a/apps/api/handlers.py b/apps/api/handlers.py index 03115d894..40121d6af 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.shortcuts import get_object_or_404 from django.contrib.auth.decorators import login_required, user_passes_test from piston.handler import BaseHandler @@ -12,14 +16,14 @@ staff_required = user_passes_test(lambda user: user.is_staff) class BookHandler(BaseHandler): model = Book fields = ('slug', 'title') - + @staff_required def read(self, request, slug=None): if slug: return get_object_or_404(Book, slug=slug) else: return Book.objects.all() - + @staff_required def create(self, request): form = BookImportForm(request.POST, request.FILES) diff --git a/apps/catalogue/admin.py b/apps/catalogue/admin.py index 9f1770d95..02750941c 100644 --- a/apps/catalogue/admin.py +++ b/apps/catalogue/admin.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.contrib import admin from newtagging.admin import TaggableModelAdmin -from catalogue.models import Tag, Book, Fragment +from catalogue.models import Tag, Book, Fragment, BookStub class TagAdmin(admin.ModelAdmin): @@ -17,8 +20,8 @@ class TagAdmin(admin.ModelAdmin): class BookAdmin(TaggableModelAdmin): tag_model = Tag - - list_display = ('title', 'slug', 'has_pdf_file', 'has_odt_file', 'has_html_file', 'has_description',) + + list_display = ('title', 'slug', 'has_pdf_file', 'has_epub_file', 'has_odt_file', 'has_html_file', 'has_description',) search_fields = ('title',) ordering = ('title',) @@ -27,11 +30,22 @@ class BookAdmin(TaggableModelAdmin): class FragmentAdmin(TaggableModelAdmin): tag_model = Tag - + list_display = ('book', 'anchor',) ordering = ('book', 'anchor',) +class BookStubAdmin(admin.ModelAdmin): + # tag_model = Tag + + list_display = ('title', 'author', 'slug','pd') + search_fields = ('title','author') + ordering = ('title',) + + prepopulated_fields = {'slug': ('title',)} + + +admin.site.register(BookStub, BookStubAdmin) admin.site.register(Tag, TagAdmin) admin.site.register(Book, BookAdmin) admin.site.register(Fragment, FragmentAdmin) diff --git a/apps/catalogue/fields.py b/apps/catalogue/fields.py index eedff6705..11c730c71 100644 --- a/apps/catalogue/fields.py +++ b/apps/catalogue/fields.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import datetime from django.conf import settings @@ -6,10 +9,12 @@ from django.db import models from django.db.models import signals from django import forms from django.forms.widgets import flatatt -from django.forms.util import smart_unicode +from django.utils.encoding import smart_unicode from django.utils import simplejson as json from django.utils.html import escape from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _ +from south.modelsinspector import add_introspection_rules class JSONEncoder(json.JSONEncoder): @@ -33,13 +38,13 @@ def loads(str): class JSONFormField(forms.CharField): widget = forms.Textarea - + def clean(self, value): try: loads(value) return value except ValueError, e: - raise forms.ValidationError('Enter a valid JSON value. Error: %s' % e) + raise forms.ValidationError(_('Enter a valid JSON value. Error: %s') % e) class JSONField(models.TextField): @@ -56,7 +61,7 @@ class JSONField(models.TextField): def contribute_to_class(self, cls, name): super(JSONField, self).contribute_to_class(cls, name) - + def get_value(model_instance): return loads(getattr(model_instance, self.attname, None)) setattr(cls, 'get_%s_value' % self.name, get_value) @@ -65,6 +70,8 @@ class JSONField(models.TextField): return setattr(model_instance, self.attname, dumps(json)) setattr(cls, 'set_%s_value' % self.name, set_value) +add_introspection_rules([], ["^catalogue\.fields\.JSONField"]) + class JQueryAutoCompleteWidget(forms.TextInput): def __init__(self, source, options=None, *args, **kwargs): @@ -73,23 +80,23 @@ class JQueryAutoCompleteWidget(forms.TextInput): if options: self.options = dumps(options) super(JQueryAutoCompleteWidget, self).__init__(*args, **kwargs) - + def render_js(self, field_id): source = "'%s'" % escape(self.source) options = '' if self.options: options += ', %s' % self.options - - return u'$(\'#%s\').autocomplete(%s%s);' % (field_id, source, options) - + + return u'$(\'#%s\').autocomplete(%s%s).result(autocomplete_result_handler);' % (field_id, source, options) + def render(self, name, value=None, attrs=None): final_attrs = self.build_attrs(attrs, name=name) if value: final_attrs['value'] = smart_unicode(value) - + if not self.attrs.has_key('id'): final_attrs['id'] = 'id_%s' % name - + html = u''' @@ -97,7 +104,7 @@ class JQueryAutoCompleteWidget(forms.TextInput): 'attrs' : flatatt(final_attrs), 'js' : self.render_js(final_attrs['id']), } - + return mark_safe(html) @@ -105,6 +112,18 @@ class JQueryAutoCompleteField(forms.CharField): def __init__(self, source, options=None, *args, **kwargs): if 'widget' not in kwargs: kwargs['widget'] = JQueryAutoCompleteWidget(source, options) - + super(JQueryAutoCompleteField, self).__init__(*args, **kwargs) +try: + # check for south + from south.modelsinspector import add_introspection_rules + + add_introspection_rules([ + ( + [JSONField], # Class(es) these apply to + [], # Positional arguments (not used) + {}, # Keyword argument + ), ], ["^catalogue\.fields\.JSONField"]) +except ImportError: + pass diff --git a/apps/catalogue/forms.py b/apps/catalogue/forms.py index bf6b0df35..3aceb4f86 100644 --- a/apps/catalogue/forms.py +++ b/apps/catalogue/forms.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django import forms +from django.utils.translation import ugettext_lazy as _ from slughifi import slughifi from catalogue.models import Tag, Book @@ -10,18 +14,19 @@ from catalogue import utils class BookImportForm(forms.Form): book_xml_file = forms.FileField() - def save(self, commit=True): - return Book.from_xml_file(self.cleaned_data['book_xml_file'], overwrite=True) + def save(self, commit=True, **kwargs): + return Book.from_xml_file(self.cleaned_data['book_xml_file'], overwrite=True, **kwargs) class SearchForm(forms.Form): - q = JQueryAutoCompleteField('/katalog/tags/', {'minChars': 2, 'selectFirst': True, 'cacheLength': 50}) + q = JQueryAutoCompleteField('/katalog/tags/', {'minChars': 2, 'selectFirst': True, 'cacheLength': 50, 'matchContains': "word"}) tags = forms.CharField(widget=forms.HiddenInput, required=False) - + def __init__(self, *args, **kwargs): tags = kwargs.pop('tags', []) super(SearchForm, self).__init__(*args, **kwargs) - self.fields['q'].widget.attrs['title'] = u'tytuł, autor, motyw/temat, epoka, rodzaj, gatunek' + self.fields['q'].widget.attrs['title'] = _('title, author, theme/topic, epoch, kind, genre') + #self.fields['q'].widget.attrs['style'] = '' self.fields['tags'].initial = '/'.join(tag.slug for tag in Tag.get_tag_list(tags)) @@ -34,29 +39,29 @@ class UserSetsForm(forms.Form): class ObjectSetsForm(forms.Form): - def __init__(self, obj, user, *args, **kwargs): + def __init__(self, obj, user, *args, **kwargs): super(ObjectSetsForm, self).__init__(*args, **kwargs) self.fields['set_ids'] = forms.MultipleChoiceField( - label=u'Półki', + label=_('Shelves'), required=False, - choices=[(tag.id, "%s (%s)" % (tag.name, tag.book_count)) for tag in Tag.objects.filter(category='set', user=user)], + choices=[(tag.id, "%s (%s)" % (tag.name, tag.get_count())) for tag in Tag.objects.filter(category='set', user=user)], initial=[tag.id for tag in obj.tags.filter(category='set', user=user)], widget=forms.CheckboxSelectMultiple ) - + class NewSetForm(forms.Form): name = forms.CharField(max_length=50, required=True) - + def __init__(self, *args, **kwargs): super(NewSetForm, self).__init__(*args, **kwargs) - self.fields['name'].widget.attrs['title'] = u'nazwa nowej półki' - + self.fields['name'].widget.attrs['title'] = _('Name of the new shelf') + def save(self, user, commit=True): name = self.cleaned_data['name'] new_set = Tag(name=name, slug=utils.get_random_hash(name), sort_key=slughifi(name), category='set', user=user) - + new_set.save() return new_set @@ -67,12 +72,13 @@ FORMATS = ( ('pdf', 'PDF'), ('odt', 'ODT'), ('txt', 'TXT'), + ('epub', 'EPUB'), ) class DownloadFormatsForm(forms.Form): formats = forms.MultipleChoiceField(required=False, choices=FORMATS, widget=forms.CheckboxSelectMultiple) - + def __init__(self, *args, **kwargs): super(DownloadFormatsForm, self).__init__(*args, **kwargs) diff --git a/apps/catalogue/locale/de/LC_MESSAGES/django.mo b/apps/catalogue/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 000000000..3e56cd153 Binary files /dev/null and b/apps/catalogue/locale/de/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/de/LC_MESSAGES/django.po b/apps/catalogue/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..575defb5f --- /dev/null +++ b/apps/catalogue/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,280 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-08-25 10:45\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.6\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Geben Sie eine gültige JSON-Wert. Fehler:% s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "Titel, Autor, Motiv/Thema, Epoche, Art, Gattung" + +#: forms.py:45 +msgid "Shelves" +msgstr "Bücherregale" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Name für ein neues Bücherregal" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "Autor" + +#: models.py:26 +msgid "epoch" +msgstr "Epoche" + +#: models.py:27 +msgid "kind" +msgstr "Art" + +#: models.py:28 +msgid "genre" +msgstr "Gattung" + +#: models.py:29 +msgid "theme" +msgstr "Motiv" + +#: models.py:30 +msgid "set" +msgstr "Bücherregal" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "Buch" + +#: models.py:45 +msgid "name" +msgstr "Name" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "slug" + +#: models.py:47 +msgid "sort key" +msgstr "Sortierschlüssel" + +#: models.py:48 +msgid "category" +msgstr "Kategorie" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "Beschreibung" + +#: models.py:51 +msgid "main page" +msgstr "Startseite" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Tag für die Startseite anzeigen" + +#: models.py:54 +msgid "book count" +msgstr "Anzahl der Bücher" + +#: models.py:55 +msgid "year of death" +msgstr "Todesjahr" + +#: models.py:71 +msgid "tag" +msgstr "tag" + +#: models.py:72 +msgid "tags" +msgstr "tags" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "Titel" + +#: models.py:172 +msgid "creation date" +msgstr "Erstellungsdatum" + +#: models.py:173 +msgid "short HTML" +msgstr "kurze HTML" + +#: models.py:174 +msgid "parent number" +msgstr "Nummer der Eltern" + +#: models.py:175 +msgid "extra information" +msgstr "extra Informationen" + +#: models.py:181 +msgid "XML file" +msgstr "XML-Datei" + +#: models.py:182 +msgid "HTML file" +msgstr "HTML-Datei" + +#: models.py:183 +msgid "PDF file" +msgstr "PDF-Datei" + +#: models.py:184 +msgid "EPUB file" +msgstr "EPUB-Datei" + +#: models.py:185 +msgid "ODT file" +msgstr "ODT-Datei" + +#: models.py:186 +msgid "TXT file" +msgstr "TXT-Datei" + +#: models.py:187 +msgid "MP3 file" +msgstr "MP3-Datei" + +#: models.py:188 +msgid "OGG file" +msgstr "OGG-Datei" + +#: models.py:205 +msgid "books" +msgstr "Bücher" + +#: models.py:263 +msgid "Read online" +msgstr "Online lesen" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Buch %s bereits vorhanden" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Buch mit slug = \"%s\" nicht vorhanden." + +#: models.py:565 +msgid "fragment" +msgstr "Auszug" + +#: models.py:566 +msgid "fragments" +msgstr "Auszüge" + +#: models.py:586 +msgid "goes to public domain" +msgstr "gehe zur Public Domain" + +#: models.py:588 +msgid "translator" +msgstr "Übersetzer" + +#: models.py:589 +msgid "year of translator's death" +msgstr "Todesjahr des Übersetzers" + +#: models.py:593 +msgid "book stub" +msgstr "Buch Vorschau" + +#: models.py:594 +msgid "book stubs" +msgstr "Bücher Vorschau" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +#, fuzzy +msgid "time" +msgstr "" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Um die Bücherregale zu verwalten, musst du eingeloggt sein.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Bücherregale wurden erfolgreich gespeichert.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "Das Buch wurde erfolgreich entfernt" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Das Buch ist nicht im Regal" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Büchrregal %s wurde erfolgreich erstellt

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Bücherregal%s wurde erfolgreich entfernt

" + +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Ein Fehler ist aufgetreten: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "Buch wurde erfolgreich importiert" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Fehler beim Importieren der Datei: %r" + +#~ msgid "Today is %(month)s, %(day)s." +#~ msgstr "Heute ist %(month)s, %(day)s." + +#~ msgid "content type" +#~ msgstr "Inhaltstyp" + +#~ msgid "object id" +#~ msgstr "Objekt ID" diff --git a/apps/catalogue/locale/en/LC_MESSAGES/django.mo b/apps/catalogue/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 000000000..45ddee8f4 Binary files /dev/null and b/apps/catalogue/locale/en/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/en/LC_MESSAGES/django.po b/apps/catalogue/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..fe91865df --- /dev/null +++ b/apps/catalogue/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,279 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-08-25 10:45\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.6\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Enter a valid JSON value. Error: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "title, author, motifs/theme, period, form, genre" + +#: forms.py:45 +msgid "Shelves" +msgstr "Shelves" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Name of the new shelf" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "author" + +#: models.py:26 +msgid "epoch" +msgstr "period" + +#: models.py:27 +msgid "kind" +msgstr "form" + +#: models.py:28 +msgid "genre" +msgstr "genre" + +#: models.py:29 +msgid "theme" +msgstr "motif" + +#: models.py:30 +msgid "set" +msgstr "set" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "book" + +#: models.py:45 +msgid "name" +msgstr "name" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "Slug" + +#: models.py:47 +msgid "sort key" +msgstr "Sort key" + +#: models.py:48 +msgid "category" +msgstr "Category" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "Description" + +#: models.py:51 +msgid "main page" +msgstr "Main page" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Show tag on main page" + +#: models.py:54 +msgid "book count" +msgstr "Number of books" + +#: models.py:55 +msgid "year of death" +msgstr "Year of death" + +#: models.py:71 +msgid "tag" +msgstr "tag" + +#: models.py:72 +msgid "tags" +msgstr "tags" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "Title" + +#: models.py:172 +msgid "creation date" +msgstr "Date of publication" + +#: models.py:173 +msgid "short HTML" +msgstr "short HTML" + +#: models.py:174 +msgid "parent number" +msgstr "Parent number" + +#: models.py:175 +msgid "extra information" +msgstr "Additional information" + +#: models.py:181 +msgid "XML file" +msgstr "XML file" + +#: models.py:182 +msgid "HTML file" +msgstr "HTML file" + +#: models.py:183 +msgid "PDF file" +msgstr "PDF file" + +#: models.py:184 +msgid "EPUB file" +msgstr "EPUB file" + +#: models.py:185 +msgid "ODT file" +msgstr "ODT file" + +#: models.py:186 +msgid "TXT file" +msgstr "TXT file" + +#: models.py:187 +msgid "MP3 file" +msgstr "MP3 file" + +#: models.py:188 +msgid "OGG file" +msgstr "OGG file" + +#: models.py:205 +msgid "books" +msgstr "Books" + +#: models.py:263 +msgid "Read online" +msgstr "Read online" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Book %s already exists" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Book with slug = \"%s\" does not exist." + +#: models.py:565 +msgid "fragment" +msgstr "Fragment" + +#: models.py:566 +msgid "fragments" +msgstr "Fragments" + +#: models.py:586 +msgid "goes to public domain" +msgstr "Goes to public domain" + +#: models.py:588 +msgid "translator" +msgstr "Translator" + +#: models.py:589 +msgid "year of translator's death" +msgstr "Year of translator's death" + +#: models.py:593 +msgid "book stub" +msgstr "Book stub" + +#: models.py:594 +msgid "book stubs" +msgstr "Book stubs" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +msgid "time" +msgstr "time" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

To administer your shelves you need to be logged in.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Shelves were sucessfully saved.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "Book was successfully removed from the shelf" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "This book is not on the shelf" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Shelf %s was successfully created

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Shelf %s was successfully removed

" + +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "Book imported succesfully" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Error occured while importing file: %r" + +#~ msgid "Today is %(month)s, %(day)s." +#~ msgstr "Today is %(month)s, %(day)s." + +#~ msgid "content type" +#~ msgstr "content type" + +#~ msgid "object id" +#~ msgstr "object id" diff --git a/apps/catalogue/locale/es/LC_MESSAGES/django.mo b/apps/catalogue/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 000000000..8f94d47d7 Binary files /dev/null and b/apps/catalogue/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/es/LC_MESSAGES/django.po b/apps/catalogue/locale/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..c105555b6 --- /dev/null +++ b/apps/catalogue/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,280 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-08-25 10:48\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.6\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Introduce un valor válido de JSON. Error: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "título, autor, tema/motivo, época, género, subgénero" + +#: forms.py:45 +msgid "Shelves" +msgstr "Estantes" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Nombre del estante nuevo" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "autor" + +#: models.py:26 +msgid "epoch" +msgstr "época" + +#: models.py:27 +msgid "kind" +msgstr "género" + +#: models.py:28 +msgid "genre" +msgstr "subgénero" + +#: models.py:29 +msgid "theme" +msgstr "tema" + +#: models.py:30 +msgid "set" +msgstr "colección" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "libro" + +#: models.py:45 +msgid "name" +msgstr "nombre" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "slug" + +#: models.py:47 +msgid "sort key" +msgstr "clave de clasificación" + +#: models.py:48 +msgid "category" +msgstr "categoría" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "descripción" + +#: models.py:51 +msgid "main page" +msgstr "página principal" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Mostrar tag en la página principal" + +#: models.py:54 +msgid "book count" +msgstr "número de los libros" + +#: models.py:55 +msgid "year of death" +msgstr "año de muerte" + +#: models.py:71 +msgid "tag" +msgstr "tag" + +#: models.py:72 +msgid "tags" +msgstr "tags" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "título" + +#: models.py:172 +msgid "creation date" +msgstr "fecha de creación" + +#: models.py:173 +msgid "short HTML" +msgstr "HTML corto" + +#: models.py:174 +msgid "parent number" +msgstr "cifra matriz" + +#: models.py:175 +msgid "extra information" +msgstr "informacion adiccional" + +#: models.py:181 +msgid "XML file" +msgstr "archivo XML" + +#: models.py:182 +msgid "HTML file" +msgstr "archivo HTML" + +#: models.py:183 +msgid "PDF file" +msgstr "archivo PDF" + +#: models.py:184 +msgid "EPUB file" +msgstr "archivo EPUB" + +#: models.py:185 +msgid "ODT file" +msgstr "archivo ODT" + +#: models.py:186 +msgid "TXT file" +msgstr "archivo TXT" + +#: models.py:187 +msgid "MP3 file" +msgstr "archivo MP3" + +#: models.py:188 +msgid "OGG file" +msgstr "archivo OGG" + +#: models.py:205 +msgid "books" +msgstr "libros" + +#: models.py:263 +msgid "Read online" +msgstr "Leer online" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Libro %s ya existe" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Libro con slug = \"%s\" no existe." + +#: models.py:565 +msgid "fragment" +msgstr "fragmento" + +#: models.py:566 +msgid "fragments" +msgstr "fragmentos" + +#: models.py:586 +msgid "goes to public domain" +msgstr "pasa al dominio público" + +#: models.py:588 +msgid "translator" +msgstr "traductor" + +#: models.py:589 +msgid "year of translator's death" +msgstr "año de la muerte del traductor" + +#: models.py:593 +msgid "book stub" +msgstr "vista previa del libro" + +#: models.py:594 +msgid "book stubs" +msgstr "vista previa de libros" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +#, fuzzy +msgid "time" +msgstr "" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +#, fuzzy +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Para organizar tus estantes tienes que ingresar.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Estantes han sido guardados.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "El libro ha sido eliminado del estante." + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Este libro no está en el estante" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Estante %s ha sido creado

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Estante %s ha sido eliminado

" + +# msgid "Today is %(month)s, %(day)s." +# msgstr "Hoy es el %(día)s de %(mes)es" +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Ha ocurrido un error: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "El libro ha sido importado." + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Ha ocurrido un error al cargar el archivo: %r" + +#~ msgid "content type" +#~ msgstr "tipo de contenido" + +#~ msgid "object id" +#~ msgstr "id de objeto" diff --git a/apps/catalogue/locale/fr/LC_MESSAGES/django.mo b/apps/catalogue/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..9f0caac13 Binary files /dev/null and b/apps/catalogue/locale/fr/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/fr/LC_MESSAGES/django.po b/apps/catalogue/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..1fb3e64f6 --- /dev/null +++ b/apps/catalogue/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,287 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-25 11:21+0200\n" +"PO-Revision-Date: 2010-08-07 20:25+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Entrer une valeur JSON valide. Erreur: %s." + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "titre, auteur, thème/sujet, époque, type, genre" + +#: forms.py:44 +msgid "Shelves" +msgstr "Etagères" + +#: forms.py:57 +msgid "Name of the new shelf" +msgstr "Nom de l'étagère nouvelle" + +#: models.py:24 +#: models.py:363 +msgid "author" +msgstr "auteur" + +#: models.py:25 +msgid "epoch" +msgstr "époque" + +#: models.py:26 +msgid "kind" +msgstr "type" + +#: models.py:27 +msgid "genre" +msgstr "genre" + +#: models.py:28 +msgid "theme" +msgstr "thème" + +#: models.py:29 +msgid "set" +msgstr "série" + +#: models.py:30 +#: models.py:322 +msgid "book" +msgstr "livre" + +#: models.py:44 +#: migrations/0001_initial.py:47 +msgid "name" +msgstr "nom" + +#: models.py:45 +#: models.py:103 +#: models.py:365 +#: migrations/0001_initial.py:19 +#: migrations/0001_initial.py:48 +msgid "slug" +msgstr "slug" + +#: models.py:46 +#: migrations/0001_initial.py:49 +msgid "sort key" +msgstr "critère de tri" + +#: models.py:47 +#: migrations/0001_initial.py:50 +msgid "category" +msgstr "catégorie" + +#: models.py:49 +#: models.py:60 +#: models.py:104 +#: models.py:185 +#: migrations/0001_initial.py:20 +#: migrations/0001_initial.py:51 +msgid "description" +msgstr "description" + +#: models.py:50 +#: migrations/0001_initial.py:52 +msgid "main page" +msgstr "page d'accueil" + +#: models.py:50 +#: migrations/0001_initial.py:52 +msgid "Show tag on main page" +msgstr "Montrer le tag au page d'accueil" + +#: models.py:53 +#: migrations/0001_initial.py:54 +msgid "book count" +msgstr "nombre des livres" + +#: models.py:54 +msgid "year of death" +msgstr "année de la mort" + +#: models.py:80 +#: migrations/0001_initial.py:61 +msgid "tag" +msgstr "tag" + +#: models.py:81 +msgid "tags" +msgstr "tags" + +#: models.py:102 +#: models.py:362 +#: migrations/0001_initial.py:18 +msgid "title" +msgstr "titre" + +#: models.py:105 +#: migrations/0001_initial.py:21 +msgid "creation date" +msgstr "date de création" + +#: models.py:106 +#: migrations/0001_initial.py:22 +msgid "short HTML" +msgstr "HTML court" + +#: models.py:107 +#: migrations/0001_initial.py:23 +msgid "parent number" +msgstr "nombre de parent" + +#: models.py:108 +msgid "extra information" +msgstr "information supplémentaire" + +#: models.py:114 +#: migrations/0001_initial.py:24 +msgid "XML file" +msgstr "fichier XML" + +#: models.py:115 +#: migrations/0001_initial.py:25 +msgid "HTML file" +msgstr "fichier HTML" + +#: models.py:116 +#: migrations/0001_initial.py:26 +msgid "PDF file" +msgstr "fichier PDF" + +#: models.py:117 +#: migrations/0001_initial.py:27 +msgid "ODT file" +msgstr "fichier ODT" + +#: models.py:118 +#: migrations/0001_initial.py:28 +msgid "TXT file" +msgstr "fichier TXT" + +#: models.py:119 +msgid "MP3 file" +msgstr "fichier MP3" + +#: models.py:120 +msgid "OGG file" +msgstr "fichier OGG" + +#: models.py:141 +msgid "Read online" +msgstr "Lire en ligne" + +#: models.py:221 +#, python-format +msgid "Book %s already exists" +msgstr "Livre %s existe déjà" + +#: models.py:264 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Livre au slug = \"%s\" n'existe pas." + +#: models.py:323 +msgid "books" +msgstr "livres" + +#: models.py:357 +msgid "fragment" +msgstr "extrait" + +#: models.py:358 +msgid "fragments" +msgstr "extraits" + +#: models.py:364 +msgid "goes to public domain" +msgstr "entre dans le domaine public" + +#: models.py:366 +msgid "translator" +msgstr "traducteur" + +#: models.py:367 +msgid "year of translator's death" +msgstr "année de la mort du traducteur" + +#: models.py:385 +msgid "book stub" +msgstr "ébauche du livre" + +#: models.py:386 +msgid "book stubs" +msgstr "ébauches des livres" + +#: views.py:339 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Connectez-vous pour gérer vos étagères.

" + +#: views.py:357 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Les étagères %sont été enregistrées

" + +#: views.py:381 +msgid "Book was successfully removed from the shelf" +msgstr "Le livre a été supprimé de l'étagère" + +#: views.py:383 +msgid "This book is not on the shelf" +msgstr "Le livre n'est pas sur l'étagère" + +#: views.py:479 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

L'étagère %sa été créée

" + +#: views.py:494 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

L'étagère %sa été supprimée

" + +#: views.py:553 +#, python-format +#msgid "Today is %(month)s, %(day)s." +#msgstr "Aujourd'hui nous sommes le" + +#: views.py:554 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Un erreur a eu lieu : %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:555 +msgid "Book imported successfully" +msgstr "Livre importé avec succès" + +#: views.py:557 +#, python-format +msgid "Error importing file: %r" +msgstr "Erreur dans l'importation du fichier: %r" + +#: migrations/0001_initial.py:62 +msgid "content type" +msgstr "type du contenu" + +#: migrations/0001_initial.py:63 +msgid "object id" +msgstr "ID de l'objet" + diff --git a/apps/catalogue/locale/lt/LC_MESSAGES/django.mo b/apps/catalogue/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..602cf55e5 Binary files /dev/null and b/apps/catalogue/locale/lt/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/lt/LC_MESSAGES/django.po b/apps/catalogue/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..03f79a58b --- /dev/null +++ b/apps/catalogue/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,280 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-07-12 19:07+0100\n" +"Last-Translator: Alicja Sinkiewicz \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Įvėsk atitinkama vertybę JSON. Klaida: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "Pavadinimas , autorius, motyvas /tema, gadynė, \trūšis, sortas" + +#: forms.py:45 +msgid "Shelves" +msgstr "Lentynos" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Naujos lentynos pavadinimas" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "autorius" + +#: models.py:26 +msgid "epoch" +msgstr "gadynė" + +#: models.py:27 +msgid "kind" +msgstr "rūšis" + +#: models.py:28 +msgid "genre" +msgstr "sortas" + +#: models.py:29 +msgid "theme" +msgstr "motyvas" + +#: models.py:30 +msgid "set" +msgstr "rinkinys" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "knyga" + +#: models.py:45 +msgid "name" +msgstr "pavadinimas" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "slugas" + +#: models.py:47 +msgid "sort key" +msgstr "rūšiavimo raktas" + +#: models.py:48 +msgid "category" +msgstr "kategorija " + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "aprašymas" + +#: models.py:51 +msgid "main page" +msgstr "pagrindinis puslapis" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Parodyk tagą pagrindinemę puslapyję" + +#: models.py:54 +msgid "book count" +msgstr "knygų skaičius" + +#: models.py:55 +msgid "year of death" +msgstr "mirimo metai" + +#: models.py:71 +msgid "tag" +msgstr "tagas" + +#: models.py:72 +msgid "tags" +msgstr "tagai" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "pavadinimas" + +#: models.py:172 +msgid "creation date" +msgstr "sukūrimo data" + +#: models.py:173 +msgid "short HTML" +msgstr "trumpas HTML" + +#: models.py:174 +msgid "parent number" +msgstr "vieno iš tėvų numeris " + +#: models.py:175 +msgid "extra information" +msgstr "papildomos informacijos" + +#: models.py:181 +msgid "XML file" +msgstr "XML failas " + +#: models.py:182 +msgid "HTML file" +msgstr "HTML failas" + +#: models.py:183 +msgid "PDF file" +msgstr "PDF failas" + +#: models.py:184 +#, fuzzy +msgid "EPUB file" +msgstr "PDF failas" + +#: models.py:185 +msgid "ODT file" +msgstr "ODT failas" + +#: models.py:186 +msgid "TXT file" +msgstr "TXT failsa" + +#: models.py:187 +msgid "MP3 file" +msgstr "MP3 failas" + +#: models.py:188 +msgid "OGG file" +msgstr "OGG failas" + +#: models.py:205 +msgid "books" +msgstr "knygos" + +#: models.py:263 +msgid "Read online" +msgstr "Skaityk online" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Knyga %s jau egzistuoja" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Knyga su slug = \"%s\" neegzistuoja." + +#: models.py:565 +msgid "fragment" +msgstr "fragmentas" + +#: models.py:566 +msgid "fragments" +msgstr "fragmentai" + +#: models.py:586 +msgid "goes to public domain" +msgstr "keliauja į viešą tinklapį " + +#: models.py:588 +msgid "translator" +msgstr "vertėjas" + +#: models.py:589 +msgid "year of translator's death" +msgstr "vertėjo mirimo metai" + +#: models.py:593 +msgid "book stub" +msgstr "knygos paskelbimas" + +#: models.py:594 +msgid "book stubs" +msgstr "knygu paskelbimai" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +#, fuzzy +msgid "time" +msgstr "motyvas" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Kad valdyti savo lentynom, turi prisijungti.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Lentynos liko užrašytos.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "pašalinta" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Lentynoje trūksta knygos" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Lentyna %s sukurta

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Lentyna %spašalinta

" + +# msgid "Today is %(month)s, %(day)s." +# msgstr "Šiandien yra %(mėnuo), %(diena)." +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Įvyko klaida: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "knygos importavimas" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Failo klaida imortavimo metu: %r" + +#~ msgid "content type" +#~ msgstr "turinio rūšis" + +#~ msgid "object id" +#~ msgstr "id obiektas" diff --git a/apps/catalogue/locale/pl/LC_MESSAGES/django.mo b/apps/catalogue/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..e138c2a8e Binary files /dev/null and b/apps/catalogue/locale/pl/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/pl/LC_MESSAGES/django.po b/apps/catalogue/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..0fcfc61bd --- /dev/null +++ b/apps/catalogue/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,270 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-08-25 11:02\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.6\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Wprowadź prawidłową wartość JSON. Błąd: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "tytuł, autor, motyw/temat, epoka, rodzaj, gatunek" + +#: forms.py:45 +msgid "Shelves" +msgstr "Półki" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "nazwa nowej półki" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "autor" + +#: models.py:26 +msgid "epoch" +msgstr "epoka" + +#: models.py:27 +msgid "kind" +msgstr "rodzaj" + +#: models.py:28 +msgid "genre" +msgstr "gatunek" + +#: models.py:29 +msgid "theme" +msgstr "motyw" + +#: models.py:30 +msgid "set" +msgstr "półka" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "książka" + +#: models.py:45 +msgid "name" +msgstr "nazwa" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "" + +#: models.py:47 +msgid "sort key" +msgstr "klucz sortowania" + +#: models.py:48 +msgid "category" +msgstr "kategoria" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "opis" + +#: models.py:51 +msgid "main page" +msgstr "strona główna" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Pokazuj tag na stronie głównej" + +#: models.py:54 +msgid "book count" +msgstr "liczba książek" + +#: models.py:55 +msgid "year of death" +msgstr "rok śmierci" + +#: models.py:71 +msgid "tag" +msgstr "tag" + +#: models.py:72 +msgid "tags" +msgstr "tagi" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "tytuł" + +#: models.py:172 +msgid "creation date" +msgstr "data utworzenia" + +#: models.py:173 +msgid "short HTML" +msgstr "krótki HTML" + +#: models.py:174 +msgid "parent number" +msgstr "numer rodzica" + +#: models.py:175 +msgid "extra information" +msgstr "dodatkowe informacje" + +#: models.py:181 +msgid "XML file" +msgstr "Plik XML" + +#: models.py:182 +msgid "HTML file" +msgstr "Plik HTML" + +#: models.py:183 +msgid "PDF file" +msgstr "Plik PDF" + +#: models.py:184 +msgid "EPUB file" +msgstr "Plik EPUB" + +#: models.py:185 +msgid "ODT file" +msgstr "Plik ODT" + +#: models.py:186 +msgid "TXT file" +msgstr "Plik TXT" + +#: models.py:187 +msgid "MP3 file" +msgstr "Plik MP3" + +#: models.py:188 +msgid "OGG file" +msgstr "Plik OGG" + +#: models.py:205 +msgid "books" +msgstr "książki" + +#: models.py:263 +msgid "Read online" +msgstr "Czytaj online" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Książka %s już istnieje" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Książki ο slug = \"%s\" nie istnieje." + +#: models.py:565 +msgid "fragment" +msgstr "fragment" + +#: models.py:566 +msgid "fragments" +msgstr "fragmenty" + +#: models.py:586 +msgid "goes to public domain" +msgstr "trafia do domeny publicznej" + +#: models.py:588 +msgid "translator" +msgstr "tłumacz" + +#: models.py:589 +msgid "year of translator's death" +msgstr "rok śmierci tłumacza" + +#: models.py:593 +msgid "book stub" +msgstr "zapowiedź książki" + +#: models.py:594 +msgid "book stubs" +msgstr "zapowiedzi książek" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +msgid "time" +msgstr "czas" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Aby zarządzać swoimi półkami, musisz się zalogować.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Półki zostały zapisane.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "Usunięto" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Książki nie ma na półce" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Półka %s została utworzona

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Półka %s została usunięta

" + +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Wystąpił błąd: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "Książka zaimportowana" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Błąd podczas importowania pliku: %r" diff --git a/apps/catalogue/locale/ru/LC_MESSAGES/django.mo b/apps/catalogue/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 000000000..ed1bfbe7d Binary files /dev/null and b/apps/catalogue/locale/ru/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/ru/LC_MESSAGES/django.po b/apps/catalogue/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..9652781ad --- /dev/null +++ b/apps/catalogue/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,280 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: 2010-08-25 11:02\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.6\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Ввести правильное JSON значение. Ошибка: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "Заглавие, автор, мотив/тема, эпоха, форма, жанр" + +#: forms.py:45 +msgid "Shelves" +msgstr "Полки" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Название новой полки" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "автор" + +#: models.py:26 +msgid "epoch" +msgstr "эпоха" + +#: models.py:27 +msgid "kind" +msgstr "форма" + +#: models.py:28 +msgid "genre" +msgstr "жанр" + +#: models.py:29 +msgid "theme" +msgstr "мотив" + +#: models.py:30 +msgid "set" +msgstr "набор" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "книга" + +#: models.py:45 +msgid "name" +msgstr "название" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "slug" + +#: models.py:47 +msgid "sort key" +msgstr "ключ сортировки " + +#: models.py:48 +msgid "category" +msgstr "категория" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "описание" + +#: models.py:51 +msgid "main page" +msgstr "главная страница" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Показать таг на главной странице" + +#: models.py:54 +msgid "book count" +msgstr "число книг" + +#: models.py:55 +msgid "year of death" +msgstr "год смерти" + +#: models.py:71 +msgid "tag" +msgstr "таг" + +#: models.py:72 +msgid "tags" +msgstr "таги" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "заглавие" + +#: models.py:172 +msgid "creation date" +msgstr "дата создания" + +#: models.py:173 +msgid "short HTML" +msgstr "короткий HTML" + +#: models.py:174 +msgid "parent number" +msgstr "номер родителя" + +#: models.py:175 +msgid "extra information" +msgstr "дополнительная информация" + +#: models.py:181 +msgid "XML file" +msgstr "XML файл" + +#: models.py:182 +msgid "HTML file" +msgstr "HTML файл" + +#: models.py:183 +msgid "PDF file" +msgstr "PDF файл" + +#: models.py:184 +msgid "EPUB file" +msgstr "EPUB файл" + +#: models.py:185 +msgid "ODT file" +msgstr "ODT файл" + +#: models.py:186 +msgid "TXT file" +msgstr "TXT файл" + +#: models.py:187 +msgid "MP3 file" +msgstr "MP3 файл" + +#: models.py:188 +msgid "OGG file" +msgstr "OGG файл" + +#: models.py:205 +msgid "books" +msgstr "книги" + +#: models.py:263 +msgid "Read online" +msgstr "Читать онлайн" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Книга %s уже существует" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Книга со slug = \"%s\" не существует." + +#: models.py:565 +msgid "fragment" +msgstr "фрагмент" + +#: models.py:566 +msgid "fragments" +msgstr "фрагменты" + +#: models.py:586 +msgid "goes to public domain" +msgstr "идти к публичной домене" + +#: models.py:588 +msgid "translator" +msgstr "переводчик" + +#: models.py:589 +msgid "year of translator's death" +msgstr "год смерти переводчика" + +#: models.py:593 +msgid "book stub" +msgstr "анонс книги" + +#: models.py:594 +msgid "book stubs" +msgstr "анонсы книги" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +#, fuzzy +msgid "time" +msgstr "мотив" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Зарегиструйтесь, чтобы сохранить свои полки.

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Полки - удачно сохранены.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "Книга была удачно удалена с полки" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Эта книга не находится на полке" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Полка %sбыла удачно создана

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Полка%sбыла удачно удалена." + +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Появилась ошибка: %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "Вы удачно заимпортировали книгу" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Ошибка импорта файла: %r" + +#~ msgid "Today is %(month)s, %(day)s." +#~ msgstr "Сегодня %(month)s, %(day)s." + +#~ msgid "content type" +#~ msgstr "тип содержания" + +#~ msgid "object id" +#~ msgstr "ID объекта" diff --git a/apps/catalogue/locale/uk/LC_MESSAGES/django.mo b/apps/catalogue/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 000000000..3edab2dac Binary files /dev/null and b/apps/catalogue/locale/uk/LC_MESSAGES/django.mo differ diff --git a/apps/catalogue/locale/uk/LC_MESSAGES/django.po b/apps/catalogue/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 000000000..9ad16402b --- /dev/null +++ b/apps/catalogue/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,280 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-25 10:24+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: fields.py:47 +#, python-format +msgid "Enter a valid JSON value. Error: %s" +msgstr "Введіть правильну вартість JSON. Помилка: %s" + +#: forms.py:28 +msgid "title, author, theme/topic, epoch, kind, genre" +msgstr "заголовок, автор, тема, епоха, рід, жанр" + +#: forms.py:45 +msgid "Shelves" +msgstr "Полиці" + +#: forms.py:58 +msgid "Name of the new shelf" +msgstr "Назва нової полиці" + +#: models.py:25 models.py:585 +msgid "author" +msgstr "автор" + +#: models.py:26 +msgid "epoch" +msgstr "епоха" + +#: models.py:27 +msgid "kind" +msgstr "рід" + +#: models.py:28 +msgid "genre" +msgstr "жанр" + +#: models.py:29 +msgid "theme" +msgstr "тема" + +#: models.py:30 +msgid "set" +msgstr "вибір" + +#: models.py:31 models.py:204 +msgid "book" +msgstr "книжка" + +#: models.py:45 +msgid "name" +msgstr "назва" + +#: models.py:46 models.py:170 models.py:587 models.py:612 +msgid "slug" +msgstr "слуґ" + +#: models.py:47 +msgid "sort key" +msgstr "ключ сортування" + +#: models.py:48 +msgid "category" +msgstr "категорія" + +#: models.py:50 models.py:87 models.py:171 models.py:306 +msgid "description" +msgstr "опис" + + +#: models.py:51 +msgid "main page" +msgstr "головна сторінка" + +#: models.py:51 +msgid "Show tag on main page" +msgstr "Показати теґ на головній сторінці" + +#: models.py:54 +msgid "book count" +msgstr "кількість книжок" + +#: models.py:55 +msgid "year of death" +msgstr "дата смерті" + +#: models.py:71 +msgid "tag" +msgstr "теґ" + +#: models.py:72 +msgid "tags" +msgstr "теґи" + +#: models.py:169 models.py:584 +msgid "title" +msgstr "заголовок" + +#: models.py:172 +msgid "creation date" +msgstr "дата створення" + +#: models.py:173 +msgid "short HTML" +msgstr "короткий HTML" + +#: models.py:174 +msgid "parent number" +msgstr "номер батька" + +#: models.py:175 +msgid "extra information" +msgstr "додаткова інформація" + +#: models.py:181 +msgid "XML file" +msgstr "файл XML" + +#: models.py:182 +msgid "HTML file" +msgstr "файл HTML" + +#: models.py:183 +msgid "PDF file" +msgstr "файл PDF" + +#: models.py:184 +msgid "EPUB file" +msgstr "" + +#: models.py:185 +msgid "ODT file" +msgstr "файл ODT" + +#: models.py:186 +msgid "TXT file" +msgstr "файл TXT" + +#: models.py:187 +msgid "MP3 file" +msgstr "файл MP3" + +#: models.py:188 +msgid "OGG file" +msgstr "файл OGG" + + +#: models.py:263 +msgid "Read online" +msgstr "Читати онлайн" + +#: models.py:403 +#, python-format +msgid "Book %s already exists" +msgstr "Книжка %s вже існує" + +#: models.py:444 +#, python-format +msgid "Book with slug = \"%s\" does not exist." +msgstr "Книжки зі слуґом = \"%s\" не існує." + +#: models.py:323 +msgid "books" +msgstr "книжки" + +#: models.py:565 +msgid "fragment" +msgstr "фрагмент" + +#: models.py:566 +msgid "fragments" +msgstr "фрагменти" + +#: models.py:586 +msgid "goes to public domain" +msgstr "входить у суспільне надбання" + +#: models.py:588 +msgid "translator" +msgstr "перекладач" + +#: models.py:589 +msgid "year of translator's death" +msgstr "рік смерті перекладача" + +#: models.py:593 +msgid "book stub" +msgstr "заготовка книжки" + +#: models.py:594 +msgid "book stubs" +msgstr "заготовки книжок" + +#: models.py:613 +msgid "type" +msgstr "" + +#: models.py:614 +msgid "sha-1 hash" +msgstr "" + +#: models.py:615 +msgid "time" +msgstr "" + +#: models.py:619 +msgid "file record" +msgstr "" + +#: models.py:620 +msgid "file records" +msgstr "" + +#: views.py:452 +msgid "

To maintain your shelves you need to be logged in.

" +msgstr "

Щоб управляти своїми полицями, увійдть в акаунт

" + +#: views.py:470 +msgid "

Shelves were sucessfully saved.

" +msgstr "

Полиці успішно збережено.

" + +#: views.py:494 +msgid "Book was successfully removed from the shelf" +msgstr "Книжку було успішно видалено з полиці" + +#: views.py:496 +msgid "This book is not on the shelf" +msgstr "Цієї книжки немає на полиці" + +#: views.py:599 +#, python-format +msgid "

Shelf %s was successfully created

" +msgstr "

Полицю %s успішно створено

" + +#: views.py:614 +#, python-format +msgid "

Shelf %s was successfully removed

" +msgstr "

Полицю %s успішно видалено

" + + +#: views.py:673 +#, python-format +msgid "" +"An error occurred: %(exception)s\n" +"\n" +"%(tb)s" +msgstr "" +"Система виявила помилку %(exception)s\n" +"\n" +"%(tb)s" + +#: views.py:674 +msgid "Book imported successfully" +msgstr "Книжку успіщно завантажено" + +#: views.py:676 +#, python-format +msgid "Error importing file: %r" +msgstr "Помилка в завантаженні файла: %r" + +#: migrations/0001_initial.py:62 +msgid "content type" +msgstr "тип змісту" + +#: migrations/0001_initial.py:63 +msgid "object id" +msgstr "ІД об'єкту" diff --git a/apps/catalogue/management/commands/importbooks.py b/apps/catalogue/management/commands/importbooks.py index 0aa808137..ee469ba9b 100644 --- a/apps/catalogue/management/commands/importbooks.py +++ b/apps/catalogue/management/commands/importbooks.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import os import sys from optparse import make_option @@ -35,34 +39,38 @@ class Command(BaseCommand): files_imported = 0 files_skipped = 0 - + for dir_name in directories: if not os.path.isdir(dir_name): print self.style.ERROR("%s: Not a directory. Skipping." % dir_name) else: - for file_name in os.listdir(dir_name): + for file_name in sorted(os.listdir(dir_name)): file_path = os.path.join(dir_name, file_name) file_base, ext = os.path.splitext(file_path) - + # Skip files that are not XML files if not ext == '.xml': continue - + if verbose > 0: print "Parsing '%s'" % file_path else: sys.stdout.write('.') sys.stdout.flush() - + # Import book files try: book = Book.from_xml_file(file_path, overwrite=force) files_imported += 1 - + if os.path.isfile(file_base + '.pdf'): book.pdf_file.save('%s.pdf' % book.slug, File(file(file_base + '.pdf'))) if verbose: - print "Importing %s.pdf" % file_base + print "Importing %s.pdf" % file_base + if os.path.isfile(file_base + '.epub'): + book.epub_file.save('%s.epub' % book.slug, File(file(file_base + '.epub'))) + if verbose: + print "Importing %s.epub" % file_base if os.path.isfile(file_base + '.odt'): book.odt_file.save('%s.odt' % book.slug, File(file(file_base + '.odt'))) if verbose: @@ -79,20 +87,20 @@ class Command(BaseCommand): book.ogg_file.save('%s.ogg' % book.slug, File(file(os.path.join(dir_name, book.slug + '.ogg')))) if verbose: print "Importing %s.ogg" % book.slug - + book.save() - + except Book.AlreadyExists, msg: print self.style.ERROR('%s: Book already imported. Skipping. To overwrite use --force.' % file_path) files_skipped += 1 - + # Print results print print "Results: %d files imported, %d skipped, %d total." % ( files_imported, files_skipped, files_imported + files_skipped) print - + transaction.commit() transaction.leave_transaction_management() diff --git a/apps/catalogue/migrations/0001_initial.py b/apps/catalogue/migrations/0001_initial.py index 3b16076fd..2aabb8237 100644 --- a/apps/catalogue/migrations/0001_initial.py +++ b/apps/catalogue/migrations/0001_initial.py @@ -1,73 +1,182 @@ -from django.db import models -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.models import User +# encoding: utf-8 +import datetime from south.db import db +from south.v2 import SchemaMigration +from django.db import models +class Migration(SchemaMigration): -# Mock gettext -_ = lambda s: s + def forwards(self, orm): + + # Adding model 'Tag' + db.create_table('catalogue_tag', ( + ('category', self.gf('django.db.models.fields.CharField')(max_length=50, db_index=True)), + ('gazeta_link', self.gf('django.db.models.fields.CharField')(max_length=240, blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('main_page', self.gf('django.db.models.fields.BooleanField')(default=False, db_index=True, blank=True)), + ('sort_key', self.gf('django.db.models.fields.SlugField')(max_length=120, db_index=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('wiki_link', self.gf('django.db.models.fields.CharField')(max_length=240, blank=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=120, db_index=True)), + ('book_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=50, db_index=True)), + )) + db.send_create_signal('catalogue', ['Tag']) + + # Adding model 'TagRelation' + db.create_table('catalogue_tag_relation', ( + ('tag', self.gf('django.db.models.fields.related.ForeignKey')(related_name='items', to=orm['catalogue.Tag'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), + )) + db.send_create_signal('catalogue', ['TagRelation']) + # Adding unique constraint on 'TagRelation', fields ['tag', 'content_type', 'object_id'] + db.create_unique('catalogue_tag_relation', ['tag_id', 'content_type_id', 'object_id']) -class Migration: - - def forwards(self): - # Model 'Book' - Book = db.mock_model(model_name='Book', db_table='catalogue_book', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField) + # Adding model 'Book' db.create_table('catalogue_book', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('title', models.CharField(_('title'), max_length=120)), - ('slug', models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)), - ('description', models.TextField(_('description'), blank=True)), - ('created_at', models.DateTimeField(_('creation date'), auto_now=True)), - ('_short_html', models.TextField(_('short HTML'), editable=False)), - ('parent_number', models.IntegerField(_('parent number'), default=0)), - ('xml_file', models.FileField(_('XML file'), blank=True)), - ('html_file', models.FileField(_('HTML file'), blank=True)), - ('pdf_file', models.FileField(_('PDF file'), blank=True)), - ('odt_file', models.FileField(_('ODT file'), blank=True)), - ('txt_file', models.FileField(_('TXT file'), blank=True)), - ('parent', models.ForeignKey(Book, blank=True, null=True, related_name='children')), + ('parent', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='children', null=True, to=orm['catalogue.Book'])), + ('mp3_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('wiki_link', self.gf('django.db.models.fields.CharField')(max_length=240, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=120)), + ('txt_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('pdf_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('html_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('_short_html', self.gf('django.db.models.fields.TextField')()), + ('parent_number', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('ogg_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('odt_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=120, db_index=True)), + ('gazeta_link', self.gf('django.db.models.fields.CharField')(max_length=240, blank=True)), + ('extra_info', self.gf('catalogue.fields.JSONField')()), )) - - # Model 'Fragment' - Fragment = db.mock_model(model_name='Fragment', db_table='catalogue_fragment', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField) + db.send_create_signal('catalogue', ['Book']) + + # Adding model 'Fragment' db.create_table('catalogue_fragment', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('text', models.TextField()), - ('short_text', models.TextField(editable=False)), - ('_short_html', models.TextField(editable=False)), - ('anchor', models.CharField(max_length=120)), - ('book', models.ForeignKey(Book, related_name='fragments')), - )) - - # Model 'Tag' - Tag = db.mock_model(model_name='Tag', db_table='catalogue_tag', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField) - db.create_table('catalogue_tag', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('name', models.CharField(_('name'), max_length=50, db_index=True)), - ('slug', models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)), - ('sort_key', models.SlugField(_('sort key'), max_length=120, db_index=True)), - ('category', models.CharField(_('category'), max_length=50, blank=False, null=False, db_index=True)), - ('description', models.TextField(_('description'), blank=True)), - ('main_page', models.BooleanField(_('main page'), default=False, db_index=True, help_text=_('Show tag on main page'))), - ('user', models.ForeignKey(User, blank=True, null=True)), - ('book_count', models.IntegerField(_('book count'), default=0, blank=False, null=False)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('anchor', self.gf('django.db.models.fields.CharField')(max_length=120)), + ('_short_html', self.gf('django.db.models.fields.TextField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(related_name='fragments', to=orm['catalogue.Book'])), + ('short_text', self.gf('django.db.models.fields.TextField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), )) - - # Model 'TagRelation' - TagRelation = db.mock_model(model_name='TagRelation', db_table='catalogue_tag_relation', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField) - db.create_table('catalogue_tag_relation', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('tag', models.ForeignKey(Tag, verbose_name=_('tag'), related_name='items')), - ('content_type', models.ForeignKey(ContentType, verbose_name=_('content type'))), - ('object_id', models.PositiveIntegerField(_('object id'), db_index=True)), - )) - - db.send_create_signal('catalogue', ['Book','Fragment']) - - def backwards(self): - db.delete_table('catalogue_tag_relation') + db.send_create_signal('catalogue', ['Fragment']) + + + def backwards(self, orm): + + # Deleting model 'Tag' db.delete_table('catalogue_tag') - db.delete_table('catalogue_fragment') + + # Deleting model 'TagRelation' + db.delete_table('catalogue_tag_relation') + + # Removing unique constraint on 'TagRelation', fields ['tag', 'content_type', 'object_id'] + db.delete_unique('catalogue_tag_relation', ['tag_id', 'content_type_id', 'object_id']) + + # Deleting model 'Book' db.delete_table('catalogue_book') - + + # Deleting model 'Fragment' + db.delete_table('catalogue_fragment') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0002_add_extra_info_to_book.py b/apps/catalogue/migrations/0002_add_extra_info_to_book.py deleted file mode 100644 index 6de40ba94..000000000 --- a/apps/catalogue/migrations/0002_add_extra_info_to_book.py +++ /dev/null @@ -1,11 +0,0 @@ -from south.db import db -from catalogue.fields import JSONField - -class Migration: - - def forwards(self): - db.add_column('catalogue_book', 'extra_info', JSONField(null=True)) - - def backwards(self): - db.delete_column('catalogue_book', 'extra_info') - diff --git a/apps/catalogue/migrations/0002_auto__add_bookstub__add_field_tag_death.py b/apps/catalogue/migrations/0002_auto__add_bookstub__add_field_tag_death.py new file mode 100644 index 000000000..c278a83a0 --- /dev/null +++ b/apps/catalogue/migrations/0002_auto__add_bookstub__add_field_tag_death.py @@ -0,0 +1,137 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'BookStub' + db.create_table('catalogue_bookstub', ( + ('author', self.gf('django.db.models.fields.CharField')(max_length=120)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=120)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('translator', self.gf('django.db.models.fields.TextField')(blank=True)), + ('translator_death', self.gf('django.db.models.fields.TextField')(blank=True)), + ('pd', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=120, db_index=True)), + )) + db.send_create_signal('catalogue', ['BookStub']) + + # Adding field 'Tag.death' + db.add_column('catalogue_tag', 'death', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting model 'BookStub' + db.delete_table('catalogue_bookstub') + + # Deleting field 'Tag.death' + db.delete_column('catalogue_tag', 'death') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0003_add_mp3_and_ogg_files_to_book.py b/apps/catalogue/migrations/0003_add_mp3_and_ogg_files_to_book.py deleted file mode 100644 index 80d94c049..000000000 --- a/apps/catalogue/migrations/0003_add_mp3_and_ogg_files_to_book.py +++ /dev/null @@ -1,13 +0,0 @@ -from south.db import db -from django.db.models import FileField - -class Migration: - - def forwards(self): - db.add_column('catalogue_book', 'mp3_file', FileField(null=True)) - db.add_column('catalogue_book', 'ogg_file', FileField(null=True)) - - def backwards(self): - db.delete_column('catalogue_book', 'mp3_file') - db.delete_column('catalogue_book', 'ogg_file') - diff --git a/apps/catalogue/migrations/0003_fix_book_count_on_shelves.py b/apps/catalogue/migrations/0003_fix_book_count_on_shelves.py new file mode 100644 index 000000000..8180311b2 --- /dev/null +++ b/apps/catalogue/migrations/0003_fix_book_count_on_shelves.py @@ -0,0 +1,138 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import connection, models +qn = connection.ops.quote_name + +class Migration(DataMigration): + + def forwards(self, orm): + model = orm.Book + model_table = qn(model._meta.db_table) + for tag in orm.Tag.objects.exclude(user=None): + query = """ + SELECT COUNT(%(model_pk)s) -- count books + FROM %(model)s, %(tagged_item)s -- from books x tagged + WHERE + %(tagged_item)s.tag_id=%(tag_id)s -- get only the shelf + AND %(model_pk)s = %(tagged_item)s.object_id -- get only books on the shelf + GROUP BY %(tagged_item)s.tag_id""" % { + 'model_pk': '%s.%s' % (model_table, qn(model._meta.pk.column)), + 'model': model_table, + 'tagged_item': qn(orm.TagRelation._meta.db_table), + 'tag_id': tag.pk, + } + + cursor = connection.cursor() + cursor.execute(query) + book_count = (cursor.fetchone() or (0,))[0] + + tag.book_count = book_count + tag.save() + + def backwards(self, orm): + "Write your backwards methods here." + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0004_add_gazeta_links.py b/apps/catalogue/migrations/0004_add_gazeta_links.py deleted file mode 100644 index 1e8457d29..000000000 --- a/apps/catalogue/migrations/0004_add_gazeta_links.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from south.db import db -from django.db import models - - -class Migration: - def forwards(self): - db.add_column('catalogue_tag', 'gazeta_link', models.CharField(blank=True, max_length=240, default='')) - db.add_column('catalogue_book', 'gazeta_link', models.CharField(blank=True, max_length=240, default='')) - - def backwards(self): - db.delete_column('catalogue_tag', 'gazeta_link') - db.delete_column('catalogue_book', 'gazeta_link') diff --git a/apps/catalogue/migrations/0004_book_html_shorts_translations.py b/apps/catalogue/migrations/0004_book_html_shorts_translations.py new file mode 100644 index 000000000..d9e7b5303 --- /dev/null +++ b/apps/catalogue/migrations/0004_book_html_shorts_translations.py @@ -0,0 +1,172 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Book._short_html_en' + db.add_column('catalogue_book', '_short_html_en', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_es' + db.add_column('catalogue_book', '_short_html_es', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_de' + db.add_column('catalogue_book', '_short_html_de', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_fr' + db.add_column('catalogue_book', '_short_html_fr', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_uk' + db.add_column('catalogue_book', '_short_html_uk', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_pl' + db.add_column('catalogue_book', '_short_html_pl', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_ru' + db.add_column('catalogue_book', '_short_html_ru', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Book._short_html_lt' + db.add_column('catalogue_book', '_short_html_lt', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Book._short_html_en' + db.delete_column('catalogue_book', '_short_html_en') + + # Deleting field 'Book._short_html_es' + db.delete_column('catalogue_book', '_short_html_es') + + # Deleting field 'Book._short_html_de' + db.delete_column('catalogue_book', '_short_html_de') + + # Deleting field 'Book._short_html_fr' + db.delete_column('catalogue_book', '_short_html_fr') + + # Deleting field 'Book._short_html_uk' + db.delete_column('catalogue_book', '_short_html_uk') + + # Deleting field 'Book._short_html_pl' + db.delete_column('catalogue_book', '_short_html_pl') + + # Deleting field 'Book._short_html_ru' + db.delete_column('catalogue_book', '_short_html_ru') + + # Deleting field 'Book._short_html_lt' + db.delete_column('catalogue_book', '_short_html_lt') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0005_add_wiki_links.py b/apps/catalogue/migrations/0005_add_wiki_links.py deleted file mode 100644 index 3fb423ae3..000000000 --- a/apps/catalogue/migrations/0005_add_wiki_links.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from south.db import db -from django.db import models - - -class Migration: - def forwards(self): - db.add_column('catalogue_tag', 'wiki_link', models.CharField(blank=True, max_length=240, default='')) - db.add_column('catalogue_book', 'wiki_link', models.CharField(blank=True, max_length=240, default='')) - - def backwards(self): - db.delete_column('catalogue_tag', 'wiki_link') - db.delete_column('catalogue_book', 'wiki_link') diff --git a/apps/catalogue/migrations/0005_fragment_html_shorts_translations.py b/apps/catalogue/migrations/0005_fragment_html_shorts_translations.py new file mode 100644 index 000000000..8322b4c24 --- /dev/null +++ b/apps/catalogue/migrations/0005_fragment_html_shorts_translations.py @@ -0,0 +1,180 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Fragment._short_html_de' + db.add_column('catalogue_fragment', '_short_html_de', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_pl' + db.add_column('catalogue_fragment', '_short_html_pl', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_lt' + db.add_column('catalogue_fragment', '_short_html_lt', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_en' + db.add_column('catalogue_fragment', '_short_html_en', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_fr' + db.add_column('catalogue_fragment', '_short_html_fr', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_ru' + db.add_column('catalogue_fragment', '_short_html_ru', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_es' + db.add_column('catalogue_fragment', '_short_html_es', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + # Adding field 'Fragment._short_html_uk' + db.add_column('catalogue_fragment', '_short_html_uk', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Fragment._short_html_de' + db.delete_column('catalogue_fragment', '_short_html_de') + + # Deleting field 'Fragment._short_html_pl' + db.delete_column('catalogue_fragment', '_short_html_pl') + + # Deleting field 'Fragment._short_html_lt' + db.delete_column('catalogue_fragment', '_short_html_lt') + + # Deleting field 'Fragment._short_html_en' + db.delete_column('catalogue_fragment', '_short_html_en') + + # Deleting field 'Fragment._short_html_fr' + db.delete_column('catalogue_fragment', '_short_html_fr') + + # Deleting field 'Fragment._short_html_ru' + db.delete_column('catalogue_fragment', '_short_html_ru') + + # Deleting field 'Fragment._short_html_es' + db.delete_column('catalogue_fragment', '_short_html_es') + + # Deleting field 'Fragment._short_html_uk' + db.delete_column('catalogue_fragment', '_short_html_uk') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0006_epub_tag_counters_and_ltags_descendants.py b/apps/catalogue/migrations/0006_epub_tag_counters_and_ltags_descendants.py new file mode 100644 index 000000000..b990fc33f --- /dev/null +++ b/apps/catalogue/migrations/0006_epub_tag_counters_and_ltags_descendants.py @@ -0,0 +1,186 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +def get_ltag(book, orm): + ltag, created = orm.Tag.objects.get_or_create(slug='l-' + book.slug, category='book') + if created: + ltag.name = book.title + ltag.sort_key = ('l-' + book.slug)[:120] + ltag.save() + return ltag + + +class Migration(SchemaMigration): + + def forwards(self, orm): + """ Add _tag_counter and make sure all books carry their ancestors' l-tags """ + + # Adding fields + db.add_column('catalogue_book', '_tag_counter', self.gf('catalogue.fields.JSONField')(null=True)) + db.add_column('catalogue_book', '_theme_counter', self.gf('catalogue.fields.JSONField')(null=True)) + db.add_column('catalogue_book', 'epub_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False) + + def ltag_descendants(book, ltags=None): + if ltags is None: + ltags = [] + for tag in ltags: + orm.TagRelation(object_id=book.pk, tag=tag, content_type=book_ct).save() + print book, tag + ltag = get_ltag(book, orm) + for child in book.children.all(): + ltag_descendants(child, ltags + [ltag]) + + if not db.dry_run: + try: + book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book') + except: + return + # remove all l-tags on books + orm.TagRelation.objects.filter(content_type=book_ct, tag__category='book').delete() + for book in orm.Book.objects.filter(parent=None): + ltag_descendants(book) + + + def backwards(self, orm): + """ Delete _tag_counter and make sure books carry own l-tag. """ + + # Deleting fields + db.delete_column('catalogue_book', '_tag_counter') + db.delete_column('catalogue_book', '_theme_counter') + db.delete_column('catalogue_book', 'epub_file') + + if not db.dry_run: + try: + book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book') + except: + return + # remove all l-tags on books + orm.TagRelation.objects.filter(content_type=book_ct, tag__category='book').delete() + for book in orm.Book.objects.filter(parent=None): + orm.TagRelation(object_id=book.pk, tag=get_ltag(book, orm), content_type=book_ct).save() + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0007_remove_empty_html.py b/apps/catalogue/migrations/0007_remove_empty_html.py new file mode 100644 index 000000000..5b6f45393 --- /dev/null +++ b/apps/catalogue/migrations/0007_remove_empty_html.py @@ -0,0 +1,146 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + """ Look for HTML files without any real content and delete them """ + from lxml import etree + from librarian.html import html_has_content + + for book in orm.Book.objects.exclude(html_file=''): + if not html_has_content(etree.parse(book.html_file)): + book.html_file.delete() + # must do it by hand, we don't see real Book.save + for key in filter(lambda x: x.startswith('_short_html'), book.__dict__): + book.__setattr__(key, '') + book.save() + + def backwards(self, orm): + """ Do nothing. We don't want empty HTML files anyway. """ + pass + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0008_unique_tag_category_slug.py b/apps/catalogue/migrations/0008_unique_tag_category_slug.py new file mode 100644 index 000000000..d13081959 --- /dev/null +++ b/apps/catalogue/migrations/0008_unique_tag_category_slug.py @@ -0,0 +1,147 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Removing unique constraint on 'Tag', fields ['slug'] + db.delete_unique('catalogue_tag', ['slug']) + + # Adding unique constraint on 'Tag', fields ['category', 'slug'] + db.create_unique('catalogue_tag', ['category', 'slug']) + + + def backwards(self, orm): + + # Adding unique constraint on 'Tag', fields ['slug'] + db.create_unique('catalogue_tag', ['slug']) + + # Removing unique constraint on 'Tag', fields ['category', 'slug'] + db.delete_unique('catalogue_tag', ['category', 'slug']) + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'unique_together': "(('slug', 'category'),)", 'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0009_chg_book_count__heavy_cleaning.py b/apps/catalogue/migrations/0009_chg_book_count__heavy_cleaning.py new file mode 100644 index 000000000..ed4f2b370 --- /dev/null +++ b/apps/catalogue/migrations/0009_chg_book_count__heavy_cleaning.py @@ -0,0 +1,226 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Tag.book_count' + db.alter_column('catalogue_tag', 'book_count', self.gf('django.db.models.fields.IntegerField')(null=True)) + + if not db.dry_run: + from django.contrib.contenttypes.models import ContentType + from django.utils.simplejson import loads, dumps + + manager = orm.TagRelation.objects + + def type_id(model): + return ContentType.objects.get_for_model(model).pk + + def tagged_with_any(model, tags): + object_ids = {} + for relation in manager.filter(content_type=type_id(model), tag__in=tags): + object_ids[relation.object_id] = 1 + return model.objects.filter(pk__in=object_ids.keys()) + + def get_tags(instance): + return [relation.tag for relation in manager.filter( + content_type=type_id(type(instance)), object_id=instance.pk).select_related()] + + def refresh_book_count(tag): + if tag.category == 'theme': + objects = tagged_with_any(orm.Fragment, [tag]).only() + else: + objects = tagged_with_any(orm.Book, [tag]).only('slug') + if tag.category != 'set': + # eliminate descendants + l_tags = orm.Tag.objects.filter(slug__in=['l-'+book.slug for book in objects]) + descendants_keys = [book.pk for book in tagged_with_any(orm.Book, l_tags)] + if descendants_keys: + objects = objects.exclude(pk__in=descendants_keys) + tag.book_count = objects.count() + tag.save() + + def refresh_tag_counter(book): + tags = {} + for child in book.children.all().order_by(): + for tag_pk, value in tag_counter(child).iteritems(): + tags[tag_pk] = tags.get(tag_pk, 0) + value + for tag in [tag for tag in get_tags(book) if tag.category not in ('book', 'theme', 'set')]: + tags[tag.pk] = 1 + book._tag_counter = dumps(tags) + book.save() + return tags + + def tag_counter(book): + if book._tag_counter is None: + return refresh_tag_counter(book) + return dict((int(k), v) for k, v in loads(book._tag_counter).iteritems()) + + def theme_counter(book): + if book._theme_counter is None: + tags = {} + l_tag = orm.Tag.objects.get(slug='l-'+book.slug) + for fragment in tagged_with_any(orm.Fragment, [l_tag]): + for tag in [tag for tag in get_tags(fragment) if tag.category=='theme']: + tags[tag.pk] = tags.get(tag.pk, 0) + 1 + book._theme_counter = dumps(tags) + book.save() + + + # remove orphaned relations + book_type_id = type_id(orm.Book) + book_ids = [b.pk for b in orm.Book.objects.all().only()] + manager.filter(content_type=book_type_id).exclude(object_id__in=book_ids).delete() + del book_ids + + fragment_type_id = type_id(orm.Fragment) + fragment_ids = [b.pk for b in orm.Fragment.objects.all().only()] + manager.filter(content_type=fragment_type_id).exclude(object_id__in=fragment_ids).delete() + del fragment_ids + + tag_ids = [t.pk for t in orm.Tag.objects.all().only()] + manager.exclude(tag__in=tag_ids).delete() + del tag_ids + + # remove theme tags for books + manager.filter(content_type=book_type_id).filter(tag__category='theme').delete() + + # reset count fields + for tag in orm.Tag.objects.exclude(category__in=('book', 'set')).iterator(): + refresh_book_count(tag) + for book in orm.Book.objects.all().iterator(): + theme_counter(book) + for book in orm.Book.objects.filter(parent=None).iterator(): + tag_counter(book) + + def backwards(self, orm): + + # Changing field 'Tag.book_count' + db.alter_column('catalogue_tag', 'book_count', self.gf('django.db.models.fields.IntegerField')()) + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'unique_together': "(('slug', 'category'),)", 'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/migrations/0010_auto__add_filerecord.py b/apps/catalogue/migrations/0010_auto__add_filerecord.py new file mode 100644 index 000000000..f072365f8 --- /dev/null +++ b/apps/catalogue/migrations/0010_auto__add_filerecord.py @@ -0,0 +1,156 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'FileRecord' + db.create_table('catalogue_filerecord', ( + ('time', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('sha1', self.gf('django.db.models.fields.CharField')(max_length=40)), + ('type', self.gf('django.db.models.fields.CharField')(max_length=20, db_index=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(max_length=120, db_index=True)), + )) + db.send_create_signal('catalogue', ['FileRecord']) + + + def backwards(self, orm): + + # Deleting model 'FileRecord' + db.delete_table('catalogue_filerecord') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'object_name': 'Book'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookstub': { + 'Meta': {'object_name': 'BookStub'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'catalogue.filerecord': { + 'Meta': {'object_name': 'FileRecord'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'sha1': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '20', 'db_index': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'object_name': 'Fragment'}, + '_short_html': ('django.db.models.fields.TextField', [], {}), + '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'unique_together': "(('slug', 'category'),)", 'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 2f4e7fe06..d3b24d379 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.db import models from django.db.models import permalink, Q from django.utils.translation import ugettext_lazy as _ @@ -6,13 +9,15 @@ from django.contrib.auth.models import User from django.core.files import File from django.template.loader import render_to_string from django.utils.safestring import mark_safe +from django.utils.translation import get_language from django.core.urlresolvers import reverse +from datetime import datetime -from newtagging.models import TagBase +from newtagging.models import TagBase, tags_updated from newtagging import managers from catalogue.fields import JSONField -from librarian import html, dcparser +from librarian import dcparser, html, epub, NoDublinCore from mutagen import id3 @@ -31,51 +36,129 @@ class TagSubcategoryManager(models.Manager): def __init__(self, subcategory): super(TagSubcategoryManager, self).__init__() self.subcategory = subcategory - + def get_query_set(self): return super(TagSubcategoryManager, self).get_query_set().filter(category=self.subcategory) class Tag(TagBase): name = models.CharField(_('name'), max_length=50, db_index=True) - slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) + slug = models.SlugField(_('slug'), max_length=120, db_index=True) sort_key = models.SlugField(_('sort key'), max_length=120, db_index=True) - category = models.CharField(_('category'), max_length=50, blank=False, null=False, + category = models.CharField(_('category'), max_length=50, blank=False, null=False, db_index=True, choices=TAG_CATEGORIES) description = models.TextField(_('description'), blank=True) main_page = models.BooleanField(_('main page'), default=False, db_index=True, help_text=_('Show tag on main page')) - + user = models.ForeignKey(User, blank=True, null=True) - book_count = models.IntegerField(_('book count'), default=0, blank=False, null=False) - gazeta_link = models.CharField(blank=True, max_length=240) - wiki_link = models.CharField(blank=True, max_length=240) - - def has_description(self): - return len(self.description) > 0 - has_description.short_description = _('description') - has_description.boolean = True + book_count = models.IntegerField(_('book count'), blank=False, null=True) + death = models.IntegerField(_(u'year of death'), blank=True, null=True) + gazeta_link = models.CharField(blank=True, max_length=240) + wiki_link = models.CharField(blank=True, max_length=240) + + categories_rev = { + 'autor': 'author', + 'epoka': 'epoch', + 'rodzaj': 'kind', + 'gatunek': 'genre', + 'motyw': 'theme', + 'polka': 'set', + } + categories_dict = dict((item[::-1] for item in categories_rev.iteritems())) - @permalink - def get_absolute_url(self): - return ('catalogue.views.tagged_object_list', [self.slug]) - class Meta: ordering = ('sort_key',) verbose_name = _('tag') verbose_name_plural = _('tags') - + unique_together = (("slug", "category"),) + def __unicode__(self): return self.name + def __repr__(self): + return "Tag(slug=%r)" % self.slug + + @permalink + def get_absolute_url(self): + return ('catalogue.views.tagged_object_list', [self.url_chunk]) + + def has_description(self): + return len(self.description) > 0 + has_description.short_description = _('description') + has_description.boolean = True + + def alive(self): + return self.death is None + + def in_pd(self): + """ tests whether an author is in public domain """ + return self.death is not None and self.goes_to_pd() <= datetime.now().year + + def goes_to_pd(self): + """ calculates the year of public domain entry for an author """ + return self.death + 71 if self.death is not None else None + + def get_count(self): + """ returns global book count for book tags, fragment count for themes """ + + if self.book_count is None: + if self.category == 'book': + # never used + objects = Book.objects.none() + elif self.category == 'theme': + objects = Fragment.tagged.with_all((self,)) + else: + objects = Book.tagged.with_all((self,)).order_by() + if self.category != 'set': + # eliminate descendants + l_tags = Tag.objects.filter(slug__in=[book.book_tag_slug() for book in objects]) + descendants_keys = [book.pk for book in Book.tagged.with_any(l_tags)] + if descendants_keys: + objects = objects.exclude(pk__in=descendants_keys) + self.book_count = objects.count() + self.save() + return self.book_count + @staticmethod def get_tag_list(tags): if isinstance(tags, basestring): - tag_slugs = tags.split('/') - return [Tag.objects.get(slug=slug) for slug in tag_slugs] + real_tags = [] + ambiguous_slugs = [] + category = None + tags_splitted = tags.split('/') + for index, name in enumerate(tags_splitted): + if name in Tag.categories_rev: + category = Tag.categories_rev[name] + else: + if category: + real_tags.append(Tag.objects.get(slug=name, category=category)) + category = None + else: + try: + real_tags.append(Tag.objects.exclude(category='book').get(slug=name)) + except Tag.MultipleObjectsReturned, e: + ambiguous_slugs.append(name) + + if category: + # something strange left off + raise Tag.DoesNotExist() + if ambiguous_slugs: + # some tags should be qualified + e = Tag.MultipleObjectsReturned() + e.tags = real_tags + e.ambiguous_slugs = ambiguous_slugs + raise e + else: + return real_tags else: return TagBase.get_tag_list(tags) + @property + def url_chunk(self): + return '/'.join((Tag.categories_dict[self.category], self.slug)) + +# TODO: why is this hard-coded ? def book_upload_path(ext): def get_dynamic_path(book, filename): return 'lektura/%s.%s' % (book.slug, ext) @@ -90,42 +173,98 @@ class Book(models.Model): _short_html = models.TextField(_('short HTML'), editable=False) parent_number = models.IntegerField(_('parent number'), default=0) extra_info = JSONField(_('extra information')) - gazeta_link = models.CharField(blank=True, max_length=240) - wiki_link = models.CharField(blank=True, max_length=240) + gazeta_link = models.CharField(blank=True, max_length=240) + wiki_link = models.CharField(blank=True, max_length=240) + - # Formats xml_file = models.FileField(_('XML file'), upload_to=book_upload_path('xml'), blank=True) html_file = models.FileField(_('HTML file'), upload_to=book_upload_path('html'), blank=True) pdf_file = models.FileField(_('PDF file'), upload_to=book_upload_path('pdf'), blank=True) + epub_file = models.FileField(_('EPUB file'), upload_to=book_upload_path('epub'), blank=True) odt_file = models.FileField(_('ODT file'), upload_to=book_upload_path('odt'), blank=True) txt_file = models.FileField(_('TXT file'), upload_to=book_upload_path('txt'), blank=True) mp3_file = models.FileField(_('MP3 file'), upload_to=book_upload_path('mp3'), blank=True) ogg_file = models.FileField(_('OGG file'), upload_to=book_upload_path('ogg'), blank=True) - + parent = models.ForeignKey('self', blank=True, null=True, related_name='children') - + objects = models.Manager() tagged = managers.ModelTaggedItemManager(Tag) tags = managers.TagDescriptor(Tag) - + _tag_counter = JSONField(null=True, editable=False) + _theme_counter = JSONField(null=True, editable=False) + + class AlreadyExists(Exception): + pass + + class Meta: + ordering = ('title',) + verbose_name = _('book') + verbose_name_plural = _('books') + + def __unicode__(self): + return self.title + + def save(self, force_insert=False, force_update=False, reset_short_html=True, refresh_mp3=True, **kwargs): + if reset_short_html: + # Reset _short_html during save + update = {} + for key in filter(lambda x: x.startswith('_short_html'), self.__dict__): + update[key] = '' + self.__setattr__(key, '') + # Fragment.short_html relies on book's tags, so reset it here too + self.fragments.all().update(**update) + + book = super(Book, self).save(force_insert, force_update) + + if refresh_mp3 and self.mp3_file: + print self.mp3_file, self.mp3_file.path + extra_info = self.get_extra_info_value() + extra_info.update(self.get_mp3_info()) + self.set_extra_info_value(extra_info) + book = super(Book, self).save(force_insert, force_update) + + return book + + @permalink + def get_absolute_url(self): + return ('catalogue.views.book_detail', [self.slug]) + @property def name(self): return self.title - + + def book_tag_slug(self): + return ('l-' + self.slug)[:120] + + def book_tag(self): + slug = self.book_tag_slug() + book_tag, created = Tag.objects.get_or_create(slug=slug, category='book') + if created: + book_tag.name = self.title[:50] + book_tag.sort_key = slug + book_tag.save() + return book_tag + def short_html(self): - if len(self._short_html): - return mark_safe(self._short_html) + key = '_short_html_%s' % get_language() + short_html = getattr(self, key) + + if short_html and len(short_html): + return mark_safe(short_html) else: tags = self.tags.filter(~Q(category__in=('set', 'theme', 'book'))) tags = [mark_safe(u'%s' % (tag.get_absolute_url(), tag.name)) for tag in tags] formats = [] if self.html_file: - formats.append(u'Czytaj online' % reverse('book_text', kwargs={'slug': self.slug})) + formats.append(u'%s' % (reverse('book_text', kwargs={'slug': self.slug}), _('Read online'))) if self.pdf_file: formats.append(u'PDF' % self.pdf_file.url) + if self.root_ancestor.epub_file: + formats.append(u'EPUB' % self.root_ancestor.epub_file.url) if self.odt_file: formats.append(u'ODT' % self.odt_file.url) if self.txt_file: @@ -134,109 +273,165 @@ class Book(models.Model): formats.append(u'MP3' % self.mp3_file.url) if self.ogg_file: formats.append(u'OGG' % self.ogg_file.url) - + formats = [mark_safe(format) for format in formats] - - self._short_html = unicode(render_to_string('catalogue/book_short.html', - {'book': self, 'tags': tags, 'formats': formats})) + + setattr(self, key, unicode(render_to_string('catalogue/book_short.html', + {'book': self, 'tags': tags, 'formats': formats}))) self.save(reset_short_html=False) - return mark_safe(self._short_html) - - def save(self, force_insert=False, force_update=False, reset_short_html=True): - if reset_short_html: - # Reset _short_html during save - self._short_html = '' - - book = super(Book, self).save(force_insert, force_update) - - if self.mp3_file: - print self.mp3_file, self.mp3_file.path - extra_info = self.get_extra_info_value() - extra_info.update(self.get_mp3_info()) - self.set_extra_info_value(extra_info) - book = super(Book, self).save(force_insert, force_update) - - return book - + return mark_safe(getattr(self, key)) + + + @property + def root_ancestor(self): + """ returns the oldest ancestor """ + + if not hasattr(self, '_root_ancestor'): + book = self + while book.parent: + book = book.parent + self._root_ancestor = book + return self._root_ancestor + + def get_mp3_info(self): """Retrieves artist and director names from audio ID3 tags.""" audio = id3.ID3(self.mp3_file.path) artist_name = ', '.join(', '.join(tag.text) for tag in audio.getall('TPE1')) director_name = ', '.join(', '.join(tag.text) for tag in audio.getall('TPE3')) return {'artist_name': artist_name, 'director_name': director_name} - + def has_description(self): return len(self.description) > 0 has_description.short_description = _('description') has_description.boolean = True - + def has_pdf_file(self): return bool(self.pdf_file) has_pdf_file.short_description = 'PDF' has_pdf_file.boolean = True - + + def has_epub_file(self): + return bool(self.epub_file) + has_epub_file.short_description = 'EPUB' + has_epub_file.boolean = True + def has_odt_file(self): return bool(self.odt_file) has_odt_file.short_description = 'ODT' has_odt_file.boolean = True - + def has_html_file(self): return bool(self.html_file) has_html_file.short_description = 'HTML' has_html_file.boolean = True - class AlreadyExists(Exception): - pass + def build_epub(self, remove_descendants=True): + """ (Re)builds the epub file. + If book has a parent, does nothing. + Unless remove_descendants is False, descendants' epubs are removed. + """ - @staticmethod - def from_xml_file(xml_file, overwrite=False): + from StringIO import StringIO + from hashlib import sha1 + from django.core.files.base import ContentFile + from librarian import DocProvider + + class BookImportDocProvider(DocProvider): + """ used for joined EPUBs """ + + def __init__(self, book): + self.book = book + + def by_slug(self, slug): + if slug == self.book.slug: + return self.book.xml_file + else: + return Book.objects.get(slug=slug).xml_file + + if self.parent: + # don't need an epub + return + + epub_file = StringIO() + try: + epub.transform(BookImportDocProvider(self), self.slug, epub_file) + self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue()), save=False) + self.save() + FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save() + except NoDublinCore: + pass + + book_descendants = list(self.children.all()) + while len(book_descendants) > 0: + child_book = book_descendants.pop(0) + if remove_descendants and child_book.has_epub_file(): + child_book.epub_file.delete() + # save anyway, to refresh short_html + child_book.save() + book_descendants += list(child_book.children.all()) + + + @classmethod + def from_xml_file(cls, xml_file, overwrite=False): + # use librarian to parse meta-data + book_info = dcparser.parse(xml_file) + + if not isinstance(xml_file, File): + xml_file = File(open(xml_file)) + + try: + return cls.from_text_and_meta(xml_file, book_info, overwrite) + finally: + xml_file.close() + + @classmethod + def from_text_and_meta(cls, raw_file, book_info, overwrite=False): from tempfile import NamedTemporaryFile from slughifi import slughifi from markupstring import MarkupString - + from django.core.files.storage import default_storage + # Read book metadata - book_info = dcparser.parse(xml_file) book_base, book_slug = book_info.url.rsplit('/', 1) book, created = Book.objects.get_or_create(slug=book_slug) - + if created: book_shelves = [] else: if not overwrite: - raise Book.AlreadyExists('Book %s already exists' % book_slug) + raise Book.AlreadyExists(_('Book %s already exists') % book_slug) # Save shelves for this book book_shelves = list(book.tags.filter(category='set')) - + book.title = book_info.title book.set_extra_info_value(book_info.to_dict()) book._short_html = '' book.save() - + book_tags = [] - for category in ('kind', 'genre', 'author', 'epoch'): - tag_name = getattr(book_info, category) - tag_sort_key = tag_name - if category == 'author': - tag_sort_key = tag_name.last_name - tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name - tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name)) - if created: - tag.name = tag_name - tag.sort_key = slughifi(tag_sort_key) - tag.category = category - tag.save() - book_tags.append(tag) - - book_tag, created = Tag.objects.get_or_create(slug=('l-' + book.slug)[:120]) - if created: - book_tag.name = book.title[:50] - book_tag.sort_key = ('l-' + book.slug)[:120] - book_tag.category = 'book' - book_tag.save() - book_tags.append(book_tag) - - book.tags = book_tags - + categories = (('kinds', 'kind'), ('genres', 'genre'), ('authors', 'author'), ('epochs', 'epoch')) + for field_name, category in categories: + try: + tag_names = getattr(book_info, field_name) + except: + tag_names = [getattr(book_info, category)] + for tag_name in tag_names: + tag_sort_key = tag_name + if category == 'author': + tag_sort_key = tag_name.last_name + tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name + tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name), category=category) + if created: + tag.name = tag_name + tag.sort_key = slughifi(tag_sort_key) + tag.save() + book_tags.append(tag) + + book.tags = book_tags + book_shelves + + book_tag = book.book_tag() + if hasattr(book_info, 'parts'): for n, part_url in enumerate(book_info.parts): base, slug = part_url.rsplit('/', 1) @@ -246,69 +441,112 @@ class Book(models.Model): child_book.parent_number = n child_book.save() except Book.DoesNotExist, e: - raise Book.DoesNotExist(u'Book with slug = "%s" does not exist.' % slug) - - book_descendants = list(book.children.all()) - while len(book_descendants) > 0: - child_book = book_descendants.pop(0) - for fragment in child_book.fragments.all(): - fragment.tags = set(list(fragment.tags) + [book_tag]) - book_descendants += list(child_book.children.all()) - + raise Book.DoesNotExist(_('Book with slug = "%s" does not exist.') % slug) + # Save XML and HTML files - if not isinstance(xml_file, File): - xml_file = File(file(xml_file)) - book.xml_file.save('%s.xml' % book.slug, xml_file, save=False) - + book.xml_file.save('%s.xml' % book.slug, raw_file, save=False) + html_file = NamedTemporaryFile() - if html.transform(book.xml_file.path, html_file): + if html.transform(book.xml_file.path, html_file, parse_dublincore=False): book.html_file.save('%s.html' % book.slug, File(html_file), save=False) - + # Extract fragments closed_fragments, open_fragments = html.extract_fragments(book.html_file.path) - book_themes = [] for fragment in closed_fragments.values(): - text = fragment.to_string() - short_text = '' - if (len(MarkupString(text)) > 240): - short_text = unicode(MarkupString(text)[:160]) - new_fragment, created = Fragment.objects.get_or_create(anchor=fragment.id, book=book, - defaults={'text': text, 'short_text': short_text}) - try: theme_names = [s.strip() for s in fragment.themes.split(',')] except AttributeError: continue themes = [] for theme_name in theme_names: - tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name)) + if not theme_name: + continue + tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme') if created: tag.name = theme_name tag.sort_key = slughifi(theme_name) - tag.category = 'theme' tag.save() themes.append(tag) + if not themes: + continue + + text = fragment.to_string() + short_text = '' + if (len(MarkupString(text)) > 240): + short_text = unicode(MarkupString(text)[:160]) + new_fragment, created = Fragment.objects.get_or_create(anchor=fragment.id, book=book, + defaults={'text': text, 'short_text': short_text}) + new_fragment.save() - new_fragment.tags = set(list(book.tags) + themes + [book_tag]) - book_themes += themes - - book_themes = set(book_themes) - book.tags = list(book.tags) + list(book_themes) + book_shelves - + new_fragment.tags = set(book_tags + themes + [book_tag]) + + book.build_epub(remove_descendants=False) + + book_descendants = list(book.children.all()) + # add l-tag to descendants and their fragments + # delete unnecessary EPUB files + while len(book_descendants) > 0: + child_book = book_descendants.pop(0) + child_book.tags = list(child_book.tags) + [book_tag] + if child_book.has_epub_file(): + child_book.epub_file.delete() + child_book.save() + for fragment in child_book.fragments.all(): + fragment.tags = set(list(fragment.tags) + [book_tag]) + book_descendants += list(child_book.children.all()) + + # refresh cache + book.tag_counter + book.theme_counter + book.save() return book - - @permalink - def get_absolute_url(self): - return ('catalogue.views.book_detail', [self.slug]) - - class Meta: - ordering = ('title',) - verbose_name = _('book') - verbose_name_plural = _('books') - def __unicode__(self): - return self.title + + def refresh_tag_counter(self): + tags = {} + for child in self.children.all().order_by(): + for tag_pk, value in child.tag_counter.iteritems(): + tags[tag_pk] = tags.get(tag_pk, 0) + value + for tag in self.tags.exclude(category__in=('book', 'theme', 'set')).order_by(): + tags[tag.pk] = 1 + self.set__tag_counter_value(tags) + self.save(reset_short_html=False, refresh_mp3=False) + return tags + + def reset_tag_counter(self): + self._tag_counter = None + self.save(reset_short_html=False, refresh_mp3=False) + if self.parent: + self.parent.reset_tag_counter() + + @property + def tag_counter(self): + if self._tag_counter is None: + return self.refresh_tag_counter() + return dict((int(k), v) for k, v in self.get__tag_counter_value().iteritems()) + + def refresh_theme_counter(self): + tags = {} + for fragment in Fragment.tagged.with_any([self.book_tag()]).order_by(): + for tag in fragment.tags.filter(category='theme').order_by(): + tags[tag.pk] = tags.get(tag.pk, 0) + 1 + self.set__theme_counter_value(tags) + self.save(reset_short_html=False, refresh_mp3=False) + return tags + + def reset_theme_counter(self): + self._theme_counter = None + self.save(reset_short_html=False, refresh_mp3=False) + if self.parent: + self.parent.reset_theme_counter() + + @property + def theme_counter(self): + if self._theme_counter is None: + return self.refresh_theme_counter() + return dict((int(k), v) for k, v in self.get__theme_counter_value().iteritems()) + class Fragment(models.Model): @@ -321,24 +559,83 @@ class Fragment(models.Model): objects = models.Manager() tagged = managers.ModelTaggedItemManager(Tag) tags = managers.TagDescriptor(Tag) - + + class Meta: + ordering = ('book', 'anchor',) + verbose_name = _('fragment') + verbose_name_plural = _('fragments') + + def get_absolute_url(self): + return '%s#m%s' % (reverse('book_text', kwargs={'slug': self.book.slug}), self.anchor) + def short_html(self): - if len(self._short_html): - return mark_safe(self._short_html) + key = '_short_html_%s' % get_language() + short_html = getattr(self, key) + if short_html and len(short_html): + return mark_safe(short_html) else: - book_authors = [mark_safe(u'%s' % (tag.get_absolute_url(), tag.name)) - for tag in self.book.tags if tag.category == 'author'] - - self._short_html = unicode(render_to_string('catalogue/fragment_short.html', - {'fragment': self, 'book': self.book, 'book_authors': book_authors})) + setattr(self, key, unicode(render_to_string('catalogue/fragment_short.html', + {'fragment': self}))) self.save() - return mark_safe(self._short_html) - + return mark_safe(getattr(self, key)) + + +class BookStub(models.Model): + title = models.CharField(_('title'), max_length=120) + author = models.CharField(_('author'), max_length=120) + pd = models.IntegerField(_('goes to public domain'), null=True, blank=True) + slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) + translator = models.TextField(_('translator'), blank=True) + translator_death = models.TextField(_('year of translator\'s death'), blank=True) + + class Meta: + ordering = ('title',) + verbose_name = _('book stub') + verbose_name_plural = _('book stubs') + + def __unicode__(self): + return self.title + + @permalink def get_absolute_url(self): - return '%s#m%s' % (reverse('book_text', kwargs={'slug': self.book.slug}), self.anchor) - + return ('catalogue.views.book_detail', [self.slug]) + + def in_pd(self): + return self.pd is not None and self.pd <= datetime.now().year + + @property + def name(self): + return self.title + + +class FileRecord(models.Model): + slug = models.SlugField(_('slug'), max_length=120, db_index=True) + type = models.CharField(_('type'), max_length=20, db_index=True) + sha1 = models.CharField(_('sha-1 hash'), max_length=40) + time = models.DateTimeField(_('time'), auto_now_add=True) + class Meta: - ordering = ('book', 'anchor',) - verbose_name = _('fragment') - verbose_name_plural = _('fragments') + ordering = ('-time','-slug', '-type') + verbose_name = _('file record') + verbose_name_plural = _('file records') + + def __unicode__(self): + return "%s %s.%s" % (self.sha1, self.slug, self.type) + + +def _tags_updated_handler(sender, affected_tags, **kwargs): + # reset tag global counter + Tag.objects.filter(pk__in=[tag.pk for tag in affected_tags]).update(book_count=None) + + # if book tags changed, reset book tag counter + if isinstance(sender, Book) and \ + Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\ + exclude(category__in=('book', 'theme', 'set')).count(): + sender.reset_tag_counter() + # if fragment theme changed, reset book theme counter + elif isinstance(sender, Fragment) and \ + Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\ + filter(category='theme').count(): + sender.book.reset_theme_counter() +tags_updated.connect(_tags_updated_handler) diff --git a/apps/catalogue/templatetags/catalogue_tags.py b/apps/catalogue/templatetags/catalogue_tags.py index d3f608ac9..6ad83a045 100644 --- a/apps/catalogue/templatetags/catalogue_tags.py +++ b/apps/catalogue/templatetags/catalogue_tags.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import feedparser import datetime @@ -8,6 +11,8 @@ from django.utils.encoding import smart_str from django.core.urlresolvers import reverse from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.db.models import Q +from django.conf import settings +from django.utils.translation import ugettext as _ register = template.Library() @@ -42,21 +47,42 @@ def capfirst(text): def simple_title(tags): - mapping = { - 'author': u'Autor', - 'theme': u'motyw', - 'epoch': u'epoka', - 'genre': u'gatunek', - 'kind': u'rodzaj', - 'set': u'półka', - } - title = [] for tag in tags: - title.append("%s: %s" % (mapping[tag.category], tag.name)) + title.append("%s: %s" % (_(tag.category), tag.name)) return capfirst(', '.join(title)) +def book_stub_title(book): + return ', '.join((book.author, book.title)) + + +@register.simple_tag +def book_title(book, html_links=False): + try: + names = list(book.tags.filter(category='author')) + except AttributeError: + return book_stub_title(book) + + books = [] + while book: + books.append(book) + book = book.parent + names.extend(reversed(books)) + + if html_links: + names = ['%s' % (tag.get_absolute_url(), tag.name) for tag in names] + else: + names = [tag.name for tag in names] + + return ', '.join(names) + + +@register.simple_tag +def book_title_html(book): + return book_title(book, html_links=True) + + @register.simple_tag def title_from_tags(tags): def split_tags(tags): @@ -64,46 +90,46 @@ def title_from_tags(tags): for tag in tags: result[tag.category] = tag return result - + # TODO: Remove this after adding flection mechanism return simple_title(tags) - + class Flection(object): def get_case(self, name, flection): return name flection = Flection() - + self = split_tags(tags) - + title = u'' - + # Specjalny przypadek oglądania wszystkich lektur na danej półce if len(self) == 1 and 'set' in self: return u'Półka %s' % self['set'] - + # Specjalny przypadek "Twórczość w pozytywizmie", wtedy gdy tylko epoka # jest wybrana przez użytkownika if 'epoch' in self and len(self) == 1: text = u'Twórczość w %s' % flection.get_case(unicode(self['epoch']), u'miejscownik') return capfirst(text) - + # Specjalny przypadek "Dramat w twórczości Sofoklesa", wtedy gdy podane # są tylko rodzaj literacki i autor if 'kind' in self and 'author' in self and len(self) == 2: - text = u'%s w twórczości %s' % (unicode(self['kind']), + text = u'%s w twórczości %s' % (unicode(self['kind']), flection.get_case(unicode(self['author']), u'dopełniacz')) return capfirst(text) - + # Przypadki ogólniejsze if 'theme' in self: title += u'Motyw %s' % unicode(self['theme']) - + if 'genre' in self: if 'theme' in self: title += u' w %s' % flection.get_case(unicode(self['genre']), u'miejscownik') else: title += unicode(self['genre']) - + if 'kind' in self or 'author' in self or 'epoch' in self: if 'genre' in self or 'theme' in self: if 'kind' in self: @@ -112,15 +138,27 @@ def title_from_tags(tags): title += u' w twórczości ' else: title += u'%s ' % unicode(self.get('kind', u'twórczość')) - + if 'author' in self: title += flection.get_case(unicode(self['author']), u'dopełniacz') elif 'epoch' in self: title += flection.get_case(unicode(self['epoch']), u'dopełniacz') - + return capfirst(title) +@register.simple_tag +def book_tree(book_list, books_by_parent): + text = "".join("
  • %s%s
  • " % ( + book.get_absolute_url(), book.title, book_tree(books_by_parent.get(book, ()), books_by_parent) + ) for book in book_list) + + if text: + return "
      %s
    " % text + else: + return '' + + @register.simple_tag def user_creation_form(): return RegistrationForm(prefix='registration').as_ul() @@ -135,7 +173,11 @@ def authentication_form(): def breadcrumbs(tags, search_form=True): from catalogue.forms import SearchForm context = {'tag_list': tags} - if search_form and len(tags) < 6: + try: + max_tag_list = settings.MAX_TAG_LIST + except AttributeError: + max_tag_list = -1 + if search_form and (max_tag_list == -1 or len(tags) < max_tag_list): context['search_form'] = SearchForm(tags=tags) return context @@ -144,7 +186,7 @@ def breadcrumbs(tags, search_form=True): def catalogue_url(parser, token): bits = token.split_contents() tag_name = bits[0] - + tags_to_add = [] tags_to_remove = [] for bit in bits[1:]: @@ -152,7 +194,7 @@ def catalogue_url(parser, token): tags_to_remove.append(bit[1:]) else: tags_to_add.append(bit) - + return CatalogueURLNode(tags_to_add, tags_to_remove) @@ -160,7 +202,7 @@ class CatalogueURLNode(Node): def __init__(self, tags_to_add, tags_to_remove): self.tags_to_add = [Variable(tag) for tag in tags_to_add] self.tags_to_remove = [Variable(tag) for tag in tags_to_remove] - + def render(self, context): tags_to_add = [] tags_to_remove = [] @@ -178,14 +220,14 @@ class CatalogueURLNode(Node): tags_to_remove += [t for t in tag] else: tags_to_remove.append(tag) - - tag_slugs = [tag.slug for tag in tags_to_add] + + tag_slugs = [tag.url_chunk for tag in tags_to_add] for tag in tags_to_remove: try: - tag_slugs.remove(tag.slug) + tag_slugs.remove(tag.url_chunk) except KeyError: pass - + if len(tag_slugs) > 0: return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)}) else: @@ -193,7 +235,7 @@ class CatalogueURLNode(Node): @register.inclusion_tag('catalogue/latest_blog_posts.html') -def latest_blog_posts(feed_url, posts_to_show=5): +def latest_blog_posts(feed_url, posts_to_show=5): try: feed = feedparser.parse(str(feed_url)) posts = [] @@ -222,11 +264,12 @@ def tag_list(tags, choices=None): @register.inclusion_tag('catalogue/folded_tag_list.html') def folded_tag_list(tags, choices=None): + tags = [tag for tag in tags if tag.count] if choices is None: choices = [] some_tags_hidden = False tag_count = len(tags) - + if tag_count == 1: one_tag = tags[0] else: diff --git a/apps/catalogue/templatetags/switch_tag.py b/apps/catalogue/templatetags/switch_tag.py new file mode 100644 index 000000000..72476bef0 --- /dev/null +++ b/apps/catalogue/templatetags/switch_tag.py @@ -0,0 +1,135 @@ +# Source: http://djangosnippets.org/snippets/967/ +# Author: adurdin +# Posted: August 13, 2008 +# +# +# We can use it based on djangosnippets Terms of Service: +# (http://djangosnippets.org/about/tos/) +# +# 2. That you grant any third party who sees the code you post +# a royalty-free, non-exclusive license to copy and distribute that code +# and to make and distribute derivative works based on that code. You may +# include license terms in snippets you post, if you wish to use +# a particular license (such as the BSD license or GNU GPL), but that +# license must permit royalty-free copying, distribution and modification +# of the code to which it is applied. + +from django import template +from django.template import Library, Node, VariableDoesNotExist + +register = Library() + + +@register.tag(name="switch") +def do_switch(parser, token): + """ + The ``{% switch %}`` tag compares a variable against one or more values in + ``{% case %}`` tags, and outputs the contents of the matching block. An + optional ``{% else %}`` tag sets off the default output if no matches + could be found:: + + {% switch result_count %} + {% case 0 %} + There are no search results. + {% case 1 %} + There is one search result. + {% else %} + Jackpot! Your search found {{ result_count }} results. + {% endswitch %} + + Each ``{% case %}`` tag can take multiple values to compare the variable + against:: + + {% switch username %} + {% case "Jim" "Bob" "Joe" %} + Me old mate {{ username }}! How ya doin? + {% else %} + Hello {{ username }} + {% endswitch %} + """ + bits = token.contents.split() + tag_name = bits[0] + if len(bits) != 2: + raise template.TemplateSyntaxError("'%s' tag requires one argument" % tag_name) + variable = parser.compile_filter(bits[1]) + + class BlockTagList(object): + # This is a bit of a hack, as it embeds knowledge of the behaviour + # of Parser.parse() relating to the "parse_until" argument. + def __init__(self, *names): + self.names = set(names) + def __contains__(self, token_contents): + name = token_contents.split()[0] + return name in self.names + + # Skip over everything before the first {% case %} tag + parser.parse(BlockTagList('case', 'endswitch')) + + cases = [] + token = parser.next_token() + got_case = False + got_else = False + while token.contents != 'endswitch': + nodelist = parser.parse(BlockTagList('case', 'else', 'endswitch')) + + if got_else: + raise template.TemplateSyntaxError("'else' must be last tag in '%s'." % tag_name) + + contents = token.contents.split() + token_name, token_args = contents[0], contents[1:] + + if token_name == 'case': + tests = map(parser.compile_filter, token_args) + case = (tests, nodelist) + got_case = True + else: + # The {% else %} tag + case = (None, nodelist) + got_else = True + cases.append(case) + token = parser.next_token() + + if not got_case: + raise template.TemplateSyntaxError("'%s' must have at least one 'case'." % tag_name) + + return SwitchNode(variable, cases) + +class SwitchNode(Node): + def __init__(self, variable, cases): + self.variable = variable + self.cases = cases + + def __repr__(self): + return "" + + def __iter__(self): + for tests, nodelist in self.cases: + for node in nodelist: + yield node + + def get_nodes_by_type(self, nodetype): + nodes = [] + if isinstance(self, nodetype): + nodes.append(self) + for tests, nodelist in self.cases: + nodes.extend(nodelist.get_nodes_by_type(nodetype)) + return nodes + + def render(self, context): + try: + value_missing = False + value = self.variable.resolve(context, True) + except VariableDoesNotExist: + no_value = True + value_missing = None + + for tests, nodelist in self.cases: + if tests is None: + return nodelist.render(context) + elif not value_missing: + for test in tests: + test_value = test.resolve(context, True) + if value == test_value: + return nodelist.render(context) + else: + return "" diff --git a/apps/catalogue/test_utils.py b/apps/catalogue/test_utils.py new file mode 100644 index 000000000..398a0fee2 --- /dev/null +++ b/apps/catalogue/test_utils.py @@ -0,0 +1,50 @@ +from django.conf import settings +from django.test import TestCase +import shutil +import tempfile +from slughifi import slughifi + +class WLTestCase(TestCase): + """ + Generic base class for tests. Adds settings freeze and clears MEDIA_ROOT. + """ + def setUp(self): + self._MEDIA_ROOT, settings.MEDIA_ROOT = settings.MEDIA_ROOT, tempfile.mkdtemp(prefix='djangotest_') + + def tearDown(self): + shutil.rmtree(settings.MEDIA_ROOT, True) + settings.MEDIA_ROOT = self._MEDIA_ROOT + +class PersonStub(object): + + def __init__(self, first_names, last_name): + self.first_names = first_names + self.last_name = last_name + + +class BookInfoStub(object): + + def __init__(self, **kwargs): + self.__dict = kwargs + + def __setattr__(self, key, value): + if not key.startswith('_'): + self.__dict[key] = value + return object.__setattr__(self, key, value) + + def __getattr__(self, key): + return self.__dict[key] + + def to_dict(self): + return dict((key, unicode(value)) for key, value in self.__dict.items()) + + +def info_args(title): + """ generate some keywords for comfortable BookInfoCreation """ + slug = unicode(slughifi(title)) + return { + 'title': unicode(title), + 'slug': slug, + 'url': u"http://wolnelektury.pl/example/%s" % slug, + 'about': u"http://wolnelektury.pl/example/URI/%s" % slug, + } diff --git a/apps/catalogue/tests/__init__.py b/apps/catalogue/tests/__init__.py new file mode 100644 index 000000000..2366653de --- /dev/null +++ b/apps/catalogue/tests/__init__.py @@ -0,0 +1,4 @@ +from catalogue.tests.book_import import * +from catalogue.tests.search import * +from catalogue.tests.tags import * +from catalogue.tests.templatetags import * diff --git a/apps/catalogue/tests/book_import.py b/apps/catalogue/tests/book_import.py new file mode 100644 index 000000000..cb63fc069 --- /dev/null +++ b/apps/catalogue/tests/book_import.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +from django.core.files.base import ContentFile +from catalogue.test_utils import * +from catalogue import models + +class BookImportLogicTests(WLTestCase): + + def setUp(self): + WLTestCase.setUp(self) + self.book_info = BookInfoStub( + url=u"http://wolnelektury.pl/example/default_book", + about=u"http://wolnelektury.pl/example/URI/default_book", + title=u"Default Book", + author=PersonStub(("Jim",), "Lazy"), + kind="X-Kind", + genre="X-Genre", + epoch="X-Epoch", + ) + + self.expected_tags = [ + ('author', 'jim-lazy'), + ('genre', 'x-genre'), + ('epoch', 'x-epoch'), + ('kind', 'x-kind'), + ] + self.expected_tags.sort() + + def test_empty_book(self): + BOOK_TEXT = "" + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + + self.assertEqual(book.title, "Default Book") + self.assertEqual(book.slug, "default_book") + self.assert_(book.parent is None) + self.assertFalse(book.has_html_file()) + + # no fragments generated + self.assertEqual(book.fragments.count(), 0) + + # TODO: this should be filled out probably... + self.assertEqual(book.wiki_link, '') + self.assertEqual(book.gazeta_link, '') + self.assertEqual(book._short_html, '') + self.assertEqual(book.description, '') + + tags = [ (tag.category, tag.slug) for tag in book.tags ] + tags.sort() + + self.assertEqual(tags, self.expected_tags) + + def test_not_quite_empty_book(self): + """ Not empty, but without any real text. + + Should work like any other non-empty book. + """ + + BOOK_TEXT = """ + + Nic + + """ + + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.assertTrue(book.has_html_file()) + + def test_book_with_fragment(self): + BOOK_TEXT = """ + + LoveAla ma kota + + """ + + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.assertTrue(book.has_html_file()) + + self.assertEqual(book.fragments.count(), 1) + self.assertEqual(book.fragments.all()[0].text, u'

    Ala ma kota

    \n') + + self.assert_(('theme', 'love') in [ (tag.category, tag.slug) for tag in book.fragments.all()[0].tags ]) + + def test_book_with_empty_theme(self): + """ empty themes should be ignored """ + + BOOK_TEXT = """ + + , Love , , Ala ma kota + + """ + + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.assert_([('theme', 'love')], + [ (tag.category, tag.slug) for tag in book.fragments.all()[0].tags.filter(category='theme') ]) + + def test_book_with_no_theme(self): + """ fragments with no themes shouldn't be created at all """ + + BOOK_TEXT = """ + + Ala ma kota + + """ + + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.assertEqual(book.fragments.count(), 0) + self.assertEqual(book.tags.filter(category='theme').count(), 0) + + def test_book_replace_title(self): + BOOK_TEXT = """""" + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.book_info.title = u"Extraordinary" + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info, overwrite=True) + + tags = [ (tag.category, tag.slug) for tag in book.tags ] + tags.sort() + + self.assertEqual(tags, self.expected_tags) + + def test_book_replace_author(self): + BOOK_TEXT = """""" + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + self.book_info.author = PersonStub(("Hans", "Christian"), "Andersen") + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info, overwrite=True) + + tags = [ (tag.category, tag.slug) for tag in book.tags ] + tags.sort() + + self.expected_tags.remove(('author', 'jim-lazy')) + self.expected_tags.append(('author', 'hans-christian-andersen')) + self.expected_tags.sort() + + self.assertEqual(tags, self.expected_tags) + + # the old tag shouldn't disappear + models.Tag.objects.get(slug="jim-lazy", category="author") + + def test_multiple_tags(self): + BOOK_TEXT = """""" + self.book_info.authors = self.book_info.author, PersonStub(("Joe",), "Dilligent"), + self.book_info.kinds = self.book_info.kind, 'Y-Kind', + self.book_info.genres = self.book_info.genre, 'Y-Genre', + self.book_info.epochs = self.book_info.epoch, 'Y-Epoch', + + self.expected_tags.extend([ + ('author', 'joe-dilligent'), + ('genre', 'y-genre'), + ('epoch', 'y-epoch'), + ('kind', 'y-kind'), + ]) + self.expected_tags.sort() + + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + tags = [ (tag.category, tag.slug) for tag in book.tags ] + tags.sort() + + self.assertEqual(tags, self.expected_tags) diff --git a/apps/catalogue/tests/search.py b/apps/catalogue/tests/search.py new file mode 100644 index 000000000..93bec870e --- /dev/null +++ b/apps/catalogue/tests/search.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +from catalogue import models, views +from catalogue.test_utils import * + +from nose.tools import raises + +class BasicSearchLogicTests(WLTestCase): + + def setUp(self): + WLTestCase.setUp(self) + self.author_tag = models.Tag.objects.create( + name=u'Adam Mickiewicz [SubWord]', + category=u'author', slug="one") + + self.unicode_tag = models.Tag.objects.create( + name=u'Tadeusz Żeleński (Boy)', + category=u'author', slug="two") + + self.polish_tag = models.Tag.objects.create( + name=u'ĘÓĄŚŁŻŹĆŃęóąśłżźćń', + category=u'author', slug="three") + + @raises(ValueError) + def test_empty_query(self): + """ Check that empty queries raise an error. """ + views.find_best_matches(u'') + + @raises(ValueError) + def test_one_letter_query(self): + """ Check that one letter queries aren't permitted. """ + views.find_best_matches(u't') + + def test_match_by_prefix(self): + """ Tags should be matched by prefix of words within it's name. """ + self.assertEqual(views.find_best_matches(u'Ada'), (self.author_tag,)) + self.assertEqual(views.find_best_matches(u'Mic'), (self.author_tag,)) + self.assertEqual(views.find_best_matches(u'Mickiewicz'), (self.author_tag,)) + + def test_match_case_insensitive(self): + """ Tag names should match case insensitive. """ + self.assertEqual(views.find_best_matches(u'adam mickiewicz'), (self.author_tag,)) + + def test_match_case_insensitive_unicode(self): + """ Tag names should match case insensitive (unicode). """ + self.assertEqual(views.find_best_matches(u'tadeusz żeleński (boy)'), (self.unicode_tag,)) + + def test_word_boundary(self): + self.assertEqual(views.find_best_matches(u'SubWord'), (self.author_tag,)) + self.assertEqual(views.find_best_matches(u'[SubWord'), (self.author_tag,)) + + def test_unrelated_search(self): + self.assertEqual(views.find_best_matches(u'alamakota'), tuple()) + self.assertEqual(views.find_best_matches(u'Adama'), ()) + + def test_infix_doesnt_match(self): + """ Searching for middle of a word shouldn't match. """ + self.assertEqual(views.find_best_matches(u'deusz'), tuple()) + + def test_diactricts_removal_pl(self): + """ Tags should match both with and without national characters. """ + self.assertEqual(views.find_best_matches(u'ĘÓĄŚŁŻŹĆŃęóąśłżźćń'), (self.polish_tag,)) + self.assertEqual(views.find_best_matches(u'EOASLZZCNeoaslzzcn'), (self.polish_tag,)) + self.assertEqual(views.find_best_matches(u'eoaslzzcneoaslzzcn'), (self.polish_tag,)) + + def test_diactricts_query_removal_pl(self): + """ Tags without national characters shouldn't be matched by queries with them. """ + self.assertEqual(views.find_best_matches(u'Adąm'), ()) + + def test_sloppy(self): + self.assertEqual(views.find_best_matches(u'Żelenski'), (self.unicode_tag,)) + self.assertEqual(views.find_best_matches(u'zelenski'), (self.unicode_tag,)) diff --git a/apps/catalogue/tests/tags.py b/apps/catalogue/tests/tags.py new file mode 100644 index 000000000..1d257f9ab --- /dev/null +++ b/apps/catalogue/tests/tags.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +from catalogue import models +from catalogue.test_utils import * +from django.core.files.base import ContentFile + +from nose.tools import raises + + +class BooksByTagTests(WLTestCase): + """ tests the /katalog/tag page for found books """ + + def setUp(self): + WLTestCase.setUp(self) + author = PersonStub(("Common",), "Man") + + # grandchild + self.gchild_info = BookInfoStub(genre='Genre', epoch='Epoch', kind='Kind', author=author, + **info_args("GChild")) + # child + self.child_info = BookInfoStub(genre='Genre', epoch='Epoch', kind='Other Kind', author=author, + parts=[self.gchild_info.url], + **info_args("Child")) + # parent + self.parent_info = BookInfoStub(genre='Genre', epoch='Epoch', kind='Kind', author=author, + parts=[self.child_info.url], + **info_args("Parent")) + + self.book_file = ContentFile('') + + def test_nonexistent_tag(self): + """ Looking for a non-existent tag should yield 404 """ + # NOTE: this yields a false positive, 'cause of URL change + self.assertEqual(404, self.client.get('/katalog/czeslaw_milosz/').status_code) + + def test_book_tag(self): + """ Looking for a book tag isn't permitted """ + models.Book.from_text_and_meta(self.book_file, self.gchild_info) + self.assertEqual(404, self.client.get('/katalog/gchild/').status_code) + + def test_tag_empty(self): + """ Tag with no books should return no books """ + models.Book.from_text_and_meta(self.book_file, self.gchild_info) + models.Tag.objects.create(name='Empty tag', slug='empty', category='author') + + context = self.client.get('/katalog/empty/').context + self.assertEqual(0, len(context['object_list'])) + + def test_tag_eliminate(self): + """ Filtering by tag should only yield top-level qualifying books. """ + for info in self.gchild_info, self.child_info, self.parent_info: + models.Book.from_text_and_meta(self.book_file, info) + + # all three qualify + context = self.client.get('/katalog/genre/').context + self.assertEqual([book.title for book in context['object_list']], + ['Parent']) + + # parent and gchild qualify, child doesn't + context = self.client.get('/katalog/kind/').context + self.assertEqual([book.title for book in context['object_list']], + ['Parent']) + + # Filtering by child's tag should yield the child + context = self.client.get('/katalog/other-kind/').context + self.assertEqual([book.title for book in context['object_list']], + ['Child']) + + + +class TagRelatedTagsTests(WLTestCase): + """ tests the /katalog/tag/ page for related tags """ + + def setUp(self): + WLTestCase.setUp(self) + author = PersonStub(("Common",), "Man") + + gchild_info = BookInfoStub(author=author, genre="GchildGenre", epoch='Epoch', kind="Kind", + **info_args(u"GChild")) + child1_info = BookInfoStub(author=author, genre="ChildGenre", epoch='Epoch', kind="ChildKind", + parts=[gchild_info.url], + **info_args(u"Child1")) + child2_info = BookInfoStub(author=author, genre="ChildGenre", epoch='Epoch', kind="ChildKind", + **info_args(u"Child2")) + parent_info = BookInfoStub(author=author, genre="Genre", epoch='Epoch', kind="Kind", + parts=[child1_info.url, child2_info.url], + **info_args(u"Parent")) + + for info in gchild_info, child1_info, child2_info, parent_info: + book_text = """ + + Theme, %sTheme + Ala ma kota + + + """ % info.title.encode('utf-8') + book = models.Book.from_text_and_meta(ContentFile(book_text), info) + book.save() + + tag_empty = models.Tag(name='Empty tag', slug='empty', category='author') + tag_empty.save() + + def test_empty(self): + """ empty tag should have no related tags """ + + cats = self.client.get('/katalog/empty/').context['categories'] + self.assertEqual(cats, {}, 'tags related to empty tag') + + def test_has_related(self): + """ related own and descendants' tags should be generated """ + + cats = self.client.get('/katalog/kind/').context['categories'] + self.assertTrue('Common Man' in [tag.name for tag in cats['author']], + 'missing `author` related tag') + self.assertTrue('Epoch' in [tag.name for tag in cats['epoch']], + 'missing `epoch` related tag') + self.assertTrue("ChildKind" in [tag.name for tag in cats['kind']], + "missing `kind` related tag") + self.assertTrue("Genre" in [tag.name for tag in cats['genre']], + 'missing `genre` related tag') + self.assertTrue("ChildGenre" in [tag.name for tag in cats['genre']], + "missing child's related tag") + self.assertTrue("GchildGenre" in [tag.name for tag in cats['genre']], + "missing grandchild's related tag") + self.assertTrue('Theme' in [tag.name for tag in cats['theme']], + "missing related theme") + self.assertTrue('Child1Theme' in [tag.name for tag in cats['theme']], + "missing child's related theme") + self.assertTrue('GChildTheme' in [tag.name for tag in cats['theme']], + "missing grandchild's related theme") + + + def test_related_differ(self): + """ related tags shouldn't include filtering tags """ + + cats = self.client.get('/katalog/kind/').context['categories'] + self.assertFalse('Kind' in [tag.name for tag in cats['kind']], + 'filtering tag wrongly included in related') + cats = self.client.get('/katalog/theme/').context['categories'] + self.assertFalse('Theme' in [tag.name for tag in cats['theme']], + 'filtering theme wrongly included in related') + + + def test_parent_tag_once(self): + """ if parent and descendants have a common tag, count it only once """ + + cats = self.client.get('/katalog/kind/').context['categories'] + self.assertEqual([(tag.name, tag.count) for tag in cats['epoch']], + [('Epoch', 1)], + 'wrong related tag epoch tag on tag page') + + + def test_siblings_tags_count(self): + """ if children have tags and parent hasn't, count the children """ + + cats = self.client.get('/katalog/epoch/').context['categories'] + self.assertTrue(('ChildKind', 2) in [(tag.name, tag.count) for tag in cats['kind']], + 'wrong related kind tags on tag page') + + # all occurencies of theme should be counted + self.assertTrue(('Theme', 4) in [(tag.name, tag.count) for tag in cats['theme']], + 'wrong related theme count') + + +class CleanTagRelationTests(WLTestCase): + """ tests for tag relations cleaning after deleting things """ + + def setUp(self): + WLTestCase.setUp(self) + author = PersonStub(("Common",), "Man") + + book_info = BookInfoStub(author=author, genre="G", epoch='E', kind="K", + **info_args(u"Book")) + book_text = """ + ThemeAla ma kota + + + """ + book = models.Book.from_text_and_meta(ContentFile(book_text), book_info) + + def test_delete_objects(self): + """ there should be no related tags left after deleting some objects """ + + models.Book.objects.all().delete() + cats = self.client.get('/katalog/k/').context['categories'] + self.assertEqual(cats, {}) + self.assertEqual(models.Fragment.objects.all().count(), 0, + "orphaned fragments left") + self.assertEqual(models.Tag.intermediary_table_model.objects.all().count(), 0, + "orphaned TagRelation objects left") + + def test_deleted_tag(self): + """ there should be no tag relations left after deleting tags """ + + models.Tag.objects.all().delete() + cats = self.client.get('/katalog/lektura/book/').context['categories'] + self.assertEqual(cats, {}) + self.assertEqual(models.Tag.intermediary_table_model.objects.all().count(), 0, + "orphaned TagRelation objects left") + + +class TestIdenticalTag(WLTestCase): + + def setUp(self): + WLTestCase.setUp(self) + author = PersonStub((), "Tag") + + self.book_info = BookInfoStub(author=author, + genre="tag", + epoch='tag', + kind="tag", + **info_args(u"tag")) + self.book_text = """ + + + tagAla ma kota + + + + """ + + + def test_book_tags(self): + """ there should be all related tags in relevant categories """ + models.Book.from_text_and_meta(ContentFile(self.book_text), self.book_info) + + context = self.client.get('/katalog/lektura/tag/').context + for category in 'author', 'kind', 'genre', 'epoch': + self.assertTrue('tag' in [tag.slug for tag in context['categories'][category]], + 'missing related tag for %s' % category) + self.assertTrue('tag' in [tag.slug for tag in context['book_themes']]) + + def test_qualified_url(self): + models.Book.from_text_and_meta(ContentFile(self.book_text), self.book_info) + categories = {'author': 'autor', 'theme': 'motyw', 'epoch': 'epoka', 'kind':'rodzaj', 'genre':'gatunek'} + for cat, localcat in categories.iteritems(): + context = self.client.get('/katalog/%s/tag/' % localcat).context + self.assertEqual(1, len(context['object_list'])) + self.assertNotEqual({}, context['categories']) + self.assertFalse(cat in context['categories']) + + +class BookTagsTests(WLTestCase): + """ tests the /katalog/lektura/book/ page for related tags """ + + def setUp(self): + WLTestCase.setUp(self) + author1 = PersonStub(("Common",), "Man") + author2 = PersonStub(("Jim",), "Lazy") + + child_info = BookInfoStub(authors=(author1, author2), genre="ChildGenre", epoch='Epoch', kind="ChildKind", + **info_args(u"Child")) + parent_info = BookInfoStub(author=author1, genre="Genre", epoch='Epoch', kind="Kind", + parts=[child_info.url], + **info_args(u"Parent")) + + for info in child_info, parent_info: + book_text = """ + + Theme, %sTheme + Ala ma kota + + + """ % info.title.encode('utf-8') + book = models.Book.from_text_and_meta(ContentFile(book_text), info) + + def test_book_tags(self): + """ book should have own tags and whole tree's themes """ + + context = self.client.get('/katalog/lektura/parent/').context + + self.assertEqual([tag.name for tag in context['categories']['author']], + ['Common Man']) + self.assertEqual([tag.name for tag in context['categories']['kind']], + ['Kind']) + self.assertEqual([(tag.name, tag.count) for tag in context['book_themes']], + [('ChildTheme', 1), ('ParentTheme', 1), ('Theme', 2)]) + + def test_main_page_tags(self): + """ test main page tags and counts """ + + context = self.client.get('/katalog/').context + + self.assertEqual([(tag.name, tag.count) for tag in context['categories']['author']], + [('Jim Lazy', 1), ('Common Man', 1)]) + self.assertEqual([(tag.name, tag.count) for tag in context['fragment_tags']], + [('ChildTheme', 1), ('ParentTheme', 1), ('Theme', 2)]) + diff --git a/apps/catalogue/tests/templatetags.py b/apps/catalogue/tests/templatetags.py new file mode 100644 index 000000000..7a2ac36b9 --- /dev/null +++ b/apps/catalogue/tests/templatetags.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from catalogue import models +from catalogue.templatetags import catalogue_tags +from catalogue.test_utils import * +from django.core.files.base import ContentFile + + +class BookDescTests(WLTestCase): + """ tests book_title template tag """ + + def setUp(self): + WLTestCase.setUp(self) + authors = PersonStub(("Common",), "Man"), PersonStub(("Jane",), "Doe") + + child_info = BookInfoStub(authors=authors, genre="Genre", epoch='Epoch', kind="Kind", + **info_args(u"Child")) + parent_info = BookInfoStub(authors=authors, genre="Genre", epoch='Epoch', kind="Kind", + parts=[child_info.url], + **info_args(u"Parent")) + + self.child = models.Book.from_text_and_meta(ContentFile(''), child_info) + models.Book.from_text_and_meta(ContentFile(''), parent_info) + self.child = models.Book.objects.get(pk=self.child.pk) + + def test_book_desc(self): + """ book description should return authors, ancestors, book """ + self.assertEqual(catalogue_tags.book_title(self.child), 'Jane Doe, Common Man, Parent, Child') diff --git a/apps/catalogue/urls.py b/apps/catalogue/urls.py index 327e0fc72..70d5fd8e4 100644 --- a/apps/catalogue/urls.py +++ b/apps/catalogue/urls.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.conf.urls.defaults import * @@ -13,8 +16,12 @@ urlpatterns = patterns('catalogue.views', url(r'^lektura/(?P[a-zA-Z0-9-]+)/polki/', 'book_sets', name='book_shelves'), url(r'^polki/nowa/$', 'new_set', name='new_set'), url(r'^tags/$', 'tags_starting_with', name='hint'), + url(r'^jtags/$', 'json_tags_starting_with', name='jhint'), url(r'^szukaj/$', 'search', name='search'), - + + # tools + url(r'^zegar', 'clock', name='clock'), + # Public interface. Do not change this URLs. url(r'^lektura/(?P[a-zA-Z0-9-]+)\.html$', 'book_text', name='book_text'), url(r'^lektura/(?P[a-zA-Z0-9-]+)/$', 'book_detail', name='book_detail'), diff --git a/apps/catalogue/utils.py b/apps/catalogue/utils.py index 72b097392..e44b3792f 100644 --- a/apps/catalogue/utils.py +++ b/apps/catalogue/utils.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import random import time from base64 import urlsafe_b64encode @@ -16,7 +19,7 @@ MAX_SESSION_KEY = 18446744073709551616L # 2 << 63 def get_random_hash(seed): - sha_digest = sha_constructor('%s%s%s%s' % + sha_digest = sha_constructor('%s%s%s%s' % (randrange(0, MAX_SESSION_KEY), time.time(), unicode(seed).encode('utf-8', 'replace'), settings.SECRET_KEY)).digest() return urlsafe_b64encode(sha_digest).replace('=', '').replace('_', '-').lower() diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 92aa3e054..556bae1fe 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -1,10 +1,17 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import tempfile import zipfile import sys import pprint import traceback +import re +import itertools +from operator import itemgetter +from django.conf import settings from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 from django.http import HttpResponse, HttpResponseRedirect, Http404 @@ -18,7 +25,10 @@ from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.utils import simplejson from django.utils.functional import Promise from django.utils.encoding import force_unicode +from django.utils.http import urlquote_plus from django.views.decorators import cache +from django.utils.translation import ugettext as _ +from django.views.generic.list_detail import object_list from catalogue import models from catalogue import forms @@ -35,111 +45,223 @@ class LazyEncoder(simplejson.JSONEncoder): return force_unicode(obj) return obj +# shortcut for JSON reponses +class JSONResponse(HttpResponse): + def __init__(self, data={}, callback=None, **kwargs): + # get rid of mimetype + kwargs.pop('mimetype', None) + data = simplejson.dumps(data) + if callback: + data = callback + "(" + data + ");" + super(JSONResponse, self).__init__(data, mimetype="application/json", **kwargs) -def main_page(request): + +def main_page(request): if request.user.is_authenticated(): shelves = models.Tag.objects.filter(category='set', user=request.user) new_set_form = forms.NewSetForm() - extra_where = 'NOT catalogue_tag.category = "set"' - tags = models.Tag.objects.usage_for_model(models.Book, counts=True, extra={'where': [extra_where]}) - fragment_tags = models.Tag.objects.usage_for_model(models.Fragment, counts=True, - extra={'where': ['catalogue_tag.category = "theme"'] + [extra_where]}) + + tags = models.Tag.objects.exclude(category__in=('set', 'book')) + for tag in tags: + tag.count = tag.get_count() categories = split_tags(tags) - + fragment_tags = categories.get('theme', []) + form = forms.SearchForm() return render_to_response('catalogue/main_page.html', locals(), context_instance=RequestContext(request)) def book_list(request): - books = models.Book.objects.all() form = forms.SearchForm() - - books_by_first_letter = SortedDict() - for book in books: - books_by_first_letter.setdefault(book.title[0], []).append(book) - + + books_by_parent = {} + for book in models.Book.objects.all().order_by('parent_number'): + books_by_parent.setdefault(book.parent, []).append(book) + + orphans = [] + books_by_author = SortedDict() + for tag in models.Tag.objects.filter(category='author'): + books_by_author[tag] = [] + + for book in books_by_parent[None]: + authors = list(book.tags.filter(category='author')) + if authors: + for author in authors: + books_by_author[author].append(book) + else: + orphans.append(book) + return render_to_response('catalogue/book_list.html', locals(), context_instance=RequestContext(request)) +def differentiate_tags(request, tags, ambiguous_slugs): + beginning = '/'.join(tag.url_chunk for tag in tags) + unparsed = '/'.join(ambiguous_slugs[1:]) + options = [] + for tag in models.Tag.objects.exclude(category='book').filter(slug=ambiguous_slugs[0]): + options.append({ + 'url_args': '/'.join((beginning, tag.url_chunk, unparsed)).strip('/'), + 'tags': [tag] + }) + return render_to_response('catalogue/differentiate_tags.html', + {'tags': tags, 'options': options, 'unparsed': ambiguous_slugs[1:]}, + context_instance=RequestContext(request)) + + def tagged_object_list(request, tags=''): - # Prevent DoS attacks on our database - if len(tags.split('/')) > 6: - raise Http404 - try: tags = models.Tag.get_tag_list(tags) except models.Tag.DoesNotExist: raise Http404 - + except models.Tag.MultipleObjectsReturned, e: + return differentiate_tags(request, e.tags, e.ambiguous_slugs) + + try: + if len(tags) > settings.MAX_TAG_LIST: + raise Http404 + except AttributeError: + pass + if len([tag for tag in tags if tag.category == 'book']): raise Http404 - - model = models.Book - shelf = [tag for tag in tags if tag.category == 'set'] - shelf_is_set = (len(tags) == 1 and tags[0].category == 'set') - theme_is_set = len([tag for tag in tags if tag.category == 'theme']) > 0 - if theme_is_set: - model = models.Fragment - user_is_owner = (len(shelf) and request.user.is_authenticated() and request.user == shelf[0].user) - - extra_where = 'catalogue_tag.category NOT IN ("set", "book")' - related_tags = models.Tag.objects.related_for_model(tags, model, counts=True, extra={'where': [extra_where]}) - categories = split_tags(related_tags) + theme_is_set = [tag for tag in tags if tag.category == 'theme'] + shelf_is_set = [tag for tag in tags if tag.category == 'set'] + only_shelf = shelf_is_set and len(tags) == 1 + only_my_shelf = only_shelf and request.user.is_authenticated() and request.user == tags[0].user - if not (theme_is_set or shelf_is_set): - model=models.Book.objects.filter(parent=None) - - return newtagging_views.tagged_object_list( + objects = only_author = pd_counter = None + categories = {} + + if theme_is_set: + shelf_tags = [tag for tag in tags if tag.category == 'set'] + fragment_tags = [tag for tag in tags if tag.category != 'set'] + fragments = models.Fragment.tagged.with_all(fragment_tags) + + if shelf_tags: + books = models.Book.tagged.with_all(shelf_tags).order_by() + l_tags = models.Tag.objects.filter(category='book', slug__in=[book.book_tag_slug() for book in books]) + fragments = models.Fragment.tagged.with_any(l_tags, fragments) + + # newtagging goes crazy if we just try: + #related_tags = models.Tag.objects.usage_for_queryset(fragments, counts=True, + # extra={'where': ["catalogue_tag.category != 'book'"]}) + fragment_keys = [fragment.pk for fragment in fragments] + if fragment_keys: + related_tags = models.Fragment.tags.usage(counts=True, + filters={'pk__in': fragment_keys}, + extra={'where': ["catalogue_tag.category != 'book'"]}) + related_tags = (tag for tag in related_tags if tag not in fragment_tags) + categories = split_tags(related_tags) + + objects = fragments + else: + # get relevant books and their tags + objects = models.Book.tagged.with_all(tags).order_by() + if not shelf_is_set: + # eliminate descendants + l_tags = models.Tag.objects.filter(category='book', slug__in=[book.book_tag_slug() for book in objects]) + descendants_keys = [book.pk for book in models.Book.tagged.with_any(l_tags)] + if descendants_keys: + objects = objects.exclude(pk__in=descendants_keys) + + # get related tags from `tag_counter` and `theme_counter` + related_counts = {} + tags_pks = [tag.pk for tag in tags] + for book in objects: + for tag_pk, value in itertools.chain(book.tag_counter.iteritems(), book.theme_counter.iteritems()): + if tag_pk in tags_pks: + continue + related_counts[tag_pk] = related_counts.get(tag_pk, 0) + value + related_tags = models.Tag.objects.filter(pk__in=related_counts.keys()) + related_tags = [tag for tag in related_tags if tag not in tags] + for tag in related_tags: + tag.count = related_counts[tag.pk] + + categories = split_tags(related_tags) + del related_tags + + if not objects: + only_author = len(tags) == 1 and tags[0].category == 'author' + pd_counter = only_author and tags[0].goes_to_pd() + objects = models.Book.objects.none() + + return object_list( request, - tag_model=models.Tag, - queryset_or_model=model, - tags=tags, + objects, template_name='catalogue/tagged_object_list.html', - extra_context = { + extra_context={ 'categories': categories, - 'shelf_is_set': shelf_is_set, - 'user_is_owner': user_is_owner, + 'only_shelf': only_shelf, + 'only_author': only_author, + 'pd_counter': pd_counter, + 'only_my_shelf': only_my_shelf, 'formats_form': forms.DownloadFormatsForm(), - }, + + 'tags': tags, + } ) def book_fragments(request, book_slug, theme_slug): book = get_object_or_404(models.Book, slug=book_slug) - book_tag = get_object_or_404(models.Tag, slug='l-' + book_slug) - theme = get_object_or_404(models.Tag, slug=theme_slug) + book_tag = get_object_or_404(models.Tag, slug='l-' + book_slug, category='book') + theme = get_object_or_404(models.Tag, slug=theme_slug, category='theme') fragments = models.Fragment.tagged.with_all([book_tag, theme]) - + form = forms.SearchForm() return render_to_response('catalogue/book_fragments.html', locals(), context_instance=RequestContext(request)) def book_detail(request, slug): - book = get_object_or_404(models.Book, slug=slug) - book_tag = get_object_or_404(models.Tag, slug = 'l-' + slug) + try: + book = models.Book.objects.get(slug=slug) + except models.Book.DoesNotExist: + return book_stub_detail(request, slug) + + book_tag = book.book_tag() tags = list(book.tags.filter(~Q(category='set'))) categories = split_tags(tags) book_children = book.children.all().order_by('parent_number') - extra_where = 'catalogue_tag.category = "theme"' - book_themes = models.Tag.objects.related_for_model(book_tag, models.Fragment, counts=True, extra={'where': [extra_where]}) - extra_info = book.get_extra_info_value() + _book = book + parents = [] + while _book.parent: + parents.append(_book.parent) + _book = _book.parent + parents = reversed(parents) + + theme_counter = book.theme_counter + book_themes = models.Tag.objects.filter(pk__in=theme_counter.keys()) + for tag in book_themes: + tag.count = theme_counter[tag.pk] + + extra_info = book.get_extra_info_value() + form = forms.SearchForm() return render_to_response('catalogue/book_detail.html', locals(), context_instance=RequestContext(request)) +def book_stub_detail(request, slug): + book = get_object_or_404(models.BookStub, slug=slug) + pd_counter = book.pd + form = forms.SearchForm() + + return render_to_response('catalogue/book_stub_detail.html', locals(), + context_instance=RequestContext(request)) + + def book_text(request, slug): book = get_object_or_404(models.Book, slug=slug) book_themes = {} for fragment in book.fragments.all(): for theme in fragment.tags.filter(category='theme'): book_themes.setdefault(theme, []).append(fragment) - + book_themes = book_themes.items() book_themes.sort(key=lambda s: s[0].sort_key) return render_to_response('catalogue/book_text.html', locals(), @@ -149,40 +271,135 @@ def book_text(request, slug): # ========== # = Search = # ========== -def _tags_starting_with(prefix, user): - books = models.Book.objects.filter(title__icontains=prefix) - tags = models.Tag.objects.filter(name__icontains=prefix) - if user.is_authenticated(): + +def _no_diacritics_regexp(query): + """ returns a regexp for searching for a query without diacritics + + should be locale-aware """ + names = { + u'a':u'aąĄ', u'c':u'cćĆ', u'e':u'eęĘ', u'l': u'lłŁ', u'n':u'nńŃ', u'o':u'oóÓ', u's':u'sśŚ', u'z':u'zźżŹŻ', + u'ą':u'ąĄ', u'ć':u'ćĆ', u'ę':u'ęĘ', u'ł': u'łŁ', u'ń':u'ńŃ', u'ó':u'óÓ', u'ś':u'śŚ', u'ź':u'źŹ', u'ż':u'żŻ' + } + def repl(m): + l = m.group() + return u"(%s)" % '|'.join(names[l]) + return re.sub(u'[%s]' % (u''.join(names.keys())), repl, query) + +def unicode_re_escape(query): + """ Unicode-friendly version of re.escape """ + return re.sub('(?u)(\W)', r'\\\1', query) + +def _word_starts_with(name, prefix): + """returns a Q object getting models having `name` contain a word + starting with `prefix` + + We define word characters as alphanumeric and underscore, like in JS. + + Works for MySQL, PostgreSQL, Oracle. + For SQLite, _sqlite* version is substituted for this. + """ + kwargs = {} + + prefix = _no_diacritics_regexp(unicode_re_escape(prefix)) + # can't use [[:<:]] (word start), + # but we want both `xy` and `(xy` to catch `(xyz)` + kwargs['%s__iregex' % name] = u"(^|[^[:alnum:]_])%s" % prefix + + return Q(**kwargs) + + +def _sqlite_word_starts_with(name, prefix): + """ version of _word_starts_with for SQLite + + SQLite in Django uses Python re module + """ + kwargs = {} + prefix = _no_diacritics_regexp(unicode_re_escape(prefix)) + kwargs['%s__iregex' % name] = ur"(^|(?<=[^\wąćęłńóśźżĄĆĘŁŃÓŚŹŻ]))%s" % prefix + return Q(**kwargs) + + +if settings.DATABASE_ENGINE == 'sqlite3': + _word_starts_with = _sqlite_word_starts_with + + +def _tags_starting_with(prefix, user=None): + prefix = prefix.lower() + book_stubs = models.BookStub.objects.filter(_word_starts_with('title', prefix)) + books = models.Book.objects.filter(_word_starts_with('title', prefix)) + book_stubs = filter(lambda x: x not in books, book_stubs) + tags = models.Tag.objects.filter(_word_starts_with('name', prefix)) + if user and user.is_authenticated(): tags = tags.filter(~Q(category='book') & (~Q(category='set') | Q(user=user))) else: tags = tags.filter(~Q(category='book') & ~Q(category='set')) + return list(books) + list(tags) + list(book_stubs) + + +def _get_result_link(match, tag_list): + if isinstance(match, models.Book) or isinstance(match, models.BookStub): + return match.get_absolute_url() + else: + return reverse('catalogue.views.tagged_object_list', + kwargs={'tags': '/'.join(tag.url_chunk for tag in tag_list + [match])} + ) + +def _get_result_type(match): + if isinstance(match, models.Book) or isinstance(match, models.BookStub): + type = 'book' + else: + type = match.category + return type + + + +def find_best_matches(query, user=None): + """ Finds a Book, Tag or Bookstub best matching a query. + + Returns a with: + - zero elements when nothing is found, + - one element when a best result is found, + - more then one element on multiple exact matches + + Raises a ValueError on too short a query. + """ + + query = query.lower() + if len(query) < 2: + raise ValueError("query must have at least two characters") + + result = tuple(_tags_starting_with(query, user)) + exact_matches = tuple(res for res in result if res.name.lower() == query) + if exact_matches: + return exact_matches + else: + return result[:1] - return list(books) + list(tags) - def search(request): tags = request.GET.get('tags', '') prefix = request.GET.get('q', '') - # Prefix must have at least 2 characters - if len(prefix) < 2: - return HttpResponse('') - + try: tag_list = models.Tag.get_tag_list(tags) except: tag_list = [] - - result = _tags_starting_with(prefix, request.user) - if len(result) > 0: - tag = result[0] - if isinstance(tag, models.Book): - return HttpResponseRedirect(tag.get_absolute_url()) - else: - tag_list.append(tag) - - return HttpResponseRedirect(reverse('catalogue.views.tagged_object_list', - kwargs={'tags': '/'.join(tag.slug for tag in tag_list)} - )) + + try: + result = find_best_matches(prefix, request.user) + except ValueError: + return render_to_response('catalogue/search_too_short.html', {'tags':tag_list, 'prefix':prefix}, + context_instance=RequestContext(request)) + + if len(result) == 1: + return HttpResponseRedirect(_get_result_link(result[0], tag_list)) + elif len(result) > 1: + return render_to_response('catalogue/search_multiple_hits.html', + {'tags':tag_list, 'prefix':prefix, 'results':((x, _get_result_link(x, tag_list), _get_result_type(x)) for x in result)}, + context_instance=RequestContext(request)) + else: + return render_to_response('catalogue/search_no_hits.html', {'tags':tag_list, 'prefix':prefix}, + context_instance=RequestContext(request)) def tags_starting_with(request): @@ -190,9 +407,29 @@ def tags_starting_with(request): # Prefix must have at least 2 characters if len(prefix) < 2: return HttpResponse('') - - return HttpResponse('\n'.join(tag.name for tag in _tags_starting_with(prefix, request.user))) - + tags_list = [] + result = "" + for tag in _tags_starting_with(prefix, request.user): + if not tag.name in tags_list: + result += "\n" + tag.name + tags_list.append(tag.name) + return HttpResponse(result) + +def json_tags_starting_with(request, callback=None): + # Callback for JSONP + prefix = request.GET.get('q', '') + callback = request.GET.get('callback', '') + # Prefix must have at least 2 characters + if len(prefix) < 2: + return HttpResponse('') + tags_list = [] + result = "" + for tag in _tags_starting_with(prefix, request.user): + if not tag.name in tags_list: + result += "\n" + tag.name + tags_list.append(tag.name) + dict_result = {"matches": tags_list} + return JSONResponse(dict_result, callback) # ==================== # = Shelf management = @@ -210,33 +447,33 @@ def book_sets(request, slug): book = get_object_or_404(models.Book, slug=slug) user_sets = models.Tag.objects.filter(category='set', user=request.user) book_sets = book.tags.filter(category='set', user=request.user) - + if not request.user.is_authenticated(): - return HttpResponse('

    Aby zarządzać swoimi półkami, musisz się zalogować.

    ') - + return HttpResponse(_('

    To maintain your shelves you need to be logged in.

    ')) + if request.method == 'POST': form = forms.ObjectSetsForm(book, request.user, request.POST) if form.is_valid(): old_shelves = list(book.tags.filter(category='set')) new_shelves = [models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] - + for shelf in [shelf for shelf in old_shelves if shelf not in new_shelves]: - shelf.book_count -= 1 + shelf.book_count = None shelf.save() - + for shelf in [shelf for shelf in new_shelves if shelf not in old_shelves]: - shelf.book_count += 1 + shelf.book_count = None shelf.save() - + book.tags = new_shelves + list(book.tags.filter(~Q(category='set') | ~Q(user=request.user))) if request.is_ajax(): - return HttpResponse('

    Półki zostały zapisane.

    ') + return HttpResponse(_('

    Shelves were sucessfully saved.

    ')) else: return HttpResponseRedirect('/') else: form = forms.ObjectSetsForm(book, request.user) new_set_form = forms.NewSetForm() - + return render_to_response('catalogue/book_sets.html', locals(), context_instance=RequestContext(request)) @@ -247,13 +484,16 @@ def book_sets(request, slug): def remove_from_shelf(request, shelf, book): book = get_object_or_404(models.Book, slug=book) shelf = get_object_or_404(models.Tag, slug=shelf, category='set', user=request.user) - - models.Tag.objects.remove_tag(book, shelf) - - shelf.book_count -= 1 - shelf.save() - - return HttpResponse('Usunieto') + + if shelf in book.tags: + models.Tag.objects.remove_tag(book, shelf) + + shelf.book_count = None + shelf.save() + + return HttpResponse(_('Book was successfully removed from the shelf')) + else: + return HttpResponse(_('This book is not on the shelf')) def collect_books(books): @@ -274,25 +514,30 @@ def download_shelf(request, slug): """" Create a ZIP archive on disk and transmit it in chunks of 8KB, without loading the whole file into memory. A similar approach can - be used for large dynamic PDF files. + be used for large dynamic PDF files. """ shelf = get_object_or_404(models.Tag, slug=slug, category='set') - + formats = [] form = forms.DownloadFormatsForm(request.GET) if form.is_valid(): formats = form.cleaned_data['formats'] if len(formats) == 0: - formats = ['pdf', 'odt', 'txt', 'mp3', 'ogg'] - + formats = ['pdf', 'epub', 'odt', 'txt', 'mp3', 'ogg'] + # Create a ZIP archive - temp = temp = tempfile.TemporaryFile() + temp = tempfile.TemporaryFile() archive = zipfile.ZipFile(temp, 'w') - + + already = set() for book in collect_books(models.Book.tagged.with_all(shelf)): if 'pdf' in formats and book.pdf_file: filename = book.pdf_file.path archive.write(filename, str('%s.pdf' % book.slug)) + if book.root_ancestor not in already and 'epub' in formats and book.root_ancestor.epub_file: + filename = book.root_ancestor.epub_file.path + archive.write(filename, str('%s.epub' % book.root_ancestor.slug)) + already.add(book.root_ancestor) if 'odt' in formats and book.odt_file: filename = book.odt_file.path archive.write(filename, str('%s.odt' % book.slug)) @@ -306,11 +551,11 @@ def download_shelf(request, slug): filename = book.ogg_file.path archive.write(filename, str('%s.ogg' % book.slug)) archive.close() - + response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed') response['Content-Disposition'] = 'attachment; filename=%s.zip' % shelf.sort_key response['Content-Length'] = temp.tell() - + temp.seek(0) response.write(temp.read()) return response @@ -323,11 +568,13 @@ def shelf_book_formats(request, shelf): """ shelf = get_object_or_404(models.Tag, slug=shelf, category='set') - formats = {'pdf': False, 'odt': False, 'txt': False, 'mp3': False, 'ogg': False} - + formats = {'pdf': False, 'epub': False, 'odt': False, 'txt': False, 'mp3': False, 'ogg': False} + for book in collect_books(models.Book.tagged.with_all(shelf)): if book.pdf_file: formats['pdf'] = True + if book.root_ancestor.epub_file: + formats['epub'] = True if book.odt_file: formats['odt'] = True if book.txt_file: @@ -349,7 +596,7 @@ def new_set(request): new_set = new_set_form.save(request.user) if request.is_ajax(): - return HttpResponse(u'

    Półka %s została utworzona

    ' % new_set) + return HttpResponse(_('

    Shelf %s was successfully created

    ') % new_set) else: return HttpResponseRedirect('/') @@ -364,7 +611,7 @@ def delete_shelf(request, slug): user_set.delete() if request.is_ajax(): - return HttpResponse(u'

    Półka %s została usunięta

    ' % user_set.name) + return HttpResponse(_('

    Shelf %s was successfully removed

    ') % user_set.name) else: return HttpResponseRedirect('/') @@ -391,7 +638,7 @@ def register(request): if registration_form.is_valid(): user = registration_form.save() user = auth.authenticate( - username=registration_form.cleaned_data['username'], + username=registration_form.cleaned_data['username'], password=registration_form.cleaned_data['password1'] ) auth.login(request, user) @@ -404,7 +651,7 @@ def register(request): @cache.never_cache def logout_then_redirect(request): auth.logout(request) - return HttpResponseRedirect(request.GET.get('next', '/')) + return HttpResponseRedirect(urlquote_plus(request.GET.get('next', '/'), safe='/?=')) @@ -423,7 +670,16 @@ def import_book(request): info = sys.exc_info() exception = pprint.pformat(info[1]) tb = '\n'.join(traceback.format_tb(info[2])) - return HttpResponse("An error occurred: %s\n\n%s" % (exception, tb), mimetype='text/plain') - return HttpResponse("Book imported successfully") + return HttpResponse(_("An error occurred: %(exception)s\n\n%(tb)s") % {'exception':exception, 'tb':tb}, mimetype='text/plain') + return HttpResponse(_("Book imported successfully")) else: - return HttpResponse("Error importing file: %r" % book_import_form.errors) \ No newline at end of file + return HttpResponse(_("Error importing file: %r") % book_import_form.errors) + + + +def clock(request): + """ Provides server time for jquery.countdown, + in a format suitable for Date.parse() + """ + from datetime import datetime + return HttpResponse(datetime.now().strftime('%Y/%m/%d %H:%M:%S')) diff --git a/apps/chunks/locale/de/LC_MESSAGES/django.mo b/apps/chunks/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0b7ee1467 Binary files /dev/null and b/apps/chunks/locale/de/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/de/LC_MESSAGES/django.po b/apps/chunks/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..2e834628a --- /dev/null +++ b/apps/chunks/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-06-23 11:45+0100\n" +"Last-Translator: Iwona Fiałkowska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "Schlüssel" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Ein besonderer Name für diesen Inhaltsauszug" + +#: models.py:11 +msgid "description" +msgstr "Beschreibung" + +#: models.py:12 +msgid "content" +msgstr "Inhalt" + +#: models.py:16 +msgid "chunk" +msgstr "Auszug" + +#: models.py:17 +msgid "chunks" +msgstr "Auszüge" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Ein besonderer Name für diese Anlage" + +#: models.py:29 +msgid "attachment" +msgstr "Anlage" + +#: models.py:29 +msgid "attachments" +msgstr "Anlagen" + diff --git a/apps/chunks/locale/en/LC_MESSAGES/django.mo b/apps/chunks/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 000000000..db3d0eeaa Binary files /dev/null and b/apps/chunks/locale/en/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/en/LC_MESSAGES/django.po b/apps/chunks/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..07a8dcbec --- /dev/null +++ b/apps/chunks/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-06-09 16:25+0100\n" +"Last-Translator: K Izdebska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "key" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "A unique name for this piece of content" + +#: models.py:11 +msgid "description" +msgstr "description" + +#: models.py:12 +msgid "content" +msgstr "content" + +#: models.py:16 +msgid "chunk" +msgstr "piece" + +#: models.py:17 +msgid "chunks" +msgstr "pieces" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "A unique name for this attachment" + +#: models.py:29 +msgid "attachment" +msgstr "attachment" + +#: models.py:29 +msgid "attachments" +msgstr "attachments" + diff --git a/apps/chunks/locale/es/LC_MESSAGES/django.mo b/apps/chunks/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 000000000..368d60a5a Binary files /dev/null and b/apps/chunks/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/es/LC_MESSAGES/django.po b/apps/chunks/locale/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..727f37a17 --- /dev/null +++ b/apps/chunks/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-08-10 17:15+0100\n" +"Last-Translator: Katarzyna Flis \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "clave" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "El nombre único para este elemento del contenido" + +#: models.py:11 +msgid "description" +msgstr "descripción" + +#: models.py:12 +msgid "content" +msgstr "contenido" + +#: models.py:16 +msgid "chunk" +msgstr "elemento" + +#: models.py:17 +msgid "chunks" +msgstr "elementos" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "El nombre único para este adjunto" + +#: models.py:29 +msgid "attachment" +msgstr "adjunto" + +#: models.py:29 +msgid "attachments" +msgstr "adjuntos" + diff --git a/apps/chunks/locale/fr/LC_MESSAGES/django.mo b/apps/chunks/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..18da01df9 Binary files /dev/null and b/apps/chunks/locale/fr/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/fr/LC_MESSAGES/django.po b/apps/chunks/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..20b934278 --- /dev/null +++ b/apps/chunks/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-06-27 00:08+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "clé" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Nom unique pour ce fragment du contenu" + +#: models.py:11 +msgid "description" +msgstr "description" + +#: models.py:12 +msgid "content" +msgstr "contenu" + +#: models.py:16 +msgid "chunk" +msgstr "fragment" + +#: models.py:17 +msgid "chunks" +msgstr "fragments" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Nom unique pour cette pièce jointe" + +#: models.py:29 +msgid "attachment" +msgstr "pièce jointe" + +#: models.py:29 +msgid "attachments" +msgstr "pièces jointes" + diff --git a/apps/chunks/locale/lt/LC_MESSAGES/django.mo b/apps/chunks/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..a3e42fb3e Binary files /dev/null and b/apps/chunks/locale/lt/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/lt/LC_MESSAGES/django.po b/apps/chunks/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..b93b9fafa --- /dev/null +++ b/apps/chunks/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,55 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:59+0200\n" +"PO-Revision-Date: 2010-07-12 18:49+0100\n" +"Last-Translator: Alicja Sinkiewicz \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "raktas" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Unikalus šio turinio gabalelio pavadnimas" + +#: models.py:11 +msgid "description" +msgstr "aprašymas" + +#: models.py:12 +msgid "content" +msgstr "turinys" + +#: models.py:16 +msgid "chunk" +msgstr "gabalėlis" + +#: models.py:17 +msgid "chunks" +msgstr "gabalėliai" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Unikalus šio priedo pavadnimas" + +#: models.py:29 +msgid "attachment" +msgstr "priedas" + +#: models.py:29 +msgid "attachments" +msgstr "priedai" + diff --git a/apps/chunks/locale/pl/LC_MESSAGES/django.mo b/apps/chunks/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..838d4e3a1 Binary files /dev/null and b/apps/chunks/locale/pl/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/pl/LC_MESSAGES/django.po b/apps/chunks/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..e0a6139b3 --- /dev/null +++ b/apps/chunks/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:59+0200\n" +"PO-Revision-Date: 2010-05-19 16:19\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: models.py:10 models.py:24 +msgid "key" +msgstr "klucz" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Unikalna nazwa dla tego kawałka treści" + +#: models.py:11 +msgid "description" +msgstr "opis" + +#: models.py:12 +msgid "content" +msgstr "zawartość" + +#: models.py:16 +msgid "chunk" +msgstr "kawałek" + +#: models.py:17 +msgid "chunks" +msgstr "kawałki" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Unikalna nazwa dla tego załącznika" + +#: models.py:29 +msgid "attachment" +msgstr "załącznik" + +#: models.py:29 +msgid "attachments" +msgstr "załączniki" diff --git a/apps/chunks/locale/ru/LC_MESSAGES/django.mo b/apps/chunks/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 000000000..857e6c6fa Binary files /dev/null and b/apps/chunks/locale/ru/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/ru/LC_MESSAGES/django.po b/apps/chunks/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..7718f6c3b --- /dev/null +++ b/apps/chunks/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-06-02 17:07+0100\n" +"Last-Translator: I \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "ключ" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Уникальное имя для этого фрагмента содержания" + +#: models.py:11 +msgid "description" +msgstr "описание" + +#: models.py:12 +msgid "content" +msgstr "содержание" + +#: models.py:16 +msgid "chunk" +msgstr "фрагмент" + +#: models.py:17 +msgid "chunks" +msgstr "фрагменты" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Уникальное имя для этого приложения" + +#: models.py:29 +msgid "attachment" +msgstr "приложение" + +#: models.py:29 +msgid "attachments" +msgstr "приложения" + diff --git a/apps/chunks/locale/uk/LC_MESSAGES/django.mo b/apps/chunks/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 000000000..219007928 Binary files /dev/null and b/apps/chunks/locale/uk/LC_MESSAGES/django.mo differ diff --git a/apps/chunks/locale/uk/LC_MESSAGES/django.po b/apps/chunks/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 000000000..432c1d6be --- /dev/null +++ b/apps/chunks/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 10:58+0200\n" +"PO-Revision-Date: 2010-08-26 13:13+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:10 +#: models.py:24 +msgid "key" +msgstr "ключ" + +#: models.py:10 +msgid "A unique name for this chunk of content" +msgstr "Унікальна назва для цієї частини змісту" + +#: models.py:11 +msgid "description" +msgstr "опис" + +#: models.py:12 +msgid "content" +msgstr "зміст" + +#: models.py:16 +msgid "chunk" +msgstr "частина" + +#: models.py:17 +msgid "chunks" +msgstr "частини" + +#: models.py:24 +msgid "A unique name for this attachment" +msgstr "Унікальна назва для цього додатку" + +#: models.py:29 +msgid "attachment" +msgstr "додаток" + +#: models.py:29 +msgid "attachments" +msgstr "додатки" + diff --git a/apps/chunks/models.py b/apps/chunks/models.py index 86f04660c..cd9cf4e32 100644 --- a/apps/chunks/models.py +++ b/apps/chunks/models.py @@ -15,7 +15,7 @@ class Chunk(models.Model): ordering = ('key',) verbose_name = _('chunk') verbose_name_plural = _('chunks') - + def __unicode__(self): return self.key @@ -23,7 +23,7 @@ class Chunk(models.Model): class Attachment(models.Model): key = models.CharField(_('key'), help_text=_('A unique name for this attachment'), primary_key=True, max_length=255) attachment = models.FileField(upload_to='chunks/attachment') - + class Meta: ordering = ('key',) verbose_name, verbose_name_plural = _('attachment'), _('attachments') diff --git a/apps/chunks/templatetags/chunks.py b/apps/chunks/templatetags/chunks.py index 595482f41..083c48aa5 100644 --- a/apps/chunks/templatetags/chunks.py +++ b/apps/chunks/templatetags/chunks.py @@ -30,7 +30,7 @@ class ChunkNode(template.Node): def __init__(self, key, cache_time=0): self.key = key self.cache_time = cache_time - + def render(self, context): try: cache_key = 'chunk_' + self.key @@ -44,7 +44,7 @@ class ChunkNode(template.Node): n.save() return '' return content - + register.tag('chunk', do_get_chunk) @@ -58,6 +58,6 @@ def attachment(key, cache_time=0): return c.attachment.url except Attachment.DoesNotExist: return '' - + register.simple_tag(attachment) diff --git a/apps/compress/filter_base.py b/apps/compress/filter_base.py index 9b98531b6..9bb23b2ff 100644 --- a/apps/compress/filter_base.py +++ b/apps/compress/filter_base.py @@ -6,7 +6,7 @@ class FilterBase: raise NotImplementedError def filter_js(self, js): raise NotImplementedError - + class FilterError(Exception): """ This exception is raised when a filter fails diff --git a/apps/compress/filters/csstidy/__init__.py b/apps/compress/filters/csstidy/__init__.py index d40e8eebb..ae7c10313 100644 --- a/apps/compress/filters/csstidy/__init__.py +++ b/apps/compress/filters/csstidy/__init__.py @@ -18,16 +18,16 @@ class CSSTidyFilter(FilterBase): tmp_file.flush() output_file = tempfile.NamedTemporaryFile(mode='w+b') - + command = '%s %s %s %s' % (BINARY, tmp_file.name, ARGUMENTS, output_file.name) - + command_output = os.popen(command).read() - + filtered_css = output_file.read() output_file.close() tmp_file.close() - + if self.verbose: print command_output - + return filtered_css diff --git a/apps/compress/filters/csstidy_python/__init__.py b/apps/compress/filters/csstidy_python/__init__.py index 7d581ed43..03a4ac012 100644 --- a/apps/compress/filters/csstidy_python/__init__.py +++ b/apps/compress/filters/csstidy_python/__init__.py @@ -8,12 +8,12 @@ COMPRESS_CSSTIDY_SETTINGS = getattr(settings, 'COMPRESS_CSSTIDY_SETTINGS', {}) class CSSTidyFilter(FilterBase): def filter_css(self, css): tidy = CSSTidy() - + for k, v in COMPRESS_CSSTIDY_SETTINGS.items(): tidy.setSetting(k, v) tidy.parse(css) r = tidy.Output('string') - + return r diff --git a/apps/compress/management/commands/synccompress.py b/apps/compress/management/commands/synccompress.py index 6e31d254d..8217979dd 100644 --- a/apps/compress/management/commands/synccompress.py +++ b/apps/compress/management/commands/synccompress.py @@ -6,9 +6,6 @@ from django.conf import settings class Command(NoArgsCommand): option_list = NoArgsCommand.option_list + ( make_option('--force', action='store_true', default=False, help='Force update of all files, even if the source files are older than the current compressed file.'), - make_option('--verbosity', action='store', dest='verbosity', default='1', - type='choice', choices=['0', '1', '2'], - help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'), ) help = 'Updates and compresses CSS and JavsScript on-demand, without restarting Django' args = '' @@ -21,7 +18,8 @@ class Command(NoArgsCommand): from compress.utils import needs_update, filter_css, filter_js for name, css in settings.COMPRESS_CSS.items(): - u, version = needs_update(css['output_filename'], css['source_filenames']) + u, version = needs_update(css['output_filename'], + css['source_filenames']) if (force or u) or verbosity >= 2: msg = 'CSS Group \'%s\'' % name @@ -36,7 +34,8 @@ class Command(NoArgsCommand): print for name, js in settings.COMPRESS_JS.items(): - u, version = needs_update(js['output_filename'], js['source_filenames']) + u, version = needs_update(js['output_filename'], + js['source_filenames']) if (force or u) or verbosity >= 2: msg = 'JavaScript Group \'%s\'' % name @@ -48,4 +47,12 @@ class Command(NoArgsCommand): filter_js(js, verbosity) if (force or u) or verbosity >= 2: - print \ No newline at end of file + print + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/apps/compress/utils.py b/apps/compress/utils.py index 3c59728b9..89b04a56e 100644 --- a/apps/compress/utils.py +++ b/apps/compress/utils.py @@ -97,7 +97,7 @@ def get_version(version): except ValueError: return str(version) -def remove_files(path, filename, verbosity=0): +def remove_files(path, filename, verbosity=0): regex = re.compile(r'^%s$' % (os.path.basename(get_output_filename(settings.COMPRESS_VERSION_PLACEHOLDER.join([re.escape(part) for part in filename.split(settings.COMPRESS_VERSION_PLACEHOLDER)]), r'\d+')))) for f in os.listdir(path): diff --git a/apps/infopages/__init__.py b/apps/infopages/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/infopages/admin.py b/apps/infopages/admin.py new file mode 100644 index 000000000..66f2996c5 --- /dev/null +++ b/apps/infopages/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from modeltranslation.admin import TranslationAdmin +from infopages.models import InfoPage + +class InfoPageAdmin(TranslationAdmin): + list_display = ('title',) + +admin.site.register(InfoPage, InfoPageAdmin) \ No newline at end of file diff --git a/apps/infopages/fixtures/wl_data.json b/apps/infopages/fixtures/wl_data.json new file mode 100644 index 000000000..61ea9e856 --- /dev/null +++ b/apps/infopages/fixtures/wl_data.json @@ -0,0 +1,174 @@ +[ + { + "pk": 3, + "model": "infopages.infopage", + "fields": { + "title_de": "\u00dcber das Projekt \"Freie Lekt\u00fcren\"", + "page_title": "About Wolne Lektury project", + "left_column_uk": "

    Wolne Lektury

    \r\n\r\n \r\n\r\n

    \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u0430 \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \"Wolne Lektury\u201d (www.wolnelektury.pl) \u0446\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0456\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0424\u043e\u043d\u0434\u043e\u043c \u041c\u043e\u0434\u0435\u0440\u043d\u0430 \u041f\u043e\u043b\u044c\u0449\u0430. \u0414\u0456\u0454 \u0432\u0456\u043d \u0437 2007 \u0440\u043e\u043a\u0443 \u0456 \u043d\u0430\u0434\u0430\u0454 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0454\u0457 \u043a\u043e\u043b\u0435\u043a\u0446\u0456\u0457 \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e\u0457 \u041c\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e\u043c \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0457 \u043e\u0441\u0432\u0456\u0442\u0438, \u044f\u043a\u0430 \u0454 \u0432\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u044e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f. \u0422\u0432\u043e\u0440\u0438 \u0454 \u043e\u043f\u0440\u0430\u0446\u044c\u043e\u0432\u0430\u043d\u0456, \u0434\u043e \u043d\u0438\u0445 \u0434\u043e\u0434\u0430\u044e\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0456 \u0456 \u043d\u0430\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0434\u0435\u043a\u0456\u043b\u044c\u043a\u043e\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 (html, epub, mp3, ogg, odt, txt i pdf). \u041c\u043e\u0436\u043d\u0430 \u0457\u0445 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0430\u0442\u0438, \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0443\u0432\u0430\u0442\u0438 \u043d\u0430 \u0432\u043b\u0430\u0441\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440, \u043d\u0430\u0434\u0430\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u043d\u0438\u0445 \u0456\u043d\u0448\u0438\u043c \u0442\u0430 \u0446\u0438\u0442\u0443\u0432\u0430\u0442\u0438.

    \r\n\r\n \r\n\r\n

    \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 Wolne Lektury \u0441\u043a\u043b\u0430\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437 \u0434\u043e\u0441\u0432\u0456\u0434\u0447\u0435\u043d\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043a \u0442\u0430 \u0432\u0447\u0438\u0442\u0435\u043b\u044c\u043e\u043a, \u0449\u043e \u0437\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0443\u0454 \u043d\u0430\u0434\u0456\u0439\u043d\u0456\u0441\u0442\u044c \u043d\u0430\u0448\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0443. \u0412 \u0439\u043e\u0433\u043e \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u043c\u0438 \u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454\u043c\u043e \u0437 \u041d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u044e \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u043e\u044e, \u044f\u043a\u0430 \u043d\u0430\u0434\u0430\u0454 \u043d\u0430\u043c \u043d\u0430\u0439\u043a\u0440\u0430\u0449\u0456 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0456 \u0432\u0438\u0434\u0430\u043d\u043d\u044f \u0442\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0456 \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043d\u043d\u044f \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438, \u044f\u043a\u0456 \u0437\u043d\u0430\u0445\u043e\u0434\u044f\u0442\u044c\u0441\u044f \u0432 \u0426\u0438\u0444\u0440\u043e\u0432\u0456\u0439 \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0456\u0439 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u0446\u0456 \u041f\u043e\u043b\u043e\u043d\u0430. \u0421\u043f\u0456\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u0454\u043c\u043e\u0441\u044f, \u0449\u043e\u0431 \u0442\u0435\u043a\u0441\u0442\u0438 \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438 - \u043d\u0430\u0448\u0430 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u0430 \u0441\u043f\u0430\u0434\u0449\u0438\u043d\u0430 - \u0431\u0443\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0456 \u0434\u043b\u044f \u0432\u0441\u0456\u0445, \u043d\u0435\u0437\u0430\u043b\u0435\u0436\u043d\u043e \u0432\u0456\u0434 \u043c\u0456\u0441\u0446\u044f \u043f\u0440\u043e\u0436\u0438\u0432\u0430\u043d\u043d\u044f, \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0456\u0432, \u043e\u0431\u043c\u0435\u0436\u0435\u043d\u0438\u0445 \u0447\u0438 \u043d\u0435\u043e\u0431\u043c\u0435\u0436\u0435\u043d\u0438\u0445 \u043c\u043e\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u0435\u0439. \u0426\u0435 \u043c\u043e\u0436\u043b\u0438\u0432\u043e \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u0456\u0441\u043d\u0443\u0432\u0430\u043d\u043d\u0456 \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f, \u0442\u043e\u0431\u0442\u043e \u0441\u0443\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0456 \u0442\u0432\u043e\u0440\u0456\u0432, \u044f\u043a\u0456 \u043d\u0435 \u043e\u0445\u043e\u0440\u043e\u043d\u044f\u044e\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c, \u0430 \u0442\u0430\u043a\u043e\u0436 \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u0441\u0443\u0447\u0430\u0441\u043d\u0438\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0456\u044f\u043c \u2013 \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c, \u044f\u043a\u0456 \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0437\u043c\u0456\u0441\u0442\u0443 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u043e\u0433\u043e \u0432 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0456.

    \r\n\r\n \r\n\r\n

    \u041f\u0440\u043e\u0435\u043a\u0442 Wolne Lektury \u0454 \u043f\u043e\u0432\u043d\u0456\u0441\u0442\u044e \u043d\u0435\u043a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0438\u043c \u0456 \u0440\u0435\u0430\u043b\u0456\u0437\u0443\u0454\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0457 \u043a\u043e\u0440\u0438\u0441\u0442\u0456. \u0422\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0441 \u0434\u0443\u0436\u0435 \u0432\u0430\u0436\u043b\u0438\u0432\u043e\u044e \u0454 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0456\u0432 \u043d\u0430\u0443\u043a\u0438 \u0442\u0430 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0438. \u041f\u043e\u0447\u0435\u0441\u043d\u0438\u0439 \u043f\u0430\u0442\u0440\u043e\u043d\u0430\u0442 \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c Wolne Lektury \u0437\u0434\u0456\u0439\u0441\u043d\u044e\u0454 \u041c\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0438 \u0442\u0430 \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0457 \u0441\u043f\u0430\u0434\u0449\u0438\u043d\u0438, \u0430 \u0442\u0430\u043a\u043e\u0436 \u0421\u043f\u0456\u043b\u043a\u0430 \u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0445 \u041f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u0438\u043a\u0456\u0432. \u0417\u0430\u0441\u0456\u0434\u0430\u0442\u0438 \u0432 \u041f\u043e\u0447\u0435\u0441\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u0456\u0442\u0435\u0442\u0456 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 Wolne Lektury \u043f\u043e\u0433\u043e\u0434\u0438\u043b\u0438\u0441\u044f \u043f\u0440\u043e\u0444. \u041c\u0430\u0440\u0456\u044f \u042f\u043d\u0456\u043e\u043d, \u043f\u0440\u043e\u0444. \u0490\u0440\u0430\u0436\u0438\u043d\u0430 \u0411\u043e\u0440\u043a\u043e\u0432\u0441\u044c\u043a\u0430, \u043f\u0440\u043e\u0444. \u041f\u0448\u0435\u043c\u0438\u0441\u043b\u0430\u0432 \u0427\u0430\u043f\u043b\u0456\u043d\u0441\u044c\u043a\u0438\u0439, \u043f\u0440\u043e\u0444. \u041c\u2019\u0454\u0447\u0438\u0441\u043b\u0430\u0432 \u0414\u043e\u043c\u0431\u0440\u043e\u0432\u0441\u044c\u043a\u0438\u0439, \u043f\u0440\u043e\u0444. \u0415\u0432\u0430 \u041a\u0440\u0430\u0441\u043a\u043e\u0432\u0441\u044c\u043a\u0430, \u043f\u0440\u043e\u0444. \u041c\u0430\u043b\u0491\u043e\u0436\u0430\u0442\u0430 \u0427\u0435\u0440\u043c\u0456\u043d\u0441\u044c\u043a\u0430, \u043f\u0440\u043e\u0444. \u0404\u0436\u0438 \u042f\u0436\u0435\u043c\u0431\u0441\u044c\u043a\u0438\u0439 \u0442\u0430 \u043f\u0440\u043e\u0444. \u041f\u0456\u043e\u0442\u0440 \u0421\u043b\u0456\u0432\u0456\u043d\u0441\u044c\u043a\u0438\u0439.

    \r\n\r\n\r\n\r\n \r\n\r\n

    \u0414\u0438\u0433\u0456\u0442\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u0454\u044e \u0442\u0430 \u043a\u043e\u0440\u0435\u043a\u0442\u043e\u044e \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u0437\u0430\u0439\u043c\u0430\u0454\u0442\u044c\u0441\u044f \u041d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0430 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u0430. \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0430\u0439\u0442 \u0437\u0430\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432\u0430\u043d\u0438\u0439 2ia. \u0410\u0432\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0432\u0438 \u0441\u043a\u043b\u0430\u0434\u0443 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u0443 Wolne Lektury, \u044f\u043a\u0430 \u0441\u043f\u0438\u0440\u0430\u0454\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u043e\u0432\u0456 XML, \u0454 \u0414\u0430\u0440\u044e\u0448 \u0490\u0430\u043b\u0435\u0446\u044c\u043a\u0438\u0439. \u042e\u0440\u0438\u0434\u0438\u0447\u043d\u0435 \u043e\u0431\u0441\u043b\u0443\u0433\u043e\u0432\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0443 Wolne Lektury \u0437\u0434\u0456\u0439\u0441\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u041a\u0430\u043d\u0446\u0435\u043b\u0430\u0440\u0456\u0454\u044e \u0490\u0440\u0438\u043d\u0433\u043e\u0444\u0444, \u0412\u043e\u0437\u044c\u043d\u0438, \u041c\u0430\u043b\u0456\u043d\u0441\u044c\u043a\u0456. \u0425\u043e\u0441\u0442\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u0443 \u0437\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0443\u0454 \u043a\u043e\u043c\u043f\u0430\u043d\u0456\u044f EO Networks. \u0412 \u0442\u0435\u0445\u043d\u0456\u0447\u043d\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043d\u043d\u0456 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u0434\u043e\u043f\u043e\u043c\u0430\u0433\u0430\u0454 \u0432\u0438\u0434\u0430\u0432\u043d\u0438\u0446\u0442\u0432\u043e Korporacja Ha!Art. \u041b\u043e\u0433\u043e\u0442\u0438\u043f Wolne Lektury \u0454 \u0442\u0432\u043e\u0440\u043e\u043c \u0430\u0433\u0435\u043d\u0446\u0456\u0457 PZL. \u041f\u0440\u043e\u0435\u043a\u0442 \u0437\u0434\u0456\u0439\u0441\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u043f\u0456\u0434 \u043c\u0435\u0434\u0456\u0430-\u043f\u0430\u0442\u0440\u043e\u043d\u0430\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0445 \u0417\u041c\u0406: Dziennik, Elle, Tok.fm, Biblioteka Analiz, Tygodnik Powszechny, Przekr\u00f3j \u0442\u0430 TVP Kultura.

    \r\n\r\n \r\n\r\n

    \u042f\u043a \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u0441\u0430\u0439\u0442\u043e\u043c Wolne Lektury?

    \r\n\r\n \r\n\r\n

    \u041d\u0430\u0439\u0432\u0430\u0436\u043b\u0438\u0432\u0456\u0448\u043e\u044e \u0456\u043d\u043d\u043e\u0432\u0430\u0446\u0456\u0454\u044e Wolne Lektury, \u044f\u043a\u0430 \u0432\u0456\u0434\u0440\u0456\u0437\u043d\u044f\u0454 \u0446\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0456\u0434 \u0456\u043d\u0448\u0438\u0445 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a \u0454 \u0437\u043c\u043e\u0433\u0430 \u0437\u0434\u0456\u0439\u0441\u043d\u044e\u0432\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a \u0443 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0437\u0430 \u0440\u0456\u0437\u043d\u0438\u043c\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0456\u044f\u043c\u0438: \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0439\u043d\u0438\u043c\u0438, \u044f\u043a \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0430\u0432\u0442\u043e\u0440, \u0435\u043f\u043e\u0445\u0430, \u0440\u0456\u0434, \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0439 \u0436\u0430\u043d\u0440, \u0442\u0430 \u0456\u043d\u0448\u0438\u0445, \u044f\u043a\u0438\u0445 \u043d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0437\u0443\u0441\u0442\u0440\u0456\u0442\u0438 \u0434\u0435\u0456\u043d\u0434\u0435, \u0442\u043e\u0431\u0442\u043e \u044f\u043a\u0456 \u043c\u0430\u044e\u0442\u044c \u0432\u0456\u0434\u043d\u043e\u0448\u0435\u043d\u043d\u044f \u0434\u043e \u0437\u043c\u0456\u0441\u0442\u0443 \u0431\u0430\u0433\u0430\u0442\u044c\u043e\u0445 \u0442\u0432\u043e\u0440\u0456\u0432 \u0432\u043e\u0434\u043d\u043e\u0447\u0430\u0441 \u2013 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u043c\u043e\u0442\u0438\u0432\u0456\u0432 \u0442\u0430 \u0442\u0435\u043c. \u0422\u0430\u043a\u0438\u0439 \u043f\u043e\u0448\u0443\u043a \u043c\u043e\u0436\u043b\u0438\u0432\u0438\u0439 \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u0441\u043f\u0435\u0446\u0456\u0430\u043b\u044c\u043d\u0456\u0439 \u043f\u0456\u0434\u0433\u043e\u0442\u043e\u0432\u0446\u0456 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438, \u0442\u043e\u0431\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0456 \u0457\u0445 \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e \u0432\u043a\u0430\u0437\u0430\u043d\u0438\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0456\u0457\u0432. \u0421\u0430\u043c\u0435 \u0442\u0430\u043a\u0438\u043c \u0447\u0438\u043d\u043e\u043c Wolne Lektury \u0432\u0456\u0434\u0440\u0456\u0437\u043d\u044f\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434 \u0431\u0430\u0433\u0430\u0442\u044c\u043e\u0445 \u0441\u0430\u0439\u0442\u0456\u0432 \u0437 \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043d\u043d\u044f\u043c\u0438 \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u2013 Wolne Lektury \u043d\u0430\u0434\u0430\u0454 \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438 \u0434\u043b\u044f \u0442\u0432\u043e\u0440\u0447\u043e\u0457 \u043f\u0440\u0430\u0446\u0456 \u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0456 \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0438. \u042f\u043a\u0449\u043e \u043d\u0430\u043f\u0440\u0438\u043a\u043b\u0430\u0434 \u0443\u0447\u0435\u043d\u044c \u043e\u0442\u0440\u0438\u043c\u0443\u0454 \u0442\u0435\u043c\u0443 \u0434\u043e\u043c\u0430\u0448\u043d\u044c\u043e\u0433\u043e \u0437\u0430\u0432\u0434\u0430\u043d\u043d\u044f: \u00ab\u041c\u043e\u0442\u0438\u0432 \u0434\u0438\u0442\u0438\u043d\u0438 \u0432 \u0440\u043e\u043c\u0430\u043d\u0442\u0438\u0437\u043c\u0456 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0456 \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u0445 \u0442\u0432\u043e\u0440\u0456\u0432\u00bb, \u043f\u0456\u0441\u043b\u044f \u0442\u0440\u044c\u043e\u0445 \u043a\u043b\u0430\u0446\u0430\u043d\u044c \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u0432\u0456\u043d \u043c\u0430\u0442\u0438\u043c\u0435 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u0456 \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u0434\u043e \u0430\u043d\u0430\u043b\u0456\u0437\u0443. \u0417\u0430\u0432\u0434\u044f\u043a\u0438 \u0442\u0430\u043a\u0438\u043c \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0447\u0438\u0442\u0430\u043d\u043d\u044f \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0441\u0442\u0430\u0454 \u0437\u0430\u0445\u043e\u043f\u043b\u044e\u044e\u0447\u043e\u044e \u043f\u043e\u0434\u043e\u0440\u043e\u0436\u0436\u044e \u043f\u043e \u0441\u0432\u0456\u0442\u0456 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0438.

    \r\n\r\n \r\n\r\n

    \u0427\u0435\u0440\u0433\u043e\u0432\u043e\u044e \u043a\u043e\u0440\u0438\u0441\u043d\u043e\u044e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u043e\u044e Wolne Lektury, \u044f\u043a\u0430 \u0441\u0442\u0430\u0454 \u0432 \u043f\u0440\u0438\u0433\u043e\u0434\u0456 \u0432 \u043f\u0440\u0430\u0446\u0456 \u0432 \u0448\u043a\u043e\u043b\u0456 \u0454 \u043c\u043e\u0436\u043b\u0438\u0432\u0456\u0441\u0442\u044c \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0446\u0456\u043b\u0438\u0445 \u0437\u0431\u0456\u0440\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u0456\u0432, \u044f\u043a\u0456 \u043e\u0431\u0433\u043e\u0432\u043e\u0440\u044e\u0432\u0430\u043b\u0438\u0441\u044f \u043d\u0430\u043f\u0440\u0438\u043a\u043b\u0430\u0434 \u043f\u0440\u043e\u0442\u044f\u0433\u043e\u043c \u0440\u043e\u043a\u0443 \u0432 \u0434\u0430\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0456. \u0422\u0430\u043a\u0456 \u043f\u043e\u043b\u0438\u0446\u0456 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u043c\u043e\u0436\u0443\u0442\u044c \u0431\u0443\u0442\u0438 \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0456 \u0432\u0447\u0438\u0442\u0435\u043b\u0435\u043c/\u0432\u0447\u0438\u0442\u0435\u043b\u044c\u043a\u043e\u044e, \u044f\u043a\u0456 \u0434\u0430\u043b\u0456 \u043c\u043e\u0436\u0443\u0442\u044c \u0432\u0438\u0441\u043b\u0430\u0442\u0438 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u043d\u0438\u0445 \u0441\u0432\u043e\u0457\u043c \u0443\u0447\u043d\u044f\u043c. \u0426\u0456 \u0432 \u0441\u0432\u043e\u044e \u0447\u0435\u0440\u0433\u0443, \u0437\u043c\u043e\u0436\u0443\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043a\u043b\u0430\u0446\u0430\u043d\u043d\u044f\u043c \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0432\u0441\u044e \u0437\u0431\u0456\u0440\u043a\u0443 \u043d\u0430 \u0441\u0432\u0456\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440.

    \r\n\r\n \r\n\r\n

    \u0412\u0441\u0456 \u0442\u0435\u043a\u0441\u0442\u0438 \u0437 \u0441\u0430\u0439\u0442\u0443 Wolne Lektury (\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 html, pdf, epub, txt) \u0454 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u043c\u0438 \u0431\u0435\u0437 \u043e\u0431\u043c\u0435\u0436\u0435\u043d\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u0456 \u043c\u043e\u0436\u043d\u0430 \u0432\u0456\u043b\u044c\u043d\u043e \u043d\u0438\u043c\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u0431\u0435\u0437 \u0436\u043e\u0434\u043d\u0438\u0445 \u0443\u043c\u043e\u0432.

    \r\n\r\n\r\n\r\n

    \u042f\u043a\u0449\u043e \u0442\u0435\u043a\u0441\u0442\u0438 \u0441\u0443\u043f\u0440\u043e\u0432\u043e\u0434\u0436\u0443\u044e\u0442\u044c\u0441\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0456\u0430\u043b\u0430\u043c\u0438 (\u043f\u0440\u0438\u043c\u0456\u0442\u043a\u0430\u043c\u0438, \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u043c\u0438 \u043c\u043e\u0442\u0438\u0432\u0430\u043c\u0438 \u0442\u043e\u0449\u043e), \u044f\u043a\u0456 \u043e\u0445\u043e\u0440\u043e\u043d\u044f\u044e\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c, \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0446\u0438\u0445 \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0456\u0430\u043b\u0456\u0432 \u043d\u0430\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043d\u0430 \u043b\u0456\u0446\u0435\u043d\u0437\u0456\u0457 Creative Commons Attribution \u2013 Share Alike 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    ", + "right_column_pl": "

    O Fundacji

    \r\n\r\n

    Fundacja Nowoczesna Polska powsta\u0142a, poniewa\u017c kszta\u0142cenie dzieci jest kluczem do przysz\u0142o\u015bci Polski. Jednym z\r\n najwa\u017cniejszych zada\u0144, jakie stoj\u0105 przed polsk\u0105 edukacj\u0105, jest walka z cyfrowym wykluczeniem. Umiej\u0119tno\u015b\u0107\r\n korzystania z komputera i internetu w czasach spo\u0142ecze\u0144stwa informacyjnego jest rodzajem elementarza. Ci, kt\u00f3rzy\r\n go nie znaj\u0105, skazani s\u0105 na wegetacj\u0119 na obrze\u017cach nowoczesnego \u015bwiata.

    \r\n \r\n

    Dlatego od siedmiu lat pomagamy dzieciom zrozumie\u0107 i wykorzystywa\u0107 zaawansowane technologie. Fundacja\r\n Nowoczesna Polska tysi\u0105com dzieci chce da\u0107 to, co najcenniejsze: wiedz\u0119 i umiej\u0119tno\u015bci pozwalaj\u0105ce rozumie\u0107\r\n wsp\u00f3\u0142czesny \u015bwiat i wykorzystywa\u0107 mo\u017cliwo\u015bci, jakie on oferuje.

    \r\n \r\n

    Fundacja Nowoczesna Polska \u2013 poza projektem Wolne Lektury \u2013 koordynuje tak\u017ce projekt Wolne Podr\u0119czniki,\r\n tworzony przez ruch spo\u0142eczny nauczycieli wolontariuszy, kt\u00f3rzy korzystaj\u0105c z Internetu pisz\u0105 nowe podr\u0119czniki\r\n dla polskich uczni\u00f3w. Wolne Podr\u0119czniki s\u0105 publikowane na wolnych licencjach \u2013 czyli takich, kt\u00f3re zezwalaj\u0105\r\n ka\u017cdemu na bezp\u0142atne kopiowanie, rozpowszechnianie i aktualizowanie ich bez konieczno\u015bci pytania o zgod\u0119 zespo\u0142u\r\n autor\u00f3w. Ka\u017cdy nauczyciel b\u0119dzie m\u00f3g\u0142 te podr\u0119czniki uzupe\u0142nia\u0107, rozszerza\u0107 i poprawia\u0107 zgodnie z w\u0142asnymi\r\n potrzebami i do\u015bwiadczeniem. Dzi\u0119ki wolnym licencjom mo\u017cna powa\u017cnie obni\u017cy\u0107 koszt podr\u0119cznik\u00f3w wydawanych w\r\n tradycyjnej postaci ksi\u0105\u017cek drukowanych na papierze, a podr\u0119czniki rozpowszechniane w formie elektronicznej b\u0119d\u0105\r\n dost\u0119pne za darmo.

    \r\n\r\n \r\n

    O domenie publicznej

    \r\n \r\n

    W serwisie Wolne Lektury mo\u017cemy zgodnie z prawem publikowa\u0107 tylko te ksi\u0105\u017cki, kt\u00f3re nale\u017c\u0105 do domeny\r\n publicznej, a wi\u0119c te, kt\u00f3re wysz\u0142y ju\u017c spod dzia\u0142ania prawa autorskiego. Domena publiczna to rodzaj skarbca\r\n kultury, wsp\u00f3lnego dobra, z kt\u00f3rego wszyscy mog\u0105 korzysta\u0107 na r\u00f3wnych prawach, bez ogranicze\u0144 i op\u0142at. Istnienie\r\n domeny publicznej jest gwarantem dost\u0119pu do d\u00f3br kultury, ten za\u015b jest naszym obywatelskim prawem zapisanym w\r\n konstytucji.

    \r\n \r\n

    Cho\u0107 zasad\u0105 jest, \u017ce po jakim\u015b czasie wszystkie dzie\u0142a maj\u0105 zasili\u0107 domen\u0119 publiczn\u0105, to czas dzia\u0142ania\r\n polskiego prawa autorskiego zosta\u0142 w ci\u0105gu ostatnich kilkunastu lat znacznie wyd\u0142u\u017cony. Jeszcze na pocz\u0105tku lat\r\n 90. by\u0142o to 25 lat od \u015bmierci autora, potem ten czas wyd\u0142u\u017cono na 50 lat, dzi\u015b jest to ju\u017c lat 70. To oznacza,\r\n \u017ce wielu pozycji z ministerialnych list lektur nie b\u0119dziemy mogli udost\u0119pni\u0107 jeszcze przez wiele lat. Dopiero w\r\n 2020 roku opublikujemy utwory Marka H\u0142aski i Witolda Gombrowicza. Powie\u015bci Kuncewiczowej zasil\u0105 domen\u0119 publiczn\u0105\r\n w roku 2060, a poezje Mi\u0142osza w 2075 roku.

    \r\n \r\n

    Ograniczenia prawa autorskiego odnosz\u0105 si\u0119 tak\u017ce do wyda\u0144 krytycznych i t\u0142umacze\u0144. Do 1 stycznia 2012 roku\r\n b\u0119dziemy czeka\u0107 na \"Wielki Testament\" Villona i inne utwory t\u0142umaczone przez Boya-\u017bele\u0144skiego, a do 2068 roku na\r\n \u201eKubusia Puchatka\u201d Milne'a i inne przek\u0142ady Ireny Tuwim. Nie mamy tak\u017ce prawa upublicznia\u0107 wst\u0119p\u00f3w i przedm\u00f3w\r\n napisanych przez autor\u00f3w, kt\u00f3rzy zmarli mniej ni\u017c 70 lat temu. Z tego w\u0142a\u015bnie powodu zdarza si\u0119 czasem, \u017ce jaki\u015b\r\n utw\u00f3r znajduje si\u0119 na Wolnych Lekturach, ale link do odpowiadaj\u0105cej mu pozycji w Cyfrowej Bibliotece Narodowej\r\n Polona odsy\u0142a do strony, kt\u00f3ra m\u00f3wi, \u017ce utw\u00f3r obj\u0119ty jest ochron\u0105 prawa autorskiego. Znaczy to, \u017ce cho\u0107 sam\r\n tekst nale\u017cy do domeny publicznej i dlatego umieszczamy go w Wolnych Lekturach, to jego wydanie krytyczne,\r\n kt\u00f3rym dysponuje CBN Polona (ze wszystkimi wst\u0119pami, przedmowami i komentarzami redaktor\u00f3w), wci\u0105\u017c jest obj\u0119te\r\n dzia\u0142aniem prawa autorskiego.

    \r\n \r\n

    O domen\u0119 publiczn\u0105 nale\u017cy dba\u0107 i otacza\u0107 j\u0105 ochron\u0105. Kultura to misterny gmach, w kt\u00f3rym kolejne pi\u0119tra mog\u0105\r\n by\u0107 budowane tylko na solidnych podstawach wypracowanych przez poprzednik\u00f3w. Kochanowski bezpo\u015brednio czerpa\u0142 z\r\n tradycji antycznej. Mickiewicz tw\u00f3rczo\u015b\u0107 ludow\u0105 wykorzysta\u0142 do stworzenia najpi\u0119kniejszych polskich wierszy.\r\n Ka\u017cde kolejne pokolenie mo\u017ce si\u0119ga\u0107 wzrokiem dalej, wypracowywa\u0107 w\u0142asny literacki j\u0119zyk i trwale wpisywa\u0107 si\u0119 w\r\n histori\u0119 literatury tylko dzi\u0119ki osi\u0105gni\u0119ciom poprzednik\u00f3w. Dlatego tak wa\u017cna jest wolno\u015b\u0107 w udost\u0119pnianiu i\r\n wykorzystywaniu najwa\u017cniejszych dzie\u0142 polskiej i \u015bwiatowej literatury. Bez domeny publicznej zbudowanie tego\r\n wspania\u0142ego gmachu, jakim jest kultura, by\u0142oby niemo\u017cliwe.

    \r\n", + "page_title_en": "About Wolne Lektury project", + "page_title_es": "Sobre el proyecto Wolne Lektury", + "left_column_lt": "

    Laisvoji Literat\u016bra

    \r\n \r\n \r\n

    Internetine biblioteka \"Laisvoji Literat\u016bra\" (www.laisvojiliteratura.lt) si\u016blanti mokyklin\u0119 literat\u016br\u0105 - \r\n tai \u0160iuolaikines Lenkijos Fondo projektas. Fondas veikia nuo 2007 met\u0173 ir savo rinkiniuose turi mokyklin\u0119 literat\u016br\u0105, \r\n kuria rekomenduoja \u0160vietimo ir Mokslo Ministerij\u0105 ir kuri jau\tpateko \u012f vie\u0161\u0105 Interneto svetain\u0119. Literat\u016bros \r\n k\u016briniai yra apra\u0161yti, sukomentuoti ir yra galima juos parsisi\u0173sti i\u0161 Interneto \u0161iuose formatuose (html, epub, mp3, ogg, odt, txt i pdf). \r\n Galima juos teis\u0117tai, nemokamai ap\u017ei\u016br\u0117ti, parsisi\u0173sti, persiusti kitiems ir cituoti.

    \r\n \r\n \r\n

    Projekto Laisvoji Literat\u016bra nariai tai patyria redaktoriai ir mokytojai, d\u0117ka kuri\u0173 \u0161is portalas yra s\u0105\u017einingas.\r\n Kuriant \u0161\u012f portal\u0105 bendradarbiavome su Lenkijos Nacionalin\u0119 Bibliotek\u0105, kuri pateik\u0117 mums geriausius\tknyg\u0173 leidinius, recenzijas \r\n ir kritikas apie mokyklin\u0119 literat\u016br\u0105. K\u016briniu rinkinys yra pavie\u0161intas Skaitmenin\u0117je Lenkijos Nacionalin\u0117je Bibliotekoje Polona.\r\n Kartu stengiam\u0117s kad mokyklin\u0119 literat\u016br\u0105 \u2013 m\u016bs\u0173 kult\u016bros na\u0161ta \u2013 b\u016bt\u0173 visiem prieinama, nepriklausomai nuo gyvenvietes, u\u017edarbi\u0173,\r\n vikrumo ar ne\u012fgal\u0117jimo. Tai galima pasiekti d\u0117ka ve\u0161iai Interneto svetainei, tai yra rinkinio, kuris n\u0117ra\r\n ribojamas autoriaus teis\u0117mis, o taip pat ir d\u0117ka naujausios technologijos \u012frankiais kurie pad\u0117da padauginti vie\u0161\u0105 turinio prieinamum\u0105\r\n internete.

    \r\n \r\n

    Laisvoji Literat\u016bra tai visi\u0161kai nekomercinis projektas realizuotas pro publico bono. Tod\u0117l labai svarbu yra kad projektu susidom\u0117tu \u017eymios kult\u016bros ir mokslo asmenyb\u0117s. \r\nLenkijoje projekt\u0105 globoj\u0105 Kult\u016bros Ministerija, \u0160vietimo ir Mokslo Ministerij\u0105, \r\nLenkijos Poetu Draugija. Garb\u0117s komitet\u0105 sudaro: prof. Maria\r\n Janion, prof. Gra\u017cyna Borkowska, prof. Przemys\u0142aw\r\n Czapli\u0144ski, prof. Mieczys\u0142aw D\u0105browski, prof. Ewa Kraskowska, prof. Ma\u0142gorzata Czermi\u0144ska, prof. Jerzy Jarz\u0119bski\r\n i prof. Piotr \u015aliwi\u0144ski.

    \r\n \r\n

    Skaitmenines kopijas ruo\u0161ia Lenkijos Nacionalin\u0119 Bibliotek\u0105. Tinklap\u012f projektavo 2ia. HTML versijos tekst\u0173 autorius tai Dariusz Ga\u0142ecki. Teisines paslaugas u\u017etikrina Kanceliarija Grynhoff,\r\n Pri\u017ei\u016br\u0117tojas, Mali\u0144ski. Hosting servis u\u017etikrina\r\n \u012fmon\u0117 EO Networks. Techninius tekst\u0173 apra\u0161imus pad\u0117jo paruo\u0161ti leidykla Korporacija Ha!Art. Logotipas Laisvoji Literat\u016bra tai\r\n Agent\u016bros PZL k\u016brinys. Projekt\u0105 \u017einiasklaidoje remia: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j ir TVP Kultura.

    \r\n \r\n

    Kaip naudoti Laisv\u0105j\u0105 Literat\u016br\u0105?

    \r\n \r\n

    Did\u017eiausia naujov\u0117 projekto Laisvoji Literat\u016bra, skirianti \u0161i projekt\u0105 nuo kitu internetiniu bibliotek\u0173 tai galimyb\u0117 ie\u0161koti teksto naudojant \u012fvairius kriterijus: tradicinius, pvz: k\u016brinio pavadinimas, autorius,\r\n gaidyn\u0117, r\u016b\u0161is, literat\u016brin\u0117 paderm\u0117, bet ir niekur anks\u010diau nesutikti bet pritaikyti prie daugelio \u012fvairi\u0173 k\u016brini\u0173 ir turini\u0173\r\n motyvai ir literat\u016brin\u0117s temos. Tokia paie\u0161ka yra galima d\u0117ka specjalaus -kruop\u0161\u010diai paruo\u0161to- mokyklin\u0117s literat\u016bros tekst\u0173 apra\u0161ymo, tai raiskia jie buvo/yra apra\u0161omi i\u0161 karto panaudojant daugel\u012f kriterij\u0173. Tai skiria Laisv\u0105j\u0105 Literat\u016br\u0105\r\n nuo daugelio kitu apra\u0161ym\u0173 ir pateikia \u012frankius kokybi\u0161kam darbui su tekstu.\r\n O tai skiriasi nuo paruo\u0161tuk\u0173 ar \u0161pargal\u0173. Jeigu mokynys tur\u0117s para\u0161yti namuose darb\u0105 tem\u0105 \u201eVaiko motyvas pagal i\u0161rinktus k\u016brinius ir romantizmo gaidyn\u0117s\u201c, tai paie\u0161ka galima padaryti pagal 3 kriterijus: vaiko motyvas, gaidyn\u0117, romatizmas ir vat pasirodis tekstas paruo\u0161tas analizei.\r\nD\u0117ka tokiu \u012frankiu skaitimas moklin\u0117s literat\u016bros gali b\u016bti \u012fsp\u016bdingas lyg kelion\u0117 per kult\u016bros pasauly.

    \r\n \r\n

    Dar vienas naudingumas - Laisv\u0105ja Literat\u016bra galima pasinaudoti darbe ir mokykloje - tai galimyb\u0117 pasirinkti tekstus paruo\u0161tus pavyzd\u017eiui paskutiniu metu per vien\u0105 klas\u0119.\r\nLentynos su mokykline literat\u016bra kuria mokytojai kurie veliau gali persiust mokiniams nurodym\u0105, o tie gali atsisi\u0173sti vis\u0105 katalog\u0105 \u012f savo disk\u0105.

    \r\n \r\n

    Visi knyg\u0173 tekstai i\u0161 Laisvosios Literat\u016bros tinklapio (\u0161iuose formatuose html, pdf, epub, txt) yra prieinami ne\u017eaid\u017eiant autori\u0173 teisi\u0173 ir galima juos laisvai ir nemokamai naudoti.

    \r\n\r\n

    Jeigu tekstas turi dar pried\u0105 (i\u0161na\u0161\u0105 ir pana\u0161iai) kuris gal\u0117t\u0173 \u017eaisti autori\u0173 teises, med\u017eiagos prijungiamos d\u0117ka Creative Commons licencijos, kuri tuo pat pripa\u017eina autoriaus teises tomis pa\u010diomis s\u0105lygomis 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    \r\n", + "title_fr": "Sur le projet Lectures libres", + "right_column_ru": "

    \u041e \u0444\u043e\u043d\u0434\u0435

    \r\n\r\n

    \u0424\u043e\u043d\u0434 \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041f\u043e\u043b\u044c\u0448\u0430 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u043c \u043a \u0431\u0443\u0434\u0443\u0449\u0435\u043c\u0443 \u041f\u043e\u043b\u044c\u0448\u0438. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437\r\n \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0442 \u043f\u043e\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u0440\u044c\u0431\u0430 \u0441 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c. \u0423\u043c\u0435\u043d\u0438\u0435\r\n \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c \u0438 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u043e\u0439 \u0430\u0437\u0431\u0443\u043a\u0438. \u0422\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435\r\n \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u0435\u0435, \u043e\u0431\u0440\u0435\u0447\u0435\u043d\u044b \u043d\u0430 \u043f\u0440\u043e\u0437\u044f\u0431\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u043a\u0440\u0430\u0438\u043d\u0430\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0438\u0440\u0430.

    \r\n \r\n

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u0441\u0435\u043c\u0438 \u043b\u0435\u0442 \u043c\u044b \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u043c \u0434\u0435\u0442\u044f\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0443\u043a\u043e\u0435\u043c\u043a\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0424\u043e\u043d\u0434\r\n \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041f\u043e\u043b\u044c\u0448\u0430 \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0430\u043c \u0434\u0435\u0442\u0435\u0439 \u0441\u0430\u043c\u043e\u0435 \u0446\u0435\u043d\u043d\u043e\u0435, \u0442.\u0435. \u0437\u043d\u0430\u043d\u0438\u044f \u0438 \u0443\u043c\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u044c\r\n \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u0440 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.

    \r\n \r\n

    \u0424\u043e\u043d\u0434 \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041f\u043e\u043b\u044c\u0448\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442 Wolne Lektury, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 Wolne Podr\u0119czniki.\r\n \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0443\u0447\u0438\u0442\u0435\u043b\u044f-\u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c, \u043f\u0438\u0448\u0443\u0442 \u043d\u043e\u0432\u044b\u0435 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438 \r\n \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0441\u043a\u0438\u0445 \u0443\u0447\u0435\u043d\u0438\u043a\u043e\u0432. Wolne Podr\u0119czniki (\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438) \u0438\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c, \u0442.\u0435. \u0442\u0430\u043a\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442\r\n \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f\r\n \u0430\u0432\u0442\u043e\u0440\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0447\u0438\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u0438 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0432\u043e\u0438\u043c\r\n \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c \u0438 \u043e\u043f\u044b\u0442\u0443. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u0438\u0436\u0438\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430\u043c, \u0438\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\r\n \u0432 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043a\u043d\u0438\u0433, \u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435, \u0442.\u043a. \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438 \u0432 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.

    \r\n\r\n \r\n

    \u041e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435

    \r\n \r\n

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0443, \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 Wolne Lektury, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u0442\u0435 \u043a\u043d\u0438\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u043a \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443\r\n \u0434\u043e\u043c\u0435\u043d\u0443, \u0442.\u0435. \u0442\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u043e. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d - \u044d\u0442\u043e \u0432\u0438\u0434 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\r\n \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0431\u043b\u0430\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0430\u0445 \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\r\n \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b. \u041e\u043d \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\r\n \u0432 \u041a\u043e\u043d\u0441\u0442\u0438\u0442\u0443\u0446\u0438\u0438.

    \r\n \r\n

    \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d, \u0441\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\r\n \u043f\u043e\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043b\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438\u0441\u044f. \u0415\u0449\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 90-\u044b\u0445 \u0433\u0433.\r\n - \u044d\u0442\u043e \u0431\u044b\u043b\u043e 25 \u043b\u0435\u0442 \u0441\u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0430, \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e\u0442 \u0441\u0440\u043e\u043a \u043f\u0440\u043e\u0434\u043b\u0438\u043b\u0441\u044f \u0434\u043e 50 \u043b\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f - \u044d\u0442\u043e \u0443\u0436\u0435 70 \u043b\u0435\u0442. \u042d\u0442\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442,\r\n \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0439 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \r\n 2020 \u0433\u043e\u0434\u0443 \u043c\u044b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u041c\u0430\u0440\u043a\u0430 \u0425\u043b\u0430\u0441\u043a\u043e \u0438 \u0412\u0438\u0442\u043e\u043b\u044c\u0434\u0430 \u0413\u043e\u043c\u0431\u0440\u043e\u0432\u0438\u0447\u0430. \u0420\u043e\u043c\u0430\u043d\u044b \u041a\u0443\u043d\u0446\u0435\u0432\u0438\u0447 \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d\r\n \u0432 2060 \u0433\u043e\u0434\u0443, \u043f\u043e\u044d\u0437\u0438\u044f \u041c\u0438\u043b\u043e\u0448\u0430 \u0436\u0435 - \u0432 2075 \u0433\u043e\u0434\u0443.

    \r\n \r\n

    \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0442\u0430\u043a\u0436\u0435 \u0441 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438. \u0414\u043e 1 \u044f\u043d\u0432\u0430\u0440\u044f 2012 \u0433\u043e\u0434\u0430\r\n \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0436\u0434\u0430\u0442\u044c \"\u0411\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0449\u0430\u043d\u0438\u044f\" \u0412\u0438\u0439\u043e\u043d\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0411\u043e\u0439-\u0416\u0435\u043b\u0435\u043d\u0441\u043a\u0438\u043c. \u0414\u043e 2068 \u0433\u043e\u0434\u0430 \u0436\u0435 -\r\n \u201e\u0412\u0438\u043d\u043d\u0438-\u041f\u0443\u0445\u0430\u201d \u041c\u0438\u043b\u043d\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u0418\u0440\u0435\u043d\u044b \u0422\u0443\u0432\u0438\u043c. \u0423 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f,\r\n \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043c\u0435\u0440\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c 70 \u043b\u0435\u0442 \u0442\u043e\u043c\u0443 \u043d\u0430\u0437\u0430\u0434. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e\r\n \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Wolne Lektury, \u043d\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0435\u043c\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\r\n Polona \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c.\r\n \u0422\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043a \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0435\u043d\u0443 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Wolne Lektury, \u043d\u043e \u043d\u0430 \u0435\u0433\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435\r\n \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Polona (\u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438, \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432), \r\n \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u043e.

    \r\n \r\n

    \u041e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0435\u0433\u043e. \u041a\u0443\u043b\u044c\u0442\u0443\u0440\u0430 - \u044d\u0442\u043e \u0438\u0441\u043a\u0443\u0441\u043d\u043e\u0435 \u0437\u0434\u0430\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0430\u0436\u0438 \u043c\u043e\u0433\u0443\u0442\r\n \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0430 \u0441\u043e\u043b\u0438\u0434\u043d\u044b\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u0445, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0430\u043c\u0438. \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u043f\u0430\u043b\r\n \u0438\u0437 \u0430\u043d\u0442\u0438\u0447\u043d\u043e\u0439 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438. \u041c\u0438\u0446\u043a\u0435\u0432\u0438\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0439\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439.\r\n \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u043a\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u043f\u0440\u043e\u0447\u043d\u043e \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f\r\n \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u043b\u0438\u0448\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0432\u0430\u0436\u043d\u044b\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\r\n \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0441\u043a\u043e\u0439 \u0438 \u043c\u0438\u0440\u043e\u0432\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b. \u0411\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0436\u0435\r\n \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e\u0433\u043e \u0437\u0434\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0438\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0430, \u044f\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c.

    ", + "left_column_fr": "

    Lectures libres

    \r\n \r\n

    La biblioth\u00e8que en ligne avec lectures scolaires \"Lectures libres\" (www.wolnelektury.pl) est un projet r\u00e9alis\u00e9 par la Fondation Pologne Moderne. Le projet a \u00e9t\u00e9 lanc\u00e9 en 2007. Dans son cadre, nous mettons \u00e0 la disposition du lecteur des lectures scolaires, recommend\u00e9es par le Minist\u00e8re de l'Education nationale, qui se trouvent d\u00e9j\u00e0 dans le domaine public. Elles sont prepar\u00e9es, accompagn\u00e9es d'un commentaire et mises \u00e0 la disposition au plusieurs formats (html, epub, mp3, ogg, odt, txt i pdf). Elles peuvent \u00eatre, tout en accord avec la loi, gratuitement lues, t\u00e9l\u00e9charg\u00e9es \u00e0 votre ordinateur, mises \u00e0 la disposition des autres et cit\u00e9es.

    \r\n \r\n

    L'\u00e9quipe du projet Lectures libres consiste des \u00e9ditrices et professeures experiment\u00e9es, ce qui garantit la fiabilit\u00e9 de notre portail. Dans sa cr\u00e9ation nous coop\u00e9rons avec la Biblioth\u00e8que nationale, qui nous fournit les meilleures \u00e9ditions et commentaires critiques des lectures scolaires accessibles, publi\u00e9es dans la Biblioteque nationale num\u00e9rique Polona. Ensemble, nous oeuvrons vers que les textes des lectures - notre h\u00e9ritage culturel - soient accessibles \u00e0 tous, o\u00f9 qu'ils vivent, m\u00eame s'ils ont des ressources limit\u00e9es ou mobilite reduite. C'est possible gr\u00e2ce \u00e0 l'existence du domaine public - collection des oeuvres qui ne sont plus prot\u00e9g\u00e9es par le droit d'auteur, ainsi que gr\u00e2ce aux nouvelles technologies - des outils, qui permettent de multiplier l'accessibilit\u00e9 du mat\u00e9riaux publi\u00e9s dans l'internet.

    \r\n \r\n

    Le project Lectures libres est enti\u00e8rement non-commercial et r\u00e9alis\u00e9 pro publico bono. C'est pourquoi l' appui des personnages reconnus du monde de la culture et de la science est tellement important pour nous. Le projet est r\u00e9alis\u00e9 sous patronat du Minist\u00e8re de Culture et d'Heritage national, Minist\u00e8re de l'Education nationale et l'Association des \u00e9crivains polonais. Les personnes suivantes ont consent\u00e9es \u00e0 participer \u00e0 notre Comit\u00e9 d'honneur: prof. Maria\r\n Janion, prof. Gra\u017cyna Borkowska, prof. Przemys\u0142aw\r\n Czapli\u0144ski, prof. Mieczys\u0142aw D\u0105browski, prof. Ewa Kraskowska, prof. Ma\u0142gorzata Czermi\u0144ska, prof. Jerzy Jarz\u0119bski\r\n et prof. Piotr \u015aliwi\u0144ski.

    \r\n\r\n \r\n

    La Biblioth\u00e8que nationale s'occupe de la num\u00e9risation et correcte des textes. Le site internet a \u00e9t\u00e9 mis en place par 2ia. L'auteur du langage de composition des textes sur Lectures libres, bas\u00e9 sur langage XML est Dariusz Ga\u0142ecki. Le service juridique autour de Lectures libres est assur\u00e9 par Kancelaria Grynhoff,\r\n Wo\u017any, Mali\u0144ski. Le hosting du site est assur\u00e9 par la soci\u00e9t\u00e9 EO Networks. La maison d'\u00e9dition Korporacja Ha!Art aide \u00e0 la r\u00e9daction technique des textes. Le logotype des Lectures libres a \u00e9t\u00e9 cr\u00e9\u00e9 par l'agence PZL. Le projet est r\u00e9alis\u00e9 sous le patronat m\u00e9dial de: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j et TVP Kultura.

    \r\n \r\n

    Comment utiliser Lectures libres?

    \r\n \r\n

    La plus grande innovation qui distingue ce projet des autres biblioth\u00e8ques en ligne est la possibilit\u00e9 d'ex\u00e9cuter la recherche dans les textes selon de diff\u00e9rents crit\u00e8res: traditionnels, tels que le titre, l'auteur, l'\u00e9poque, type et genre litt\u00e9raire, mais aussi d'autres, qu'on ne rencontre pas ailleurs, c'est \u00e0 dire qui ont r\u00e9f\u00e9rence au contenu des plusieurs oeuvres en m\u00eame temps - des motifs et th\u00e8mes litt\u00e9raires. Une telle recherche est possible gr\u00e2ce \u00e0 la pr\u00e9paration sp\u00e9ciale du texte des lectures scolaires, qui consiste \u00e0 les d\u00e9crire avec les crit\u00e8res \u00e9num\u00e9r\u00e9s. C'est la plus grande diff\u00e9rence entre Lectures libres et plusieurs sites consacr\u00e9s \u00e0 pr\u00e9senter les lectures scolaires - notre site vous fournit des instruments pour travailler cr\u00e9ativement avec le texte, et non pas de pompes toutes pr\u00eates. Par example, si un \u00e9l\u00e8ve obtient un travail maison \"Le motif de l'enfance dans l'\u00e9poque du romantisme, bas\u00e9 sur oeuvres choisies\", en trois clics sur notre site il pourra acc\u00e9der par son ordinateur \u00e0 la liste des textes \u00e0 analyser. C'est gr\u00e2ce au tels instruments que la lecture devient un voyage fascinant dans le monde de culture.

    \r\n \r\n

    Une autre caract\u00e9ristique de Lectures libres, tr\u00e8s utile dans le travail \u00e0 l'\u00e9cole, est la possiblit\u00e9 de cr\u00e9er toutes les s\u00e9ries des textes analys\u00e9s par example au cours de l'ann\u00e9e par une classe. De telles \u00e9tag\u00e8res sont cr\u00e9\u00e9es par un enseignant/une enseignante, qui peut ensuite envoyer un lien \u00e0 cette collection \u00e0 ses \u00e9l\u00e8ves. Ceux-ci peuvent ensuite t\u00e9l\u00e9charger toute la s\u00e9rie sur leurs oridinateurs avec un seul clic sur le site.

    \r\n \r\n

    Tous les textes des livres dans le site Lectures libres (au formats html, pdf, epub, txt) sont accessibles hors les restrictions du droit d'auteur et peuvent \u00eatre utilis\u00e9s librement sans aucunes conditions.

    \r\n\r\n

    Si les textes sont accompagn\u00e9s par des mat\u00e9riaux additionnels (annotations, motifs litt\u00e9raires etc.), soumis \u00e0 la droit d'auteur, ces mat\u00e9riaux additionnels sont mis \u00e0 la disposition sous licence Creative Commons Paternite, Partage des conditions initiales \u00e0 l'identique 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    \r\n", + "title": "About Wolne Lektury project", + "title_lt": "Apie projekt\u00b9 Laisvoji Literatura", + "right_column": "

    About the foundation

    \r\n\r\n

    Modern Poland Foundation was established because education of children is a key to the future. One of the most important objectives that Polish education has to approach is a struggle with digital retardation. The skill in using a computer and the Internet is a kind of elemental knowledge in the age of information society. One who does not have it, is condemned to a vegetative existence on the fringes of modern world.

    \r\n \r\n

    It is the reason why for seven years we have helped (and still do) the children in understanding and using the high technologies. Modern Poland Foundation wants to give a thousands of children what is the most valuable: knowledge and abilities letting them understand modern world and take advantage of its opportunities.

    \r\n

    Modern Poland Fundation - apart from Wolne Lektury project - is as well coordinating Wolne Podr\u0119czniki project. It is created by a social movement of voluteering teachers. With the use of the Internet, they are writing new coursebooks for Polish pupils. Wolne Podr\u0119czniki are published openly-licensed (meaning it gives the user certain copyright freedom i.e. the books can be copied, distributed and updated without the necessity of asking the team of authors for permission). Every teacher will be able to supplement, expand and improve the coursebooks in accordance with to their own needs and experience. Thanks to the open source the price of the traditional coursebooks published in printed format will seriously decrease and the access to the electronic coursebooks will be free.

    \r\n\r\n\r\n\r\n

    About the public domain

    \r\n \r\n

    On the Wolne Lektury website one can lawfully publish only these books that exist in the public domain, meaning the books that are not covered by copyrigh law anymore. Public domain is a kind of a treasure trove of culture, of public goods that everyone can draw from on equal rights, without restrictions and payments. The existence of public domain is a surety of the access to the cultural acheivments, and such an entitlement is our civil and constitutional right. .

    \r\n

    Albeit there is a rule that each and every literary work is to enter the public domain some day, the time period of validity of the Polish copyrights was considerably prolonged over the last dozen or so years. Only in the early 90s the period was to last 25 years since the author's death, later on it was extended to 50 years and today the time period of copyrights' validity amounts 70 years. This means that a lot of literary works listed on departamental list of obligatory readings will not be published for many years. Not until 2020 shall we be able to publish works of Marek H\u0142asko and Witold Gombrowicz. The novels of Kuncewiczowa will enter the public domain in 2060, and the poems of Mi\u0142osz - in 2075.

    \r\n

    The restrictions of copyrights apply as well to editions with critical apparatus and to translations. We will wait for Villon's \"Le grand testament\" and other poems untill January 1, 2012 as they were translated by Boy-\u017bele\u0144ski. Not until 2068 will we publish Milne's \"Winnie-the-Pooh\" and other translations by Irena Tuwim. Moreover, we do not have the right to publish the introductions and prefaces written by authors that died no sooner than 70 years ago. It is the reason why sometimes a literary work is listed on Wolne Lektury but at the same time it is hyperlinked to a matching title in the Digital National Library Polona, directing the visitor to a website with information that the book is copyrighted. It means that even though the literary text is in the public domain - we listed it on Wolne Lektury - its edition with critical apparatus, DNL Polona property (containing every introduction, preface and editorial comment) is still covered by the copyright law.

    \r\n

    The public domain should be looked after and protected. Culture is a fine edifice and the consecutive floors can be erected only when the base is built solidly by the predecessors. Kochanowski drew extensively on the classical literary tradition. Mickiewicz used the folk works to create the most beautiful Polish poems. Every next generation can plan far into the future, develop their own literary language and permanently become part of the history of literature due to the achievments of their predecessors. That is why the freedom of using and making available the most important works of Polish and world literature is so essential. Without the public domain it would be impossible to erect such a tremendous edifice of culture as it is.

    ", + "right_column_es": "

    Sobre la Fundaci\u00f3n

    \r\n\r\n\r\n\r\n

    La Fundaci\u00f3n Polonia Moderna fue inventada con el fin de educar a los ni\u00f1os, asunto clave para el futuro de Polonia. Una de las tareas m\u00e1s importantes que la educaci\u00f3n polaca tiene que enfrentar es la lucha contra la exclusi\u00f3n virtual. La habilidad de usar el ordenador e internet en los tiempos de la sociedad de la informaci\u00f3n es una habilidad fundamental. Los que no la posean van a ser olvidados al margen del mundo moderno.

    \r\n\r\n \r\n\r\n

    Por lo tanto, desde hace siete a\u00f1os ayudamos a los ni\u00f1os a entender y usar las tecnolog\u00edas avanzadas. La Fundaci\u00f3n Polonia Moderna quiere dar a miles de ni\u00f1os lo m\u00e1s importante: el conocimiento y las habilidades que permiten a entender el mundo contempor\u00e1neo y hacer un buen uso de las posibilidades que nos ofrece.

    \r\n\r\n \r\n\r\n

    La fundaci\u00f3n Polonia Moderna, adem\u00e1s del proyecto Wolne Lektury, est\u00e1 coordinando el proyecto Wolne Podr\u0119czniki, creado por un movimiento social de profesofes-voluntarios quienes, usando internet, escriben nuevos manuales para los estudiantes. Wolne Podr\u0119czniki se publican bajo licencia libre, es decir, que se los puede copiar, diseminar y actualizar sin pedir permiso a los autores. Cada uno de los profesores los podr\u00e1 completar, ampliar i corregir seg\u00fan su propia experiencia y necesidades. Gracias a la licencia libre se puede reducir los precios de los manuales editados de forma tradicional en papel y proporcionar los manuales electr\u00f3nicos gratuitamente.

    \r\n\r\n\r\n\r\n \r\n\r\n

    Sobre el dominio p\u00fablico

    \r\n\r\n \r\n\r\n

    En la p\u00e1gina Wolne Lektury podemos publicar legalmente s\u00f3lo los libros que pertenecen al dominio p\u00fablico, es decir, estos que no est\u00e1n cubiertos por el derecho de autor. El dominio p\u00fablico es como un tesoro de la cultura, un bien com\u00fan del que todos pueden disfrutar con igualdad, sin restricciones y pagos. La existencia del dominio p\u00fablico garantiza el acceso a los bienes culturales que es nuestro derecho consagrado en la Constutuci\u00f3n.

    \r\n\r\n

    Seg\u00fan la regla general todas las obras, despu\u00e9s de un tiempo determinado, se incorporan al dominio p\u00fablico. Sin embargo, en Polonia el plazo de protecci\u00f3n del derecho de autor se ha extendido considerablemente en los \u00faltimos a\u00f1os. En los principios de los a\u00f1os 90 eran 25 a\u00f1os tras la muerte del autor, despu\u00e9s este periodo de tiempo se extendi\u00f3 hasta 50 a\u00f1os y hoy son 70 a\u00f1os. Esto significa que no podremos proporcionar muchas lecturas durante mucho tiempo. Las obras de Marek H\u0142asko o Witold Gombrowicz no las podremos publicar hasta el a\u00f1o 2020. Las novelas de Kuncewiczowa entrar\u00e1n en el dominio p\u00fablico en el a\u00f1o 2060 y los poemas de Mi\u0142osz en 2075.

    \r\n\r\n \r\n\r\n

    Las limitaciones del derecho de autor cubren tambi\u00e9n las ediciones cr\u00edticas y traducciones. Tenemos que esperar hasta el 1 de enero de 2012 para el \u201cGran Testamento\u201d de Villon y otras obras traducidas por Boy-\u017bele\u0144ski y hasta el a\u00f1o 2068 para \u201cWinnie the Pooh\u201d de Milne y otras traducciones de Irena Tuwim. Tampoco tenemos derecho para publicar introducciones o pr\u00f3logos escritos por autores que murieron hace menos de 70 a\u00f1os. Por eso puede ocurrir que una lectura se encontar\u00e1 en Wolne Lektury pero el enlace correspondiente en la electr\u00f3nica Biblioteca Nacional Polona nos lleva a otra p\u00e1gina informando que esta obra est\u00e1 cubierta por el derecho de autor. Esto significa que aunque el texto propiamente dicho sea del dominio p\u00fablico, y por eso lo publicamos en Wolne Lektury, su edici\u00f3n cr\u00edtica (con todos inicios, pr\u00f3logos y comentarios) todav\u00eda est\u00e1 cubierto por el derecho de autor.

    \r\n\r\n

    Se debe cuidar y proteger al dominio p\u00fablico. La cultura es un edificio sofisticado en \u00e9l que las plantas siguientes pueden ser construidas s\u00f3lo sobre bases s\u00f3lidas. Kochanowski se inspiraba directamente en la tradici\u00f3n cl\u00e1sica. Mickiewicz us\u00f3 la tradici\u00f3n del pueblo para escribir los mejores poemas en polaco. Cada siguiente generaci\u00f3n, gracias a los logros de sus antecedentes, puede ver m\u00e1s lejos, crear su propio lenguaje literario e inscribirse para siempre en la historia de la literatura. As\u00ed que es muy importante publicar libremente las obras m\u00e1s grandes tanto de la literatura polaca como la mundial. Sin el dominio p\u00fablico la construcci\u00f3n del maravilloso edificio de la cultura ser\u00eda imposible.

    ", + "right_column_en": "

    About the foundation

    \r\n\r\n

    Modern Poland Foundation was established because education of children is a key to the future. One of the most important objectives that Polish education has to approach is a struggle with digital retardation. The skill in using a computer and the Internet is a kind of elemental knowledge in the age of information society. One who does not have it, is condemned to a vegetative existence on the fringes of modern world.

    \r\n \r\n

    It is the reason why for seven years we have helped (and still do) the children in understanding and using the high technologies. Modern Poland Foundation wants to give a thousands of children what is the most valuable: knowledge and abilities letting them understand modern world and take advantage of its opportunities.

    \r\n

    Modern Poland Fundation - apart from Wolne Lektury project - is as well coordinating Wolne Podr\u0119czniki project. It is created by a social movement of voluteering teachers. With the use of the Internet, they are writing new coursebooks for Polish pupils. Wolne Podr\u0119czniki are published openly-licensed (meaning it gives the user certain copyright freedom i.e. the books can be copied, distributed and updated without the necessity of asking the team of authors for permission). Every teacher will be able to supplement, expand and improve the coursebooks in accordance with to their own needs and experience. Thanks to the open source the price of the traditional coursebooks published in printed format will seriously decrease and the access to the electronic coursebooks will be free.

    \r\n\r\n\r\n\r\n

    About the public domain

    \r\n \r\n

    On the Wolne Lektury website one can lawfully publish only these books that exist in the public domain, meaning the books that are not covered by copyrigh law anymore. Public domain is a kind of a treasure trove of culture, of public goods that everyone can draw from on equal rights, without restrictions and payments. The existence of public domain is a surety of the access to the cultural acheivments, and such an entitlement is our civil and constitutional right. .

    \r\n

    Albeit there is a rule that each and every literary work is to enter the public domain some day, the time period of validity of the Polish copyrights was considerably prolonged over the last dozen or so years. Only in the early 90s the period was to last 25 years since the author's death, later on it was extended to 50 years and today the time period of copyrights' validity amounts 70 years. This means that a lot of literary works listed on departamental list of obligatory readings will not be published for many years. Not until 2020 shall we be able to publish works of Marek H\u0142asko and Witold Gombrowicz. The novels of Kuncewiczowa will enter the public domain in 2060, and the poems of Mi\u0142osz - in 2075.

    \r\n

    The restrictions of copyrights apply as well to editions with critical apparatus and to translations. We will wait for Villon's \"Le grand testament\" and other poems untill January 1, 2012 as they were translated by Boy-\u017bele\u0144ski. Not until 2068 will we publish Milne's \"Winnie-the-Pooh\" and other translations by Irena Tuwim. Moreover, we do not have the right to publish the introductions and prefaces written by authors that died no sooner than 70 years ago. It is the reason why sometimes a literary work is listed on Wolne Lektury but at the same time it is hyperlinked to a matching title in the Digital National Library Polona, directing the visitor to a website with information that the book is copyrighted. It means that even though the literary text is in the public domain - we listed it on Wolne Lektury - its edition with critical apparatus, DNL Polona property (containing every introduction, preface and editorial comment) is still covered by the copyright law.

    \r\n

    The public domain should be looked after and protected. Culture is a fine edifice and the consecutive floors can be erected only when the base is built solidly by the predecessors. Kochanowski drew extensively on the classical literary tradition. Mickiewicz used the folk works to create the most beautiful Polish poems. Every next generation can plan far into the future, develop their own literary language and permanently become part of the history of literature due to the achievments of their predecessors. That is why the freedom of using and making available the most important works of Polish and world literature is so essential. Without the public domain it would be impossible to erect such a tremendous edifice of culture as it is.

    ", + "left_column_de": "\ufeff

    Freie Lekt\u00fcren

    \r\n \r\n

    Internetbibliothek mit Schullekt\u00fcren \u201eFreie Lekt\u00fcren\u201d (www.wolnelektury.pl) ist ein Projekt, \r\n das von der Stiftung Modernes Polen gef\u00f6rdert wird. Die Stiftung ist seit 2007 t\u00e4tig und hat bisher \r\n viele Schullekt\u00fcren aus dem Bibliothekbestand zur \u00f6ffentlichen Nutzung freigestellt. Die gemeinfreien \r\n Schullekt\u00fcren werden ausdr\u00fccklich vom Bildungsministerium empfohlen. Die B\u00fccher wurden bearbeitet, \r\n mit Kommentaren versehen und sind in HTML-, EPUB-, MP3-, OGG-, ODT-, TXT- und PDF- Formaten zug\u00e4nglich. Inhalte \r\n aus den B\u00fcchern d\u00fcrfen frei genutzt, gespeichert, zitiert und an Dritte (Freunde, Bekannte) weitergegeben werden.

    \r\n \r\n

    In der Projektgruppe Freie Lekt\u00fcren arbeiten erfahrene Redakteure und Lehrerinnen, die eine \r\n professionelle Arbeit an der Mitgestaltung unseres Portals leisten. Hierbei arbeiten wir ganz \r\n eng mit der Nationalbibliothek zusammen, die uns mit besten Buchausgaben und kritischen \r\n Schulbuchanalysen beliefert, die bereits in Digitaler Nationalbibliothek Polona ver\u00f6ffentlicht wurden. \r\n Wir sind stets bem\u00fcht, die Inhalte aus den Lekt\u00fcren - unsere Kulturerbe - f\u00fcr alle zug\u00e4nglich \r\n zu machen und zwar unabh\u00e4ngig vom Wohnort und sozialer oder finanzieller Lage. Dies ist nur dank \r\n dem Bestehen der Publik Domain \u2013 d.h. die hier ver\u00f6ffentlichten Werkbest\u00e4nde unterliegen \r\n keinem Uhrheberrecht mehr- und dank modernen Technologien m\u00f6glich, die den Zugang zu freien Medien wesentlich erleichtert haben. .

    \r\n \r\n \r\n

    Das Projekt Freie Lekt\u00fcren hat keinen kommerziellen Hintergrund und ist ein \"pro Bono publico\" Projekt \r\n (zum Wohle der \u00d6ffentlichkeit). Die Unterst\u00fctzung von prominenten Pers\u00f6nlichkeiten aus dem Kultur- \r\n und Wissenschaftsbereich ist uns sehr wichtig. Die Ehrenschirmherrschaft f\u00fcr das Projekt Freie Lekt\u00fcren \r\n haben Ministerium f\u00fcr Kultur und Nationales Erbe, Ministerium f\u00fcr Bildung und der Polnische \r\n Schriftstellerverband \u00fcbernommen. Ihre Mitgliedschaft im Ehrenkomitee Freie Lekt\u00fcren haben zugesagt: prof. Maria\r\n Janion, prof. Gra\u017cyna Borkowska, prof. Przemys\u0142aw Czapli\u0144ski, prof. Mieczys\u0142aw D\u0105browski, prof. Ewa Kraskowska, \r\n prof. Ma\u0142gorzata Czermi\u0144ska, prof. Jerzy Jarz\u0119bski und prof. Piotr \u015aliwi\u0144ski.

    \r\n\r\n\r\n

    Digitalisierung von Texten und Korrekturarbeiten leistet Nationalbibliothek. Die Webseite wurde von 2ia entworfen. \r\n Dariusz Ga\u0142ecki ist f\u00fcr die Umsetzung von Inhalten und Struktur in HTML verantwortlich. Rechtliche Dienste \r\n leistet Rechtskanzlei Grynhoff, Wo\u017any, Mali\u0144ski. F\u00fcr Webhosting ist Firma EO Networks zust\u00e4ndig. Der Verlag Ha!Art Korporation \r\n unterst\u00fctzt uns im Bereich der technischen Textverarbeitung. Das Logo der Freien Lekt\u00fcren wurde von PZL Agentur entworfen. \r\n Mediale Schirmherrschaft \u00fcbernahmen: Dziennik, Elle, Tok.fm, Biblioteka Analiz, Tygodnik Powszechny, Przekr\u00f3j i TVP Kultura.

    \r\n \r\n \r\n \r\n

    So nutzen Sie den Freie Lekt\u00fcren Service

    \r\n \r\n

    Die wichtigste Innovation der Freien Lekt\u00fcren, die dieses Projekt von anderen Internetbibliotheken \r\n so unterscheidet, ist die fortgeschrittene Suchfunktion, die die Suche nach unterschiedlichen Kriterien zul\u00e4sst. \r\n Zum einen kann die Literaturrecherche nach traditionellen Suchkriterien wie Titel, Autor, Epoche, Art, \r\n Gattung durchgef\u00fchrt werden, zum anderen l\u00e4sst sich das gesamte Archiv auf literarische Motive und Themen durchsuchen. \r\n Solche Suchdienste sind nur dank spezieller Textbearbeitung von Schullekt\u00fcren m\u00f6glich, die genau an erw\u00e4hnte Suchkriterien \r\n angepasst wurden. Genau an dieser Stelle liegt der Unterschied unseres Services zu anderen Internetbibliotheken, \r\n die Schullekt\u00fcren anbieten - wir stellen kreative Arbeitswerkzeuge f\u00fcr die Textverarbeitung bereit und keine blo\u00dfe Spickzettel. \r\n Wenn z.B. ein Sch\u00fcller eine Hausaufgabe zum Thema \" Kindermotiv in der Epoche der Romantik in ausgew\u00e4hlten Werken\" bekommt, \r\n so braucht er nur dreimal unsere Seite anzuklicken und schon kommt auf seinem Bildschirm eine zur Analyse vorbereitete Textsammlung.\r\n So wird das B\u00fccherlesen zu der faszinierenden und bezaubernden Reise in der Kulturwelt.

    \r\n \r\n \r\n \r\n \r\n \r\n \r\n

    Eine andere innovative Funktion, die unser Service Freie Lekt\u00fcren zur Verf\u00fcgung stellt und die in der Schularbeit \r\n sehr n\u00fctzlich sein kann, ist die Sortierfunktion ganzer Textsammlungen, die z.B. j\u00e4hrlich von eine Schulgruppe \r\n zu bearbeiten sind. Solche virtuelle Regale f\u00fcr Schullekt\u00fcren werden von der Lehrerin erstellt, die dann den link \r\n mit ausgesuchten Textsammlungen an Sch\u00fcler versenden kann. Der Datensatz kann dann mit nur einem Klick heruntergeladen werden.

    \r\n \r\n

    Alle B\u00fccher in HTML, PDF, EPUB und TXT-Formaten, die sich auf dem Portal Freien Lekt\u00fcren befinden, sind frei zug\u00e4nglich und unterliegen keinem Urheberrecht.

    \r\n\r\n\r\n\r\n

    Texte mit Zusatzmaterialien (Anmerkungen, literarische Motive u.a.), die urheberrechtlich gesch\u00fctzt sind, \r\n werden unter der Lizenz Creative Commons (Anerkennung der Urheberschaft) unter gleichen Bedingungen \r\n zur Verf\u00fcgung gestellt 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    \r\n", + "title_uk": "\u041f\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0442 Wolne Lektury", + "right_column_fr": "

    En savoir plus sur la Fondation

    \r\n\r\n

    La Fondation Pologne Moderne a \u00e9t\u00e9 cr\u00e9\u00e9e pour aider \u00e0 instruire les enfants, ce qui est indispensable pour l'avenir de Pologne. Un de plus grands d\u00e9fis devant l'\u00e9ducation polonaise est la lutte contre l'exclusion num\u00e9rique. Savoir utiliser l'ordinateur et l'internet est une comp\u00e9tence \u00e9l\u00e9mentaire dans la soci\u00e9t\u00e9 de l'information. Ceux qui la manquent sont condamn\u00e9s \u00e0 vivre \u00e0 la marge du monde contemporain.

    \r\n \r\n

    C'est pourquoi, depuis sept ann\u00e9es, nous aidons les enfants \u00e0 comprendre et utiliser les TICE. La Fondation Pologne Moderne veut donner aux miliers des enfants ce qui est le plus pr\u00e9cieux: le savoir et les comp\u00e9tences qui permettent de comprendre le monde contemporain et de profiter des possibilit\u00e9s qui'il offre.

    \r\n \r\n

    La Fondation Pologne Moderne - hors du projet Lectures libres - coordone aussi le projet Manuels libres (Wolne Podr\u0119czniki),\r\n qui est un mouvement volontaire des enseignants, qui en utilisant l'internet, cr\u00e9ent de nouveaux manuels pour des \u00e9l\u00e8ves polonais. Manuels libres sont aussi publi\u00e9s sous licence libre - qui permet \u00e0 chacun de les copier, transmettre et actualiser gratuitement, sans \u00eatre oblig\u00e9 de demander la permission de l'\u00e9quipe des auteurs. Chaque enseignant pourra compl\u00e9ter, d\u00e9velopper et am\u00e9liorer ces manuels selon ses besoins et exp\u00e9rience. Gr\u00e2ce aux licences libres nous pouvons dramatiquement diminuer les prix des manuels publi\u00e9s au forme traditionnelle des livres imprim\u00e9s sur papier, et les manuels \u00e9lectroniques seront accessibles gratuitement.

    \r\n\r\n \r\n

    Sur le domaine public

    \r\n \r\n

    Sur le site Lectures libres, pour \u00eatre en accord avec la loi, nous ne pouvons publier que les livres qui sont dans le domaine public, c'est-\u00e0-dire ceux qui ne sont plus prot\u00e9g\u00e9s par le droit d'auteur. Le domaine public est un sorte de tr\u00e9sor de culture, dont tous peuvent profiter \u00e9galement, sans restrictions et paiements. L'existence du domaine public garantit notre acc\u00e8s au biens de la culture, qui est notre droit civique, inscrite dans la constitution.

    \r\n \r\n

    Bien qu'en principe avec le temps toutes les oeuvres entreront dans le domaine public, le terme de protection du droit d'auteur a \u00e9t\u00e9 prolong\u00e9 ces derni\u00e8res ann\u00e9es. Au d\u00e9but des ann\u00e9es 90, c'\u00e9tait 25 ans apr\u00e8s la mort de l'auteur, la p\u00e9riode prolong\u00e9e ensuite jusqu'\u00e0 50 ans, et aujourd'hui d\u00e9j\u00e0 70 ans. Cela veut dire que beaucoup des oeuvres inscrites surla liste minist\u00e9rielle de lectures scolaires ne seront mises \u00e0 la disposition du lecteur encore pendent une tr\u00e8s longue p\u00e9riode. Ce ne sera qu'en 2020 qu'on pourra publier les oeuvres de Marek H\u0142asko et Witold Gombrowicz. Les romans de Kuncewiczowa entreront dans le domaine public en 2060, et les po\u00e8mes de Mi\u0142osz en 2075.

    \r\n \r\n

    Les restrictions du droit d'auteur s'appliquent aussi aux publications critiques et traductions. Il nous faudra attendre jusqu'au 1er janvier 2012 pour \"Le Testament\" de Fran\u00e7ois Villon et autres oeuvres traduites par Boy-\u017bele\u0144ski, et jusqu'a 2068 pour \r\n \u201eWinnie l'ourson\u201d de Milne et autres traductions d'Irena Tuwim. Nous ne pouvons non plus publier les introductions et avant propos \u00e9crits par auteurs qui sont morts moins de 70 ans avant. C'est pourquoi il arrive qu'une oeuvre se trouve sur Lectures libres, mais le lien \u00e0 la position dans la Biblioteque nationale num\u00e9rique Polona vous renvoie au page qui dit que l'oeuvre est prot\u00e9g\u00e9e par le droit d'auteur. Cela veut dire que m\u00eame si le texte lui-m\u00eame est dans le domaine public et peut \u00eatre publi\u00e9 sur Lectures libres, son \u00e9dition critique, dans la disposition de la Biblioteqhe num\u00e9rique (avec des introductions, avant propos et commentaires des \u00e9diteurs) est toujours prot\u00e9g\u00e9e par le droit d'auteur.

    \r\n \r\n

    Il faut s'occuper bien du domaine public et le prot\u00e9ger. La culture est un grand b\u00e2timent, o\u00f9 les \u00e9tages successives peuvent \u00eatre ajout\u00e9es seulement sur une base solide pr\u00e9par\u00e9e par nos pr\u00e9d\u00e9cesseurs. Kochanowski s'inspirait directement de la tradition antique. Mickiewicz a utilis\u00e9 le folklore pour cr\u00e9er de plus beaux po\u00e8mes polonais. Chaque g\u00e9n\u00e9ration peut voir plus loin, cr\u00e9er sa propre langue litt\u00e9raire et s'inscrire dans l'histoire de la litt\u00e9rature seulement gr\u00e2ce aux accomplissements de ses pr\u00e9d\u00e9cesseurs. C'est pourquoi la libert\u00e9 de rendre accessible et utiliser les chefs-d'oeuvre de la litt\u00e9rature polonaise et mondiale est si importante. Sans le domaine public, il serait impossible de construire ce b\u00e2timent magnifique qu'est la culture.

    \r\n", + "left_column": "

    Wolne Lektury

    \r\n \r\n

    Web library with the school obligatory readings \"Wolne Lektury\" (www.wolnelektury.pl) is a project carried out by Modern Poland Foundation. Wolne Lektury website works since 2007. It provides the visitors with the school readings recommended Ministerstwo Edukacji Narodowej which entered the public domain. The literary works are drawn up, annotated and available in several formats (html, epub, mp3, ogg, odt, txt and pdf). Under the Polish law, they can be read online, downloaded, cited and shared.

    \r\n

    Wolne Lektury project team comprises experienced editors and teachers so that our website content is solid and reliable. To create it, we cooperate with National Library which provides us with the best available editions of the books as well as the critical studies of the school readings, published in Digital National Library Polona. Together we try our best to make the texts of the books (our cultural legacy) available for everyone, regardless of where one is living, how much money does one have or whether one is handicapped or not. It is possible only due to the public domain concept, meaning a collection of literary works that are not copyrighted, as well as high technologies - tools that let us increase availability of the text published on the Internet.

    \r\n

    Wolne Lektury project is completely uncommercial and it is carried out pro publico bono. Therefore the support of the eminent personages conncted with culture and sciences is very important for us. Wolne Lektury project is held under the honorary patronage of Ministerstwo Kultury i Dziedzictwa Narodowego, Ministerstwo Edukacji Narodowej and Polish Writers Association. In the Honorary Comitee of Wolne Lektury agreed to sit Professor Maria\r\n Janion, Professor Gra\u017cyna Borkowska, Professor Przemys\u0142aw\r\n Czapli\u0144ski, Professor Mieczys\u0142aw D\u0105browski, Professor Ewa Kraskowska, Professor Ma\u0142gorzata Czermi\u0144ska, Professor Jerzy Jarz\u0119bski\r\n and Professor Piotr \u015aliwi\u0144ski.

    \r\n\r\n

    Digitalisation and proofreading is provided by the National Library. The website was designed by 2ia. The author of the programming language of the repository of Free Literature texts, based on the XML language is Dariusz Ga\u0142ecki. Grynhoff, Wo\u017any, Mali\u0144ski office provides us with the legal service. Web hosting is provided by EO Networks company. Publishing house Korporacja Ha!Art helps us in proofreading. The logo of Wolne Lektury is a creation of PZL agency. The project is held under media patronage of: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j and TVP Kultura.

    \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n

    How should I use Wolne Lektury?

    The most imporant innovation of Wolne Lektury that distinguishes this project from the others is the possibility of searching for the texts with the application of variety of criteria: traditional ones, such as the title, author, period, form and genre, as well as unusual ones, concerning many literary works at once, i.e. literary motifs and themes. This kind of serch is faesible due to special preparation of the books as they are now described with the parameters mentioned above. It is the element that differs Wolne Lektury from the other editions of school readings. Wolne Lektury webiste provides the reader with devices that come in handy in when creative thinking is needed whereas some editions of the readings are simply cribs. For instance, if a student is asked to prepare an essay on topic \"The child in Romantic literature\", when searching our website, he only must mouse-click three times to find a collection of necessary texts. Due to this kind of tools reading books changes into fascinatng journey into the world of culture.

    \r\n

    Another useful function of Wolne Lektury that comes in handy when at home or at school is the possibility of combining the texts that are discussed during the school year into a list. The lists are called bookshelves and they are created by a teacher. Next the teacher may send the adequate hyperlink to his pupils and they can download the complete set of readings with one mouse click.

    \r\n

    Every literary work available on Wolne Lektury website (in html, pdf, epub, txt formats) is not covered by copyright law and can be freely used with no legal consequences.

    \r\n\r\n

    If the texts are provided with some extra materials (annotations, motifs) which are copyrighted, then the extras are accesible under Creative Commons Attribution - Share Alike 3.0 PL licence(http://creativecommons.org/licenses/by-sa/3.0/).

    ", + "right_column_uk": "

    \u041f\u0440\u043e \u0424\u043e\u043d\u0434

    \r\n\r\n

    \u0424\u043e\u043d\u0434 \u041c\u043e\u0434\u0435\u0440\u043d\u0430 \u041f\u043e\u043b\u044c\u0449\u0430 \u0431\u0443\u0432 \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439, \u0442\u043e\u043c\u0443 \u0449\u043e \u043e\u0441\u0432\u0456\u0442\u0430 \u0434\u0456\u0442\u0435\u0439 \u0454 \u043a\u043b\u044e\u0447\u0435\u043c \u0434\u043e \u043c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e \u041f\u043e\u043b\u044c\u0449\u0456. \u041e\u0434\u043d\u0438\u043c \u0437 \u043d\u0430\u0439\u0432\u0430\u0436\u043b\u0438\u0432\u0456\u0448\u0438\u0445 \u0437\u0430\u0432\u0434\u0430\u043d\u044c, \u044f\u043a\u0456 \u0441\u0442\u043e\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u044c\u0441\u044c\u043a\u043e\u044e \u043e\u0441\u0432\u0456\u0442\u043e\u044e \u0454 \u0431\u043e\u0440\u043e\u0442\u044c\u0431\u0430 \u0437 \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u043c \u0432\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f\u043c. \u0412\u043c\u0456\u043d\u043d\u044f \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u043e\u043c \u0442\u0430 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u0432 \u0447\u0430\u0441\u0430\u0445 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0439\u043d\u043e\u0433\u043e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u0441\u0442\u0432\u0430 \u0454 \u0441\u0432\u043e\u0433\u043e \u0440\u043e\u0434\u0443 \u0431\u0443\u043a\u0432\u0430\u0440\u0435\u043c. \u0426\u0456, \u044f\u043a\u0456 \u0439\u043e\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442\u044c, \u043f\u0440\u0438\u0440\u0435\u0447\u0435\u043d\u0456 \u043d\u0430 \u0432\u0435\u0433\u0435\u0442\u0430\u0446\u0456\u044e \u043d\u0430 \u043e\u0431\u0440\u0456\u044f\u0445 \u0441\u0443\u0447\u0430\u0441\u043d\u043e\u0433\u043e \u0441\u0432\u0456\u0442\u0443.

    \r\n \r\n

    \u0421\u0430\u043c\u0435 \u0442\u043e\u043c\u0443 \u0432\u0436\u0435 7 \u0440\u043e\u043a\u0456\u0432 \u043f\u043e\u043c\u0430\u0433\u0430\u0454\u043c\u043e \u0434\u0456\u0442\u044f\u043c \u0440\u043e\u0437\u0443\u043c\u0456\u0442\u0438 \u0456 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u043f\u0440\u043e\u0441\u0443\u043d\u0443\u0442\u0456 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0456\u0457. \u0424\u043e\u043d\u0434 \u041c\u043e\u0434\u0435\u0440\u043d\u0430 \u041f\u043e\u043b\u044c\u0449\u0430 \u0445\u043e\u0447\u0435 \u0437\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0438\u0442\u0438 \u0442\u0438\u0441\u044f\u0447\u0456 \u0434\u0456\u0442\u0435\u0439 \u0442\u0438\u043c, \u0449\u043e \u043d\u0430\u0439\u0432\u0430\u0436\u043b\u0438\u0432\u0456\u0448\u0435: \u0437\u043d\u0430\u043d\u043d\u044f\u043c \u0442\u0430 \u043d\u0430\u0432\u0438\u0447\u043a\u0430\u043c\u0438, \u044f\u043a\u0456 \u0434\u043e\u043f\u043e\u043c\u0430\u0433\u0430\u044e\u0442\u044c \u0440\u043e\u0437\u0443\u043c\u0456\u0442\u0438 \u0441\u0443\u0447\u0430\u0441\u043d\u0438\u0439 \u0441\u0432\u0456\u0442 \u0442\u0430 \u043a\u043e\u0440\u0438\u0441\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043c\u043e\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u044f\u043c\u0438, \u044f\u043a\u0456 \u0432\u0456\u043d \u043f\u0440\u043e\u043f\u043e\u043d\u0443\u0454.

    \r\n \r\n

    \u0424\u043e\u043d\u0434 \u041c\u043e\u0434\u0435\u0440\u043d\u0430 \u041f\u043e\u043b\u044c\u0449\u0430 \u2013 \u043f\u043e\u0437\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c Wolne Lektury \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0443\u0454 \u0442\u0430\u043a\u043e\u0436 \u043f\u0440\u043e\u0435\u043a\u0442 Wolne Podr\u0119czniki (\u0412\u0456\u043b\u044c\u043d\u0456 \u043f\u0456\u0434\u0440\u0443\u0447\u043d\u0438\u043a\u0438), \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439 \u0433\u0440\u043e\u043c\u0430\u0434\u0441\u044c\u043a\u0438\u043c \u0440\u0443\u0445\u043e\u043c \u0432\u0447\u0438\u0442\u0435\u043b\u0456\u0432-\u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0456\u0432, \u044f\u043a\u0456 \u043f\u0440\u0438 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u0456 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u043f\u0438\u0448\u0443\u0442\u044c \u043d\u043e\u0432\u0456 \u043f\u0456\u0434\u0440\u0443\u0447\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0445 \u0443\u0447\u043d\u0456\u0432. Wolne Podr\u0119czniki \u043f\u0443\u0431\u043b\u0456\u043a\u0443\u044e\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0456\u043b\u044c\u043d\u0438\u0445 \u043b\u0456\u0446\u0435\u043d\u0437\u0456\u044f\u0445, \u0442\u043e\u0431\u0442\u043e \u0442\u0430\u043a\u0438\u0445, \u044f\u043a\u0456 \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442\u044c \u043a\u043e\u0436\u043d\u043e\u043c\u0443 \u0431\u0435\u0437\u043f\u043b\u0430\u0442\u043d\u043e \u043a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438, \u0440\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0443\u0432\u0430\u0442\u0438 \u0442\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0457\u0445, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u043e\u0441\u0442\u0456 \u043f\u0440\u043e\u0441\u0438\u0442\u0438 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 \u0432 \u0430\u0432\u0442\u043e\u0440\u0456\u0432. \u041a\u043e\u0436\u0435\u043d \u0432\u0447\u0438\u0442\u0435\u043b\u044c \u0437\u043c\u043e\u0436\u0435 \u0434\u043e\u043f\u043e\u0432\u043d\u044e\u0432\u0430\u0442\u0438, \u0440\u043e\u0437\u0432\u0438\u0432\u0430\u0442\u0438 \u0456 \u0432\u0438\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u0438 \u0446\u0456 \u043f\u0456\u0434\u0440\u0443\u0447\u043d\u0438\u043a\u0438 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u043e \u0434\u043e \u0441\u0432\u043e\u0457\u0445 \u043f\u043e\u0442\u0440\u0435\u0431 \u0442\u0430 \u0434\u043e\u0441\u0432\u0456\u0434\u0443. \u0417\u0430\u0432\u0434\u044f\u043a\u0438 \u0432\u0456\u043b\u044c\u043d\u0438\u043c \u043b\u0456\u0446\u0435\u043d\u0437\u0456\u044f\u043c \u043c\u043e\u0436\u043d\u0430 \u0437\u043d\u0430\u0447\u043d\u043e \u0437\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u0446\u0456\u043d\u0443 \u043f\u0456\u0434\u0440\u0443\u0447\u043d\u0438\u043a\u0456\u0432, \u044f\u043a\u0456 \u0432\u0438\u0434\u0430\u044e\u0442\u044c\u0441\u044f \u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0439\u043d\u043e\u043c\u0443 \u0432\u0438\u0433\u043b\u044f\u0434\u0456 \u043f\u0430\u043f\u0435\u0440\u043e\u0432\u0438\u0445, \u0434\u0440\u0443\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043a\u043d\u0438\u0436\u043e\u043a, \u0430 \u043f\u0456\u0434\u0440\u0443\u0447\u043d\u0438\u043a\u0438, \u044f\u043a\u0456 \u0440\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0443\u044e\u0442\u044c\u0441\u044f \u0432 \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u043c\u0443 \u0432\u0438\u0433\u043b\u044f\u0434\u0456, \u0431\u0443\u0434\u0443\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0456 \u0431\u0435\u0437\u043a\u043e\u0448\u0442\u043e\u0432\u043d\u043e.

    \r\n\r\n \r\n

    \u041f\u0440\u043e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u0435 \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f

    \r\n \r\n

    \u0412 \u0440\u0435\u0441\u0443\u0440\u0441\u0456 Wolne Lektury \u0437\u0433\u0456\u0434\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0432\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u043c\u043e \u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u0442\u0456\u043b\u044c\u043a\u0438 \u0446\u0456 \u043a\u043d\u0438\u0436\u043a\u0438, \u044f\u043a\u0456 \u0437\u043d\u0430\u0445\u043e\u0434\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u043c\u0443 \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u0456, \u0442\u043e\u0431\u0442\u043e \u0442\u0430\u043a\u0456, \u044f\u043a\u0456 \u0432\u0436\u0435 \u043d\u0435 \u043e\u0445\u043e\u0440\u043e\u043d\u044f\u044e\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c. \u0421\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u0435 \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f \u0446\u0435 \u0441\u0432\u043e\u0454\u0440\u0456\u0434\u043d\u0430 \u0441\u043a\u0430\u0440\u0431\u043d\u0438\u0446\u044f \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0438, \u0441\u043f\u0456\u043b\u044c\u043d\u0435 \u0434\u043e\u0431\u0440\u043e, \u044f\u043a\u0438\u043c \u043c\u043e\u0436\u0443\u0442\u044c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u0443\u0441\u0456 \u043d\u0430 \u0440\u0456\u0432\u043d\u0438\u0445 \u043f\u0440\u0430\u0432\u0430\u0445, \u0431\u0435\u0437 \u043e\u0431\u043c\u0435\u0436\u0435\u043d\u044c \u0442\u0430 \u043f\u043b\u0430\u0442\u0438. \u0406\u0441\u043d\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f \u0454 \u0433\u0430\u0440\u0430\u043d\u0442\u0456\u0454\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0442\u0432\u043e\u0440\u0456\u0432 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0438, \u044f\u043a\u0438\u0439 \u0454 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u043e\u043c\u0430\u0434\u044f\u043d\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0438\u0442\u0443\u0446\u0456\u044e.

    \r\n \r\n

    \u0425\u043e\u0447\u0430 \u044f\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u0441\u0456 \u0442\u0432\u043e\u0440\u0438 \u043a\u043e\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u043d\u0443\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u044e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f, \u0442\u043e \u0447\u0430\u0441 \u0434\u0456\u0457 \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u0432\u043f\u0440\u043e\u0434\u043e\u0432\u0436 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u0456\u0432 \u043b\u0456\u0442 \u0431\u0443\u0432 \u043d\u0430\u0431\u0430\u0433\u0430\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0435\u043d\u0438\u043c. \u0429\u0435 \u043d\u0430\u043f\u043e\u0447\u0430\u0442\u043a\u0443 90-\u0445 \u0440\u043e\u043a\u0456\u0432 \u0446\u0435 \u0431\u0443\u043b\u043e 25 \u0440\u043e\u043a\u0456\u0432 \u043f\u0456\u0441\u043b\u044f \u0441\u043c\u0435\u0440\u0442\u0456 \u0430\u0432\u0442\u043e\u0440\u0430, \u043f\u043e\u0442\u0456\u043c \u0446\u0435\u0439 \u0442\u0435\u0440\u043c\u0456\u043d \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0435\u043d\u043e \u0434\u043e 50 \u0440\u043e\u043a\u0456\u0432, \u0441\u044c\u043e\u0433\u043e\u0434\u043d\u0456 \u0446\u0435 \u0432\u0436\u0435 70 \u0440\u043e\u043a\u0456\u0432. \u0426\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0454 \u0449\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0456 \u043f\u043e\u0437\u0438\u0446\u0456\u0457 \u0437 \u043c\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0441\u044c\u043a\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u043d\u0435 \u0437\u043c\u043e\u0436\u0443\u0442\u044c \u0431\u0443\u0442\u0438 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438 \u0449\u0435 \u0432\u043f\u0440\u043e\u0434\u043e\u0432\u0436 \u0431\u0430\u0433\u0430\u0442\u044c\u043e\u0445 \u0440\u043e\u043a\u0456\u0432. \u0429\u043e\u0439\u043d\u043e \u0432 2020 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0454\u043c\u043e \u0442\u0432\u043e\u0440\u0438 \u041c\u0430\u0440\u043a\u0430 \u0425\u043b\u0430\u0441\u043a\u043e \u0442\u0430 \u0412\u0456\u0442\u043e\u043b\u044c\u0434\u0430 \u0413\u043e\u043c\u0431\u0440\u043e\u0432\u0456\u0447\u0430. \u0420\u043e\u043c\u0430\u043d\u0438 \u041a\u0443\u043d\u0446\u0435\u0432\u0456\u0447\u043e\u0432\u043e\u0457 \u0441\u0442\u0430\u043d\u0443\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u044e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f \u0432 2060 \u0440\u043e\u0446\u0456, \u0430 \u043f\u043e\u0435\u0437\u0456\u0457 \u041c\u0456\u043b\u043e\u0448\u0430 \u0432 2075 \u0440\u043e\u0446\u0456.

    \r\n \r\n

    \u041e\u0431\u043c\u0435\u0436\u0435\u043d\u043d\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u0448\u0438\u0440\u044e\u044e\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0456 \u0432\u0438\u0434\u0430\u043d\u043d\u044f \u0442\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0438. \u0414\u043e 1 \u0441\u0456\u0447\u043d\u044f 2012 \u0440\u043e\u043a\u0443 \u0431\u0443\u0434\u0435\u043c\u043e \u0447\u0435\u043a\u0430\u0442\u0438 \u043d\u0430 \u201c\u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0437\u0430\u043f\u043e\u0432\u0456\u0442\u201d \u0424\u0440\u0430\u043d\u0441\u0443\u0430 \u0412\u0456\u0439\u043e\u043d\u0430 \u0442\u0430 \u0456\u043d\u0448\u0456 \u0442\u0432\u043e\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0435\u043d\u0456 \u0412\u043e\u0454\u043c-\u0416\u0435\u043b\u0435\u043d\u0441\u044c\u043a\u0438\u043c, \u0430 \u0434\u043e 2068 \u0440\u043e\u043a\u0443 \u043d\u0430 \u201c\u0412\u0456\u043d\u043d\u0456-\u041f\u0443\u0445\u0430\u201d \u041c\u0456\u043b\u043d\u0430 \u0442\u0430 \u0456\u043d\u0448\u0456 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0438 \u0406\u0440\u0435\u043d\u0438 \u0422\u0443\u0432\u0456\u043c. \u041c\u0438 \u0442\u0430\u043a\u043e\u0436 \u043d\u0435 \u043c\u0430\u0454\u043c\u043e \u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u0434\u0430\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0437\u0430\u044f\u0432 \u0456 \u043f\u0440\u043e\u043c\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0445 \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438, \u044f\u043a\u0456 \u043f\u043e\u043c\u0435\u0440\u043b\u0438 \u043c\u0435\u043d\u0448\u0435 \u043d\u0456\u0436 70 \u0440\u043e\u043a\u0456\u0432 \u0442\u043e\u043c\u0443. \u0417 \u0446\u0456\u0454\u0457 \u043f\u0440\u0438\u0447\u0438\u043d\u0438 \u0431\u0443\u0432\u0430\u0454 \u0442\u0430\u043a, \u0449\u043e \u044f\u043a\u0438\u0439\u0441\u044c \u0442\u0432\u0456\u0440 \u0454 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u043c \u0443 Wolne Lektury, \u0430\u043b\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u0443 \u0434\u043b\u044f \u043d\u044c\u043e\u0433\u043e \u043f\u043e\u0437\u0438\u0446\u0456\u044e \u0432 \u0426\u0438\u0444\u0440\u043e\u0432\u0456\u0439 \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0456\u0439 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u0446\u0456 \u0432\u0456\u0434\u0441\u0438\u043b\u0430\u0454 \u043d\u0430 \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0443, \u044f\u043a\u0430 \u043f\u043e\u044f\u0441\u043d\u044e\u0454, \u0449\u043e \u0442\u0432\u0456\u0440 \u043e\u0445\u043e\u0440\u043e\u043d\u044f\u0454\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c. \u0426\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0454, \u0449\u043e \u0445\u043e\u0447\u0430 \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u0454 \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u044e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f, \u0456 \u043c\u0438 \u0440\u043e\u0437\u043c\u0456\u0449\u0430\u0454\u043c\u043e \u0439\u043e\u0433\u043e \u0443 \u043d\u0430\u0448\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0456, \u0442\u043e \u0439\u043e\u0433\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0435 \u0432\u0438\u0434\u0430\u043d\u043d\u044f, \u044f\u043a\u0435 \u0437\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0443 \u0426\u0438\u0444\u0440\u043e\u0432\u0456\u0439 \u0411\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u0446\u0456 \u041f\u043e\u043b\u043e\u043d\u0430 (\u0437 \u0432\u0441\u0442\u0443\u043f\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u043c\u043e\u0432\u043e\u044e \u0442\u0430 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u044f\u043c\u0438), \u0434\u0430\u043b\u0456 \u043e\u0445\u043e\u0440\u043e\u043d\u044f\u0454\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u043e\u043c.

    \r\n \r\n

    \u041f\u0440\u043e \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u0435 \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f \u0442\u0440\u0435\u0431\u0430 \u043f\u0456\u043a\u043b\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u0456 \u0439\u043e\u0433\u043e \u0431\u0435\u0440\u0435\u0433\u0442\u0438. \u041a\u0443\u043b\u044c\u0442\u0443\u0440\u0430 \u0446\u0435 \u043c\u0430\u0439\u0441\u0442\u0435\u0440\u043d\u043e \u043f\u043e\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f, \u0432 \u044f\u043a\u0456\u0439 \u0447\u0435\u0440\u0433\u043e\u0432\u0456 \u043f\u043e\u0432\u0435\u0440\u0445\u0438 \u043c\u043e\u0436\u0443\u0442\u044c \u0441\u043f\u0438\u0440\u0430\u0442\u0438\u0441\u044f \u0442\u0456\u043b\u044c\u043a\u0438 \u043d\u0430 \u0441\u043e\u043b\u0456\u0434\u043d\u0456\u0439 \u043f\u0456\u0434\u0441\u0442\u0430\u0432\u0456, \u044f\u043a\u0443 \u0441\u0442\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043a\u0438. \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u0431\u0435\u0437\u043f\u043e\u0441\u0435\u0440\u0435\u0434\u043d\u044c\u043e \u0447\u0435\u0440\u043f\u0430\u0432 \u0437 \u0430\u043d\u0442\u0438\u0447\u043d\u043e\u0457 \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0457. \u041c\u0456\u0446\u043a\u0435\u0432\u0438\u0447 \u0441\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u0432\u0441\u044f \u043d\u0430\u0440\u043e\u0434\u043d\u043e\u044e \u0442\u0432\u043e\u0440\u0447\u0456\u0441\u0442\u044e \u0434\u043b\u044f \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043d\u0430\u0439\u0433\u0430\u0440\u043d\u0456\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0445 \u043f\u043e\u0435\u043c. \u041a\u043e\u0436\u043d\u0435 \u043f\u043e\u043a\u043e\u043b\u0456\u043d\u043d\u044f \u043c\u043e\u0436\u0435 \u0441\u044f\u0433\u0430\u0442\u0438 \u0434\u0430\u043b\u0456 \u043f\u043e\u0433\u043b\u044f\u0434\u043e\u043c, \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u0434\u043e\u0441\u044f\u0433\u043d\u0435\u043d\u043d\u044f\u043c \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043a\u0456\u0432. \u0422\u043e\u043c\u0443 \u0442\u0430\u043a \u0441\u0443\u0442\u0442\u0454\u0432\u043e\u044e \u0454 \u0441\u0432\u043e\u0431\u043e\u0434\u0430 \u0432 \u043d\u0430\u0434\u0430\u0432\u0430\u043d\u043d\u0456 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0456 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u0456 \u0442\u0432\u043e\u0440\u0456\u0432 \u043f\u043e\u043b\u044c\u0441\u044c\u043a\u043e\u0457 \u0442\u0430 \u0441\u0432\u0456\u0442\u043e\u0432\u043e\u0457 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438. \u0411\u0435\u0437 \u0441\u0443\u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u0431\u0430\u043d\u043d\u044f, \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0442\u0430\u043a \u0447\u0443\u0434\u043e\u0432\u043e\u0457 \u0431\u0443\u0434\u0456\u0432\u043b\u0456 \u044f\u043a\u043e\u044e \u0454 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0430, \u0431\u0443\u043b\u043e \u0431 \u043d\u0435\u043c\u043e\u0436\u043b\u0438\u0432\u0438\u043c.

    ", + "title_en": "About Wolne Lektury project", + "left_column_pl": "

    Wolne Lektury

    \r\n \r\n

    Biblioteka internetowa z lekturami szkolnymi \u201eWolne Lektury\u201d (www.wolnelektury.pl) to projekt realizowany\r\n przez Fundacj\u0119 Nowoczesna Polska. Dzia\u0142a od 2007 roku i udost\u0119pnia w swoich zbiorach lektury szkolne, kt\u00f3re s\u0105\r\n zalecane do u\u017cytku przez Ministerstwo Edukacji Narodowej i kt\u00f3re trafi\u0142y ju\u017c do domeny publicznej. S\u0105 one\r\n opracowane, opatrzone komentarzem i udost\u0119pnione w kilku formatach (html, epub, mp3, ogg, odt, txt i pdf). Mo\u017cna je zgodnie z\r\n prawem, bezp\u0142atnie przegl\u0105da\u0107, \u015bci\u0105ga\u0107 na sw\u00f3j komputer, a tak\u017ce udost\u0119pnia\u0107 innym i cytowa\u0107.

    \r\n \r\n

    Zesp\u00f3\u0142 projektu Wolne Lektury sk\u0142ada si\u0119 z do\u015bwiadczonych redaktorek i nauczycielek, co zapewnia rzetelno\u015b\u0107\r\n naszego portalu. W tworzeniu go wsp\u00f3\u0142pracujemy z Bibliotek\u0105 Narodow\u0105, kt\u00f3ra dostarcza nam najlepszych dost\u0119pnych\r\n wyda\u0144 i opracowa\u0144 krytycznych lektur szkolnych, opublikowanych w Cyfrowej Bibliotece Narodowej Polona. Wsp\u00f3lnie\r\n staramy si\u0119, aby teksty lektur \u2013 nasze dziedzictwo kulturowe \u2013 by\u0142y dost\u0119pne dla wszystkich, niezale\u017cnie od\r\n miejsca zamieszkania, zasobno\u015bci portfela, sprawno\u015bci lub jej braku. Jest to mo\u017cliwe dzi\u0119ki istnieniu domeny\r\n publicznej, czyli zbioru dzie\u0142 nieobj\u0119tych restrykcjami prawa autorskiego, oraz dzi\u0119ki nowoczesnym technologiom\r\n \u2013 narz\u0119dziom, kt\u00f3re pozwalaj\u0105 zwielokrotni\u0107 dost\u0119pno\u015b\u0107 tre\u015bci upublicznianych w Internecie.

    \r\n \r\n

    Projekt Wolne Lektury jest ca\u0142kowicie niekomercyjny i realizowany pro publico bono. Dlatego tak wa\u017cne jest\r\n dla nas poparcie udzielone przez wybitne osobisto\u015bci kultury i nauki. Patronat honorowy nad projektem Wolne \r\n Lektury sprawuje Ministerstwo Kultury i Dziedzictwa Narodowego, Ministerstwo Edukacji Narodowej oraz\r\n Stowarzyszenie Pisarzy Polskich.. W Komitecie Honorowym Wolnych Lektur zgodzili si\u0119 uczestniczy\u0107 prof. Maria\r\n Janion, prof. Gra\u017cyna Borkowska, prof. Przemys\u0142aw\r\n Czapli\u0144ski, prof. Mieczys\u0142aw D\u0105browski, prof. Ewa Kraskowska, prof. Ma\u0142gorzata Czermi\u0144ska, prof. Jerzy Jarz\u0119bski\r\n i prof. Piotr \u015aliwi\u0144ski.

    \r\n\r\n \r\n

    Digitalizacj\u0105 i korekt\u0105 tekst\u00f3w zajmuje si\u0119 Biblioteka Narodowa. Serwis internetowy zosta\u0142 zaprojektowany\r\n przez 2ia. Autorem j\u0119zyka sk\u0142adu tekst\u00f3w Wolnych Lektur opartego na j\u0119zyku XML jest Dariusz Ga\u0142ecki. Obs\u0142ug\u0119\r\n prawn\u0105 Wolnych Lektur zapewnia Kancelaria Grynhoff,\r\n Wo\u017any, Mali\u0144ski. Hosting serwisu zapewnia\r\n firma EO Networks. W opracowaniu technicznym tekst\u00f3w pomaga wydawnictwo Korporacja Ha!Art. Logo Wolne Lektury\r\n jest dzie\u0142em agencji PZL. Projekt obj\u0119li patronatem medialnym: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j i TVP Kultura.

    \r\n \r\n

    Jak korzysta\u0107 z Wolnych Lektur?

    \r\n \r\n

    Najwa\u017cniejsz\u0105 innowacj\u0105 Wolnych Lektur, odr\u00f3\u017cniaj\u0105c\u0105 ten projekt od innych bibliotek internetowych, jest\r\n mo\u017cliwo\u015b\u0107 przeszukiwania tekst\u00f3w z zastosowaniem r\u00f3\u017cnych kryteri\u00f3w: tradycyjnych, takich jak tytu\u0142, autor,\r\n epoka, rodzaj, gatunek literacki, ale i niespotykanych nigdzie indziej, to jest odnosz\u0105cych si\u0119 do tre\u015bci wielu\r\n utwor\u00f3w naraz \u2013 motyw\u00f3w i temat\u00f3w literackich. Takie przeszukiwanie jest mo\u017cliwe dzi\u0119ki specjalnemu opracowaniu\r\n tekst\u00f3w lektur szkolnych, to znaczy opisaniu ich za pomoc\u0105 wymienionych kryteri\u00f3w. Tym w\u0142a\u015bnie Wolne Lektury\r\n r\u00f3\u017cni\u0105 si\u0119 od licznych stron z opracowaniami lektur szkolnych \u2013 dostarczaj\u0105 narz\u0119dzi do tw\u00f3rczej pracy z\r\n tekstem, a nie gotowych \u015bci\u0105g. Je\u015bli np. ucze\u0144 dostanie temat pracy domowej: \u201eMotyw dziecka w romantyzmie na\r\n podstawie wybranych utwor\u00f3w\u201c, to trzy klikni\u0119cia na naszej stronie sprawi\u0105, \u017ce na ekranie komputera pojawi mu\r\n si\u0119 komplet tekst\u00f3w do analizy. Dzi\u0119ki takim narz\u0119dziom czytanie lektur staje si\u0119 fascynuj\u0105c\u0105 podr\u00f3\u017c\u0105 po \u015bwiecie\r\n kultury.

    \r\n \r\n

    Kolejn\u0105 u\u017cyteczn\u0105 funkcjonalno\u015bci\u0105 Wolnych Lektur, przydatn\u0105 w pracy w szkole, jest mo\u017cliwo\u015b\u0107 uk\u0142adania\r\n ca\u0142ych zestaw\u00f3w tekst\u00f3w przerabianych na przyk\u0142ad w ci\u0105gu roku przez dan\u0105 klas\u0119. Takie p\u00f3\u0142ki z lekturami s\u0105\r\n tworzone przez nauczycielk\u0119/la, kt\u00f3ra/y mo\u017ce nast\u0119pnie wys\u0142a\u0107 swoim uczniom odno\u015bnik (link) do tego zbioru, a\r\n oni jednym klikni\u0119ciem \u015bci\u0105gn\u0105 ca\u0142y zestaw na sw\u00f3j komputer.

    \r\n \r\n

    Wszystkie teksty ksi\u0105\u017cek ze stron Wolne Lektury (w postaci plik\u00f3w html, pdf, epub, txt) dost\u0119pne s\u0105 poza restrykcjami prawa autorskiego i mo\u017cna je swobodnie wykorzystywa\u0107 bez \u017cadnych warunk\u00f3w.

    \r\n\r\n

    Je\u015bli teksty te s\u0105 opatrzone dodatkowymi materia\u0142ami (przypisy, motywy literackie etc.) kt\u00f3re podlegaj\u0105 prawu\r\n autorskiemu, to te dodatkowe materia\u0142y udost\u0119pnione s\u0105 na licencji Creative Commons Uznanie Autorstwa - Na Tych\r\n Samych Warunkach 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    \r\n", + "left_column_ru": "

    Wolne Lektury

    \r\n \r\n

    \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438 \u201eWolne Lektury\u201d (www.wolnelektury.pl) - \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0424\u043e\u043d\u0434\u043e\u043c \r\n \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041f\u043e\u043b\u044c\u0448\u0430. \u0424\u043e\u043d\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 2007 \u0433\u043e\u0434\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f, \r\n \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u0441\u0442\u0440 \u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u0418\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f,\r\n \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043d\u0438\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 (html, epub, mp3, ogg, odt, txt i pdf). \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0443, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e\r\n \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0438 \u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.

    \r\n \r\n

    \u041a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Wolne Lektury \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0443\u0447\u0442\u0435\u043b\u044c\u043d\u0438\u0446, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u043c\u0443 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0443\r\n \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u043b\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u043c \u0441 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0435\r\n \u0438\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0439, \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Polona. \u041c\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442\u044b \u0447\u0442\u0435\u043d\u0438\u0439 \u2013 \u043d\u0430\u0448\u0435 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u043e \u2013 \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435\u043c, \r\n \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430, \u0443\u043c\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435. \u042d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\r\n \u0434\u043e\u043c\u0435\u043d\u0430, \u0442.\u0435. \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u043d\u0435\u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u043e\u0432\u0435\u0439\u0448\u0438\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\r\n \u2013 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f.

    \r\n \r\n

    \u041f\u0440\u043e\u0435\u043a\u0442 Wolne Lektury \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f pro publico bono. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0438\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441\r\n \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u044b\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \u0438 \u043d\u0430\u0443\u043a\u0438. \u041f\u043e\u0447\u0435\u0442\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c Wolne \r\n Lektury \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \u0438 \u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0430, \u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435\r\n \u041e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439. \u0412 \u0441\u043e\u0441\u0442\u0430\u0432 \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u0438\u0442\u0435\u0442\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0438\u0441\u044c \u0432\u043e\u0439\u0442\u0438 prof. Maria\r\n Janion, prof. Gra\u017cyna Borkowska, prof. Przemys\u0142aw\r\n Czapli\u0144ski, prof. Mieczys\u0142aw D\u0105browski, prof. Ewa Kraskowska, prof. Ma\u0142gorzata Czermi\u0144ska, prof. Jerzy Jarz\u0119bski\r\n i prof. Piotr \u015aliwi\u0144ski.

    \r\n\r\n \r\n

    \u0414\u0438\u0433\u0438\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u041d\u0430\u0440\u043e\u0434\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f\r\n 2ia. \u0410\u0432\u0442\u043e\u0440\u043e\u043c \u044f\u0437\u044b\u043a\u0430 Wolne Lektuy, \u043e\u0441\u0432\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 XML, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Dariusz Ga\u0142ecki. \u042e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430\r\n Wolne Lektury \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u043e\u0440\u043e\u0439 Grynhoff,\r\n Wo\u017any, Mali\u0144ski. \u0425\u043e\u0441\u0442\u0438\u043d\u0433 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\r\n \u0444\u0438\u0440\u043c\u0430 EO Networks. \u0412 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e-\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u044f Ha!Art. \u041b\u043e\u0433\u043e\u0442\u0438\u043f Wolne Lektury\r\n \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0430\u0433\u0435\u043d\u0442\u0441\u0442\u0432\u043e\u043c PZL. \u041c\u0435\u0434\u0438\u0439\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j i TVP Kultura.

    \r\n \r\n

    \u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Wolne Lektury?

    \r\n \r\n

    \u0421\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0435\u0439 Wolne Lektury, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0435\u0439 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \r\n \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0441\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432: \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u0438\u0445, \u043a\u0430\u043a \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435, \u0430\u0432\u0442\u043e\u0440, \u044d\u043f\u043e\u0445\u0430, \u0444\u043e\u0440\u043c\u0430, \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0439 \u0436\u0430\u043d\u0440, \u043d\u043e \u0438 \u043d\u0435\u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c\u044b\u0445\r\n \u0432 \u043d\u0438\u043a\u0430\u043a\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0442.\u0435. \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e \u043c\u043d\u043e\u0433\u0438\u0445\r\n \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u2013 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u0442\u0435\u043c \u0438 \u043c\u043e\u0442\u0438\u0432\u043e\u0432. \u0422\u0430\u043a\u043e\u0439 \u043e\u0431\u044b\u0441\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\r\n \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0439, \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u043c Wolne Lektury\r\n \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0439 \u2013 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\r\n \u0442\u0435\u043a\u0441\u0442\u043e\u043c,- \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0440. \u0434\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0443\u0447\u0435\u043d\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a: \u201e\u041c\u043e\u0442\u0438\u0432 \u0440\u0435\u0431\u0435\u043d\u043a\u0430 \u0432 \u0440\u043e\u043c\u0430\u043d\u0442\u0438\u0437\u043c\u0435 \u043d\u0430\r\n \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439\u201c, \u0442\u043e \u0442\u0440\u0438 \u0449\u0435\u043b\u043a\u0430 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \r\n \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435\u043c\r\n \u043f\u043e \u043c\u0438\u0440\u0435 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b.

    \r\n \r\n

    \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e Wolne Lektury, \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0448\u043a\u043e\u043b\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\r\n \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432, \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u043c\u044b\u0445 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u0434\u0430 \u0432\u0441\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0422\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u043a\u0438 \u0441 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438\r\n \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u0435\u043b\u0435\u043c/\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0438\u0446\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439/-\u0430\u044f \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u043c \u0443\u0447\u0435\u043d\u0438\u043a\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440.\r\n \u041e\u043d\u0438 \u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0449\u0435\u043b\u043a\u0430 \u0441\u043a\u0430\u0447\u0430\u044e\u0442 \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u043d\u0430 \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440.

    \r\n \r\n

    \u0412\u0441\u0435 \u0442\u0435\u043a\u0441\u0442\u044b \u043a\u043d\u0438\u0433 \u0441 \u0441\u0430\u0439\u0442\u0430 Wolne Lektury (\u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 html, pdf, epub, txt) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0432\u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439.

    \r\n\r\n

    \u0415\u0441\u043b\u0438 \u044d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u044b \u0441\u043e\u043f\u0440\u043e\u0432\u0430\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043e\u0447\u043d\u044b\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438 (\u0441\u043d\u043e\u0441\u043a\u0438, \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0435 \u043c\u043e\u0442\u0438\u0432\u044b \u0438 \u0442.\u0434.), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u043e,\r\n \u0442\u043e \u044d\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043e\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 Creative Commons Uznanie Autorstwa - \u043f\u0440\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0438 \u0442\u0435\u0445 \u0436\u0435\r\n \u0443\u0441\u043b\u043e\u0432\u0438\u0439 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/).

    \r\n", + "right_column_lt": "

    Apie Fond\u0105

    \r\n\r\n \r\n

    \u0160iuolaikin\u0117s Lenkijos Fondas buvo \u012fkurtas nes vaik\u0173 lavinimas tai raktas \u012f Lenkijos ateit\u012f. Vienu i\u0161 svarbiausi\u0173 u\u017eduo\u010di\u0173 kurios i\u0161kilo prie\u0161 Lenkijos \u0161vietim\u0105 tai kova su skaitmeniniu i\u0161skyrimu. Geb\u0117jimas naudotis kompiuteriu ir internetu \u0161iuolaikiniame pasaulyje tai standartas. Tie kurie prie to neprisitaik\u0117 priteisti gyventi pasaulio pakra\u0161ty.

    \r\n \r\n

    Tod\u0117l jau septynerius metus pad\u0117dam vaikams suprasti ir panaudoti pa\u017eangias technologijas. \u0160iuolaikines Lenkijos Fondas nori perduoti t\u016bkstan\u010diams vaik\u0173 tai kas yra svarbiausia: \u017eines ir sugeb\u0117jimus, kurie pad\u0117s suprasti dabartin\u012f pasauly ir panaudoti galimybes kurias jis teikia.

    \r\n\r\n

    \u0160iuolaikin\u0117s Lenkijos Fondas apart Projekto Laisvoji Literat\u016bra \u2013 veda taip pat projekt\u0105 Laisvieji Vadov\u0117liai,\r\n sukurta savanori\u0173 - mokytoj\u0173 bendruomenin\u0117, kuri naudoja internet\u0105 ir ruo\u0161ia naujus vadov\u0117lius\r\n Lenkijos moksleiviams. Laisvieji Vadov\u0117liai pavie\u0161inti su laisva licencija \u2013 tai rai\u0161kia kad kiekvienas gali teis\u0117tai ir nemokamai juos atsisi\u0173sti ir naudotis, nereikalaujant autoriaus darnos. \r\n Kiekvienas mokytojas gali papildyti vadov\u0117ly, i\u0161pl\u0117sti ir pataisyti pagal savo nor\u0105 ir patyrim\u0105. D\u0117ka laisv\u0173j\u0173 licencij\u0173 galima numa\u017einti vadov\u0117li\u0173 kain\u0105 prilyginant su kaina vadov\u0117liu, kurie yra leid\u017eiami popierin\u0117s knygos formoje. Elektronin\u0117 j\u0173 versija yra platinama nemokamai.

    \r\n\r\n \r\n

    Apie internetin\u0119 svetain\u0119

    \r\n \r\n

    \r\nInterneto svetain\u0117je \u201eLaisvoji Literat\u016bra\u201c galima teis\u0117tai vie\u0161inti tik tas knygas, kurios priklauso m\u016bs\u0173 tinklapiui.\r\n Tai yra tos, kurioms autoriaus teis\u0117s negalioja. Internetin\u0117 svetain\u0117 tai kult\u016bros lobynas, bendra geryb\u0117, kuria visi lygiomis teis\u0117mis gali neribotai ir nemokamai naudotis.\r\nInternetin\u0117 svetain\u0117 tai garantas pri\u0117jimo prie kult\u016bros gerybi\u0173, k\u0105 mums u\u017etikrinta Konstitucijos \u012fstatymas.

    \r\n \r\n

    Principas yra toks kad po kiek laiko visi k\u016briniai atsirastu internetin\u0117s bibliot\u0117kos lentynose. Kada tai atsitiks priklauso nuo Lenkijos autori\u0173 teisi\u0173 galiojimo, kurios \u0161iuo metu yra prailgintos net kelesde\u0161imt met\u0173.\r\nPrad\u017eioje 90-t\u0173j\u0173 knyg\u0105 pavie\u0161inti galima buvo po 25 metu nuo autoriaus mirties met\u0173, veliau tas laikotarpis buvo prailgintas iki 50 met\u0173, dabar tai jau 70 met\u0173.\r\n Tai rai\u0161kia kad m\u016bs\u0173 tinklapyje nesurasite visos mokyklines literat\u016bros ir deja tai greitai nepasikeis. Pavyzd\u017eiui net 2020 metais galima bus publikuoti k\u016brinius: Marek H\u0142aska arba Witold Gombrowicz. Romana Kuncewiczowej publikuosime 2060, o Czes\u0142owo Mi\u0142oszo net 2075 metais.

    \r\n \r\n

    Autori\u0173 teisi\u0173 apribojimai apima tuo pa\u010d ir vertimus ir kritikos leidinius. Iki 2012 sausio 1-sijos laukiame kad pavie\u0161inti k\u016briny \u201eTestamentai\u201c Fransua Vilono ir kitus k\u016brinius ver\u010diamus Boy-\u017bele\u0144skio, o net iki 2068 metu \u201eMik\u0117 P\u016bkuotukas\u201c Milne'o ir kitus vertimus Irenos Tuwim. Neturime teises publikuoti \u012f\u017eang\u0173 ir pratarmi\u0173 para\u0161yt\u0173 autori\u0173, kurie mir\u0117 nema\u017eiau nei prie\u0161 70 met\u0173. Tod\u0117l kartais taikosi kad ka\u017ekoks k\u016brinys pasirodo Laisvojoje Literat\u016broje bet nuoroda kuri veda mus i Skaitmenin\u0117je Lenkijos Nacionalin\u0119 Bibliotek\u0105 \u201ePolona\u201c primena mums kad \u0161iam k\u016briniui galioja autoriaus teis\u0117s.\r\n Tai rai\u0161kia kad tekstas priklauso internetinei svetainei ir tod\u0117l yra Laisvojoje Literat\u016broje, bet tai tik tai kriti\u0161kas leidinys, kuris yra Skaitmenin\u0117s Lenkijos Nacionalin\u0117s Bibliotekos \u201ePolona\u201c nuosavybe (su \u012f\u017eanga, komentarais ir pana\u0161ai) su vis galiojan\u010dioms autoriu teisemis.

    \r\n \r\n

    Internetin\u0117 svetain\u0117 tai kult\u016bros dalis kuri\u0105 reik\u0119 r\u016bpintis ir kuri\u0105 reik\u0119 saugoti. Kult\u016bra tai statinys kuriame sekantys auk\u0161tai gali b\u016bti statyti tik ant solidus pagrindo, paruo\u0161to pirmtaki\u0173. Kochanowsky s\u0117m\u0117 i\u0161 antikin\u0117s tradicijos, Mickiev\u010dius ir s\u0117m\u0117 i\u0161 liaudies tradicij\u0173. Kiekviena karta ap\u017evelgia daugiau, gali i\u0161dirbti savo bendrin\u0117 kalb\u0105 ir tvirtai \u012fsira\u0161yti \u012f literat\u016bros istorij\u0105 d\u0117ka pirmtaki\u0173 pasiekim\u0173. \r\nTod\u0117l taip svarbu yra Laisv\u0117 ir prieinamumas naudotis svarbiausiais pasauliniais literat\u016briniais k\u016brinias. Be internetin\u0117s svetain\u0117s ne\u012fmanoma butu t\u0105 pasiekti.

    \r\n\r\n \r\n\r\n", + "title_es": "Sobre el proyecto Wolne Lektury", + "page_title_fr": "Sur le projet Lectures libres", + "page_title_uk": "\u041f\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0442 Wolne Lektury", + "page_title_de": "\u00dcber das Projekt \"Freie Lekt\u00fcren\"", + "slug": "about_us", + "page_title_lt": "Apie projekt\u00b9 Laisvoji Literatura", + "right_column_de": "\ufeff

    \u00dcber die Stiftung

    \r\n\r\n

    Die Stiftung Modernes Polen ist als Reaktion auf Bildungsfragen der Kinder entstanden. \r\n Eine der wichtigsten Aufgaben, die das polnische Bildungssystem zu bew\u00e4ltigen hat, \r\n ist der Kampf gegen den digitalen Ausschluss. Computer- und Internetkompetenz sind \r\n elementare F\u00e4higkeiten, die in einer Informationsgesellschaft eine Wissensgrundlage bilden. \r\n Diejenigen, die Probleme mit Computer- und Internetnutzung haben, sind zum Leben eines Outsiders verurteilt.

    \r\n \r\n \r\n \r\n

    Aus diesem Grunde helfen wir den Kindern seit 7 Jahren, die fortschrittlichen Technologien zu verstehen und zu nutzen. \r\n Die Stiftung Modernes Polen m\u00f6chte Tausenden von Kindern das geben, was f\u00fcr ihre Entwicklung die h\u00f6chste Priorit\u00e4t hat: \r\n Wissen und F\u00e4higkeiten, die zum besserem Weltverst\u00e4ndnis f\u00fchren.

    \r\n \r\n \r\n \r\n

    Die Stiftung koordiniert \u2013 vom Projekt Freie Lekt\u00fcren abgesehen \u2013 auch das Projekt Freie Schulb\u00fccher, \r\n das von Lehrer- und Volont\u00e4rgruppierungen unterst\u00fctzt wird. Unsere Kollegen arbeiten per Internet an neuen Schulb\u00fcchern, \r\n die an polnische Sch\u00fcller adressiert sind. Freie Schulb\u00fccher werden unter freien Lizenzen ver\u00f6ffentlicht, also solchen, \r\n die das kostenfreie Kopieren, Aktualisierungen und Verbreiten - ohne Erlaubnisanfrage der Autorengruppe - zulassen. \r\n Jeder Lehrer kann diese Schulb\u00fccher nach eigenem Ermessen vervollst\u00e4ndigen, verbreiten und korrigieren. \r\n Dabei k\u00f6nnen die Kosten von lizenzfreien Printmedien deutlich gesenkt werden. Zugleich werden die digitalen Schulb\u00fccher \r\n kostenlos zur Verf\u00fcgung gestellt.

    \r\n\r\n \r\n

    \u00dcber die Public Domain

    \r\n \r\n

    Auf der Plattform der Freien Lekt\u00fcren d\u00fcrfen jene B\u00fccher ver\u00f6ffentlicht werden, die der Public Domain angeh\u00f6ren. \r\n Gemeint sind hier B\u00fccher, die keinem Uhrheberrecht mehr unterliegen. Publik Domain wird als eine Art von Kulturschatzkammer \r\n angesehen, also ein Gemeingut, von dem alle mit gleichen Rechten, ohne jegliche Einschr\u00e4nkungen und v\u00f6llig kostenfrei profitieren k\u00f6nnen. \r\n Das Vorhandensein der Public Domain wird zum Garant des freien Zugangs zu Kultursch\u00e4tzen. Die Nutzung von gemeinfreien \r\n B\u00fcchern steht uns als B\u00fcrgerrecht zu und ist in der Verfassung verankert.

    \r\n \r\n \r\n

    Obwohl hier der Grundsatz gilt, dass nach bestimmter Zeit alle Werke in die Public Domain gestellt werden d\u00fcrfen, \r\n so wurde die Schutzfrist im polnischen Urheberrecht in den letzen Jahren wesentlich verl\u00e4ngert. Anfang der 90er Jahre \r\n waren es 25 Jahre nach dem Tod des Urhebers, sp\u00e4ter wurde die Schutzfrist auf 50 Jahr verl\u00e4ngert, heute sind es schon 70 Jahre. \r\n Dies hat zur Folge, dass viele Werke, die auf einer Ministerliste als Lekt\u00fcren verzeichnet sind, d\u00fcrfen \u00fcber \r\n viele Jahre nicht ver\u00f6ffentlicht werden. Erst im Jahr 2020 d\u00fcrfen wir Werke von Marek H\u0142asko und Witold Gombrowicz ver\u00f6ffentlichen. \r\n Die Werke von Kuncewiczow erscheinen in der Public Domain in 2060 und Poeme von Milosz in 2075.

    \r\n \r\n

    Unter den Schutz des Urheberrechts fallen kritische Ausgaben und \u00dcbersetzungen. Bis zum 1. Januar 2012 warten wir \r\n auf \"Wielki Testament\" von Villon sowie andere Schriften, die von Boy-\u017bele\u0144ski \u00fcbersetzt wurden, und bis 2068 auf \r\n \"Kubu\u015b Puchatek\" von Milen und andere \u00dcbersetzungen von Julian Tuwim. Gem\u00e4\u00df dem Urheberschutzgesetz d\u00fcrfen wir \r\n keine Einleitungen und Vorreden von Autoren ver\u00f6ffentlichen, nach deren Todesdatum keine 70 Jahre vergangen sind. \r\n Es kann also passieren, dass ein bestimmtes Schriftst\u00fcck auf dem Portal der Freien Lekt\u00fcren verf\u00fcgbar ist, jedoch der link, \r\n der auf die Quelldatei in digitaler Nationalbibliothek Polona verweist, f\u00fchr uns direkt zur Seite mit dem Kommentar: \r\n Das urheberrechtlich gesch\u00fctzte Werk. Das bedeutet, dass obwohl das Werk in der Public Domain steht und deswegen \r\n auf dem Portal Freie Lekt\u00fcren ver\u00f6ffentlicht ist, so ist dessen kritische Ausgabe, \u00fcber die DNB Polona verf\u00fcgt \r\n (einschlie\u00dflich Einleitungen, Vorreden und Redakteurkommentaren) urheberrechtlich gesch\u00fctzt.

    \r\n \r\n \r\n

    Um die Public Domain muss gesorgt werden. Kultur ist ein kunstvolles Bauwerk, dessen Stockwerke von seinen Vorg\u00e4nger \r\n auf einem soliden Fundament gebaut wurden. Kochanowski sch\u00f6pfte aus der Antiktradition. Die Volkskunst war die Inspiration \r\n f\u00fcr Mickiewicz sch\u00f6nste, polnische Gedichte. Jede kommende Generation kann noch weiterblicken, eigene literarische Sprache \r\n schaffen und sich dank den Leistungen der Vorg\u00e4nger dauerhaft in die Literaturgeschichte einschreiben. Der freie Zugang \r\n zu den wichtigsten Werken aus der polnisch- und fremdsprachigen Literatur ist deswegen so wichtig. Ohne Public Domain w\u00e4re \r\n die Errichtung solch eines Kunstgeb\u00e4udes wie Literatur gar nicht m\u00f6glich.

    \r\n \r\n \r\n ", + "page_title_pl": "O projekcie Wolne Lektury", + "left_column_es": "

    Wolne Lektury

    \r\n\r\n

    La biblioteca virtual con lecturas \u201cWolne Lektury\u201d (www.wolnelektury.pl) es un proyecto realizado por la Fundaci\u00f3n Polonia Moderna. La Fundaci\u00f3n hab\u00eda comenzado su actividad en el a\u00f1o 2007 y est\u00e1 compartiendo las lecturas recomendadas por el Ministerio de la Educaci\u00f3n Nacional y que ya forman parte del dominio p\u00fablico. Las lecturas, elaboradas y comentadas, est\u00e1n disponibles en diferentes formatos (html, epub, mp3, ogg, odt, txt i pdf). Se las puede legal y gratuitamente leer, descargar, citar y compartir con otros.

    \r\n\r\n \r\n\r\n

    El equipo del proyecto Wolne Lektury consta de redactores y profesores con experiencia, que garantiza la fiabilidad de nuestra p\u00e1gina. Estamos cooperando con la Biblioteca Nacional que nos proporciona las mejores ediciones de las lecturas cl\u00e1sicas, que fueron publicadas en la Electr\u00f3nica Biblioteca Nacional Polona. Juntos queremos que las lecturas \u2013 nuestro patrimonio cultural \u2013 est\u00e9n disponibles para todos, independientemente de su lugar de residencia, posesiones materiales, eficiencia o su falta. Esto es posible gracias a la existencia del dominio p\u00fablico, es decir, una colecci\u00f3n de obras no cubiertas por el derecho de autor, y tambi\u00e9n gracias a las nuevas tecnolog\u00edas \u2013 herramientas que permiten aumentar la disponibilidad del contenido publicado en internet.

    \r\n\r\n \r\n\r\n

    El proyecto Wolne Lektury es completamente no comercial y realizado pro publico bono. As\u00ed que el apoyo de los personajes excepcionales de la cultura y las ciencias es tan importante para nosotros. El Ministerio de la Cultura y Patrimonio Cultural y La Asociaci\u00f3n de Escritores Polacos tienen el patrocinio de honor sobre el proyecto Wolne Lektury. \r\n\r\n El Comit\u00e9 de Honor de Wolne Lektury re\u00fane a los profesores: Maria Janion, Gra\u017cyna Borkowska, Przemys\u0142aw Czapli\u0144ski, Mieczys\u0142aw D\u0105browski, Ewa Kraskowska, Ma\u0142gorzata Czermi\u0144ska, Jerzy Jarz\u0119bski y Piotr \u015aliwi\u0144ski.

    \r\n\r\n\r\n\r\n \r\n\r\n

    La Biblioteca Nacional de ocupa de la digitalizaci\u00f3n y correcci\u00f3n de los textos. La p\u00e1gina fue dise\u00f1ada\r\n\r\n por 2ia. Dariusz Ga\u0142ecki es el autor del lenguaje de marcos de Wolne Lektury basado en el lenguaje XML. La oficina Grynhoff, Wo\u017any, Mali\u0144ski presta el servcio legal. El hosting de la p\u00e1gina lo proporciona EO Networks. En la edici\u00f3n t\u00e9cnica de los textos ayuda la editorial Korporacja Ha!Art. El logotipo de Wolne Lektury fue dise\u00f1ado por la agencia de publicidad PZL. El patrocinio medial: Dziennik, Elle, Tok.fm, Biblioteka Analiz, Tygodnik Powszechny, Przekr\u00f3j y TVP Kultura.

    \r\n\r\n \r\n\r\n

    \u00bfC\u00f3mo usar Wolne Lektury?

    \r\n\r\n \r\n\r\n

    La innovaci\u00f3n m\u00e1s importante de Wolne Lektury, que distingue este proyecto de otras bibliotecas virtuales, es la posibilidad de buscar los textos usando varios criterios: tradicionales, como el t\u00edtulo, el autor,\r\n\r\n la \u00e9poca, el subg\u00e9nero; pero tambi\u00e9n los que no se puede encontrar en otras bibliotecas, es decir los que se pueden aplicar a varias\r\n\r\n obras \u2013 los motivos y temas literarios. Este tipo de b\u00fasqueda es posible gracias a la preparaci\u00f3n especial \r\n\r\n de las lecturas, su la descripci\u00f3n a trav\u00e9s de los criterios anteriormente mencionados. Es el rasgo caracter\u00edstico de Wolne Lektury que lo distingue de otras p\u00e1ginas en las que aparecen res\u00famenes de lecturas. Nuestro servicio proporciona instrumentos para trabajo creativo con el texto y no res\u00famenes hechos. Si el estudiante tiene que escribir un trabajo: \u201cEl motivo del ni\u00f1o en el romanticismo bas\u00e1ndose en obras elegidas\u201d, basta con s\u00f3lo tres clics en nuestra p\u00e1gina para ver una colecci\u00f3n de textos para analizar. Gracias a aquellos instrumentos la lectura se puede convertir en un viaje fascinante por el mundo de la cultura.

    \r\n\r\n \r\n\r\n

    Otra funci\u00f3n de Wolne Lektury, \u00fatil en el trabajo en la escuela, es la posibilidad de completar colecciones de textos que la clase leer\u00e1 durante el a\u00f1o. Aquellos estantes con lecturas pueden ser creados por el profesor y luego compartidos con sus estudiantes. Los estudiantes, con un solo clic, podr\u00e1n descargar todas las lecturas a sus ordenadores.

    \r\n\r\n \r\n\r\n

    Ninguno de los textos en Wolne Lektury (en formatos: html, pdf, epub, txt) est\u00e1 cubierto por el derecho de autor de all\u00ed que se les pueda usar libremente.

    \r\n\r\n\r\n\r\n

    Si un texto contiene materiales adicionales (notas a pie de p\u00e1gina, motivos literarios etc.) que est\u00e1n cubiertos por el derecho de autor, estos materiales est\u00e1n publicados bajo la licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 (http://creativecommons.org/licenses/by-sa/3.0/deed.es/).

    ", + "left_column_en": "

    Wolne Lektury

    \r\n \r\n

    Web library with the school obligatory readings \"Wolne Lektury\" (www.wolnelektury.pl) is a project carried out by Modern Poland Foundation. Wolne Lektury website works since 2007. It provides the visitors with the school readings recommended Ministerstwo Edukacji Narodowej which entered the public domain. The literary works are drawn up, annotated and available in several formats (html, epub, mp3, ogg, odt, txt and pdf). Under the Polish law, they can be read online, downloaded, cited and shared.

    \r\n

    Wolne Lektury project team comprises experienced editors and teachers so that our website content is solid and reliable. To create it, we cooperate with National Library which provides us with the best available editions of the books as well as the critical studies of the school readings, published in Digital National Library Polona. Together we try our best to make the texts of the books (our cultural legacy) available for everyone, regardless of where one is living, how much money does one have or whether one is handicapped or not. It is possible only due to the public domain concept, meaning a collection of literary works that are not copyrighted, as well as high technologies - tools that let us increase availability of the text published on the Internet.

    \r\n

    Wolne Lektury project is completely uncommercial and it is carried out pro publico bono. Therefore the support of the eminent personages conncted with culture and sciences is very important for us. Wolne Lektury project is held under the honorary patronage of Ministerstwo Kultury i Dziedzictwa Narodowego, Ministerstwo Edukacji Narodowej and Polish Writers Association. In the Honorary Comitee of Wolne Lektury agreed to sit Professor Maria\r\n Janion, Professor Gra\u017cyna Borkowska, Professor Przemys\u0142aw\r\n Czapli\u0144ski, Professor Mieczys\u0142aw D\u0105browski, Professor Ewa Kraskowska, Professor Ma\u0142gorzata Czermi\u0144ska, Professor Jerzy Jarz\u0119bski\r\n and Professor Piotr \u015aliwi\u0144ski.

    \r\n\r\n

    Digitalisation and proofreading is provided by the National Library. The website was designed by 2ia. The author of the programming language of the repository of Free Literature texts, based on the XML language is Dariusz Ga\u0142ecki. Grynhoff, Wo\u017any, Mali\u0144ski office provides us with the legal service. Web hosting is provided by EO Networks company. Publishing house Korporacja Ha!Art helps us in proofreading. The logo of Wolne Lektury is a creation of PZL agency. The project is held under media patronage of: Dziennik, Elle, Tok.fm, Biblioteka Analiz,\r\n Tygodnik Powszechny, Przekr\u00f3j and TVP Kultura.

    \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n

    How should I use Wolne Lektury?

    The most imporant innovation of Wolne Lektury that distinguishes this project from the others is the possibility of searching for the texts with the application of variety of criteria: traditional ones, such as the title, author, period, form and genre, as well as unusual ones, concerning many literary works at once, i.e. literary motifs and themes. This kind of serch is faesible due to special preparation of the books as they are now described with the parameters mentioned above. It is the element that differs Wolne Lektury from the other editions of school readings. Wolne Lektury webiste provides the reader with devices that come in handy in when creative thinking is needed whereas some editions of the readings are simply cribs. For instance, if a student is asked to prepare an essay on topic \"The child in Romantic literature\", when searching our website, he only must mouse-click three times to find a collection of necessary texts. Due to this kind of tools reading books changes into fascinatng journey into the world of culture.

    \r\n

    Another useful function of Wolne Lektury that comes in handy when at home or at school is the possibility of combining the texts that are discussed during the school year into a list. The lists are called bookshelves and they are created by a teacher. Next the teacher may send the adequate hyperlink to his pupils and they can download the complete set of readings with one mouse click.

    \r\n

    Every literary work available on Wolne Lektury website (in html, pdf, epub, txt formats) is not covered by copyright law and can be freely used with no legal consequences.

    \r\n\r\n

    If the texts are provided with some extra materials (annotations, motifs) which are copyrighted, then the extras are accesible under Creative Commons Attribution - Share Alike 3.0 PL licence(http://creativecommons.org/licenses/by-sa/3.0/).

    ", + "title_pl": "O projekcie Wolne Lektury", + "title_ru": "\u041e \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Wolne Lektury", + "page_title_ru": "\u041e \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Wolne Lektury" + } + }, + { + "pk": 2, + "model": "infopages.infopage", + "fields": { + "title_de": "\ufeffDu kannst uns helfen", + "page_title": "You can help us on WolneLektury.pl", + "left_column_uk": "

    \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e

    \r\n\r\n\r\n\r\n

    \u041c\u0438 \u043d\u0430\u043c\u0430\u0433\u0430\u0454\u043c\u043e\u0441\u044f \u044f\u043a\u043e\u043c\u043e\u0433\u0430 \u043a\u0440\u0430\u0449\u0435 \u043f\u0456\u0434\u0433\u043e\u0442\u0443\u0432\u0430\u0442\u0438 \u0442\u0432\u043e\u0440\u0438, \u044f\u043a\u0456 \u043f\u043e\u0441\u0442\u0443\u043f\u043e\u0432\u043e \u0434\u043e\u0434\u0430\u044e\u0442\u044c\u0441\u044f \u0434\u043e \u043d\u0430\u0448\u043e\u0457 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u0438. \u0426\u0435 \u043c\u043e\u0436\u043b\u0438\u0432\u043e \u0442\u0456\u043b\u044c\u043a\u0438 \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u043d\u0430\u0448\u0438\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c.

    \r\n\r\n\r\n\r\n \r\n\r\n

    \u0417\u0430\u043f\u0440\u043e\u0448\u0443\u0454\u043c\u043e \u0443\u0441\u0456\u0445, \u0445\u0442\u043e \u0445\u043e\u0447\u0435 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u0442\u0438 \u0443 \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u0448\u043a\u0456\u043b\u044c\u043d\u043e\u0457 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u0438 Wolne Lektury.

    \r\n\r\n \r\n\r\n

    \u0412\u0441\u0456\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c \u043c\u0438 \u043f\u0440\u043e\u043f\u043e\u043d\u0443\u0454\u043c\u043e \u0442\u0440\u0435\u043d\u0456\u043d\u0433\u0438 \u0456 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0438\u0439 \u0434\u043e\u0441\u0432\u0456\u0434 \u043e\u0431\u0440\u043e\u0431\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443: \u0437\u043c\u0456\u0441\u0442\u043e\u0432\u043d\u0435 \u0442\u0430 \u0442\u0435\u0445\u043d\u0456\u0447\u043d\u0435 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043d\u043d\u044f. \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0438 \u043c\u043e\u0436\u0443\u0442\u044c \u043e\u0437\u043d\u0430\u0439\u043e\u043c\u0438\u0442\u0438\u0441\u044f \u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0442\u0430 \u043c\u043e\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u043e\u0432\u2019\u044f\u0437\u0430\u043d\u0438\u043c\u0438 \u0437 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u044f\u043c\u0438.\r\n\r\n \u0421\u043f\u0456\u043b\u044c\u043d\u043e \u0437 \u043d\u0430\u043c\u0438 \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0438 \u043e\u0440\u0433\u0430\u043d\u0456\u0437\u0443\u044e\u0442\u044c \u0442\u0440\u0435\u043d\u0456\u043d\u0433\u0438 \u0442\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0456\u0457, \u0434\u043e\u043f\u043e\u043c\u0430\u0433\u0430\u044e\u0442\u044c \u0432 \u043f\u0456\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u0456 \u0442\u0435\u043a\u0441\u0442\u0456\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0445\u0430\u043d\u043d\u044f (\u0442\u0430\u043a \u0437\u0432\u0430\u043d\u0438\u0445 \u0430\u0443\u0434\u0456\u043e-\u043a\u043d\u0438\u0433). \u041c\u0438 \u043f\u0456\u0434\u043f\u0438\u0441\u0443\u0454\u043c\u043e \u0437 \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c\u0438 \u0443\u0433\u043e\u0434\u0438 \u0442\u0430 \u043d\u0430\u0434\u0430\u0454\u043c\u043e \u0457\u043c \u043f\u043e\u0441\u0432\u0456\u0434\u0447\u0435\u043d\u043d\u044f \u043f\u0440\u043e \u0446\u0435 \u043a\u043e\u043b\u0438 \u0456 \u044f\u043a\u0456 \u043f\u0440\u0430\u0446\u0456 \u0432\u0438\u043a\u043e\u043d\u0443\u0432\u0430\u0432 \u0434\u043b\u044f \u043d\u0430\u0448\u043e\u0433\u043e \u0444\u043e\u043d\u0434\u0443 \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440. \u0422\u0440\u0435\u043d\u0456\u043d\u0433\u0438, \u0434\u043e\u0441\u0432\u0456\u0434 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043d\u043d\u044f \u0442\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u0438, \u044f\u043a\u0456 \u0446\u0435 \u0437\u0430\u0441\u0432\u0456\u0434\u0447\u0443\u044e\u0442\u044c, \u043c\u043e\u0436\u0443\u0442\u044c \u0431\u0443\u0442\u0438 \u0446\u0456\u043d\u043d\u0438\u043c\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u043f\u0456\u0434\u0432\u0438\u0449\u0435\u043d\u043d\u044f \u043a\u0432\u0430\u043b\u0456\u0444\u0456\u043a\u0430\u0446\u0456\u0439 \u0456 \u043f\u0440\u043e\u0444\u0435\u0441\u0456\u0439\u043d\u0456\u0439 \u043a\u0430\u0440'\u0454\u0440\u0456.

    \r\n\r\n\r\n\r\n \r\n\r\n

    \u0429\u043e \u043c\u043e\u0436\u043d\u0430 \u0440\u043e\u0431\u0438\u0442\u0438?

    \r\n\r\n \r\n\r\n

    \u041d\u0430\u0439\u0431\u0456\u043b\u044c\u0448\u0435 \u0440\u043e\u0431\u043e\u0442\u0438 \u043f\u0440\u0438\u0441\u0432\u044f\u0447\u0443\u0454\u0442\u044c\u0441\u044f \u043f\u0456\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044e \u0442\u0435\u043a\u0441\u0442\u0443 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u0457. \u0412 \u0442\u0435\u043a\u0441\u0442\u0456, \u044f\u043a\u0438\u0439 \u043c\u0438 \u043e\u0442\u0440\u0438\u043c\u0443\u0454\u043c\u043e \u0432\u0456\u0434 \u041d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0457 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u043a\u0438 \u0442\u0440\u0435\u0431\u0430 \u0432\u0438\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0456\u0447\u043d\u0456 \u0442\u0430 \u0456\u043d\u0448\u0456 \u043c\u0435\u0445\u0430\u043d\u0456\u0447\u043d\u0456 \u043f\u043e\u043c\u0438\u043b\u043a\u0438, \u0430 \u043f\u043e\u0442\u0456\u043c \u0434\u043e\u0434\u0430\u0442\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0456 \u043f\u0440\u0438\u043c\u0456\u0442\u043a\u0438, \u043f\u0430\u043c\u2019\u044f\u0442\u0430\u044e\u0447\u0438 \u043f\u0440\u043e \u0446\u0435, \u0449\u043e \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u043f\u043e\u0437\u0438\u0446\u0456\u044f \u0441\u043a\u0435\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u0435\u0440\u0448 \u0437\u0430 \u0432\u0441\u0435 \u0434\u043e \u0443\u0447\u043d\u0456\u0432, \u0434\u043b\u044f \u044f\u043a\u0438\u0445 \u0431\u0430\u0433\u0430\u0442\u043e \u0441\u043b\u0456\u0432 \u0442\u0430 \u0444\u0440\u0430\u0437 \u0437\u0432\u0443\u0447\u0430\u0442\u0438\u043c\u0435 \u0430\u043d\u0430\u0445\u0440\u043e\u043d\u0456\u0447\u043d\u043e. \u0414\u0430\u0432\u043d\u0456\u0448\u0456 \u043f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u0457 (\u0432\u0441\u0435 \u0437\u0430\u043b\u0435\u0436\u0438\u0442\u044c \u0442\u0443\u0442 \u0432\u0456\u0434 \u0430\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430) \u043f\u0456\u0434\u0434\u0430\u044e\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u043e\u043c\u0443 \u043c\u043e\u0432\u043d\u043e\u043c\u0443 \u043e\u0441\u0443\u0447\u0430\u0441\u043d\u0435\u043d\u043d\u044e, \u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434 \u0449\u043e\u0434\u043e \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0443 \u0447\u0438 \u0444\u043b\u0435\u043a\u0441\u0456\u0457, \u043f\u0440\u0438 \u0447\u043e\u043c\u0443 \u043c\u0438 \u0434\u0431\u0430\u0454\u043c\u043e \u043f\u0440\u043e \u0446\u0435 \u0449\u043e\u0431 \u043d\u0435 \u043f\u043e\u0440\u0443\u0448\u0443\u0432\u0430\u0442\u0438 \u0430\u0440\u0442\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0443 \u0442\u0435\u043a\u0441\u0442\u0443. \u041e\u0441\u0442\u0430\u043d\u043d\u0456\u043c \u0435\u0442\u0430\u043f\u043e\u043c \u0454 \u043f\u043e\u0448\u0443\u043a \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u043c\u043e\u0442\u0438\u0432\u0456\u0432 \u0442\u0430 \u0442\u0435\u043c, \u044f\u043a\u0456 \u043c\u0430\u044e\u0442\u044c \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u0442\u0438 \u0432 \u0433\u043b\u0438\u0431\u0438\u043d\u043d\u043e\u043c\u0443 \u043f\u0456\u0437\u043d\u0430\u043d\u043d\u0456 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0438. \u0412 \u0443\u0441\u0456\u0445 \u0446\u0438\u0445 \u043f\u0440\u0430\u0446\u044f\u0445 \u043d\u0430\u0441 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u044e\u0442\u044c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0438 - \u0432\u0447\u0438\u0442\u0435\u043b\u0456 \u0442\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0438 - \u044f\u043a\u0456 \u0447\u0430\u0441\u0442\u043e \u0434\u043e\u043f\u043e\u043c\u0430\u0433\u0430\u044e\u0442\u044c \u0442\u0430\u043a\u043e\u0436 \u043f\u043e\u0440\u0430\u0434\u043e\u044e \u0442\u0430 \u0437\u0430\u0443\u0432\u0430\u0436\u0435\u043d\u043d\u044f\u043c\u0438 \u043f\u0440\u0438 \u043f\u0440\u0438\u0439\u043d\u044f\u0442\u0442\u0456 \u0432\u0430\u0436\u043b\u0438\u0432\u0438\u0445 \u0440\u0456\u0448\u0435\u043d\u044c.

    \r\n\r\n \r\n\r\n

    \u042f\u043a \u0434\u043e \u043d\u0430\u0441 \u0437\u0433\u043e\u043b\u043e\u0441\u0438\u0442\u0438\u0441\u044f?

    \r\n\r\n \r\n\r\n

    \u0423\u0441\u0456\u0445 \u0437\u0430\u0446\u0456\u043a\u0430\u0432\u043b\u0435\u043d\u0438\u0445 \u043f\u0440\u043e\u0441\u0438\u043c\u043e \u0432\u0438\u0441\u043b\u0430\u0442\u0438 \u043b\u0438\u0441\u0442\u0430 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0443 fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n\r\n\r\n

    \u0417\u0430\u043f\u0440\u043e\u0448\u0443\u0454\u043c\u043e \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0456\u0457 Wolne Lektury, \u0434\u0435 \u043c\u043e\u0436\u043d\u0430 \u0437\u043d\u0430\u0439\u0442\u0438 \u0443\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u0443 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044e \u043f\u0440\u043e \u0446\u0435, \u044f\u043a \u0437\u0430\u043b\u0443\u0447\u0438\u0442\u0438\u0441\u044c \u0443 \u0440\u0435\u0434\u0430\u043a\u0446\u0456\u0439\u043d\u0443 \u0440\u043e\u0431\u043e\u0442\u0443.

    ", + "right_column_pl": "

    Najbardziej zas\u0142u\u017ceni wolontariusze

    \r\n\r\n\t

    Agatapaszkowska (wsp\u00f3\u0142pracuje z nami od 15 marca 2008)

    \r\n\r\n

    m.in. opracowywa\u0142a \u201eW pustyni i w puszczy\u201d Sienkiewicza ; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\t

    AgnieszkaKappa (wsp\u00f3\u0142pracuje z nami od 16 marca 2008)

    \r\n\r\n

    m.in. bra\u0142a udzia\u0142 w tworzeniu listy i opisie u\u017cycia motyw\u00f3w i temat\u00f3w literackich; opracowywa\u0142a teksty Sienkiewicza (Latarnik, Janko Muzykant, Quo vadis); zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n

    Anerys (wsp\u00f3\u0142pracuje z nami od 5 lipca 2007)

    \r\n\r\n

    m.in. bra\u0142a udzia\u0142 w tworzeniu listy motyw\u00f3w i temat\u00f3w literackich, dyskusji o gatunkach literackich, opracowywa\u0142a Bogurodzic\u0119, \u201eFraszki\u201d i \u201eTreny\u201d Kochanowskiego; wiersze S\u0142owackiego (Gr\u00f3b Agamemnona), \u201e\u015awi\u0119toszka\u201d Moliere'a, czy poezje Kasprowicza (w tym hymn \u201eDies Irae\u201d); zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\t

    EmiliaZdankiewicz (wsp\u00f3\u0142pracuje z nami od 17 marca 2008)

    \r\n\r\n

    m.in. motywy literackie dyskusja i opisywanie, S\u0142owacki, Kordian; Konopnicka, Nasza szkapa; Mickiewicz, Dziady cz. III; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\t

    Ewa_Serafin (wsp\u00f3\u0142pracuje z nami od 15 marca 2008)

    \r\n\r\n

    m.in. bra\u0142a udzia\u0142 w tworzeniu listy i opisie u\u017cycia motyw\u00f3w i temat\u00f3w literackich, opracowywa\u0142a poezje Kasprowicza (\u201eZ wichr\u00f3w i hal\u201d, \u201eNad przepa\u015bciami\u201d, \u201eW ciemno\u015bci schodzi moja dusza\u201d oraz \u201eNad Niemnem\u201d Orzeszkowej; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \t

    Hanna_Golab (wsp\u00f3\u0142pracuje z nami od 15 marca 2008)

    \r\n\r\n

    opracowywa\u0142a \u201eKr\u00f3la Edypa\u201d Sofoklesa oraz \u201eDusio\u0142ka\u201d Le\u015bmiana; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\t

    Ingene (wsp\u00f3\u0142pracuje z nami od 16 lipca 2008)

    \r\n\r\n

    m.in. opracowywa\u0142a \u201eSi\u0142aczk\u0119\u201d \u017beromskiego, \u201eQuo vadis\u201d Sienkiewicza oraz \u201eTreny\u201d Kochanowskiego; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\t

    Jmyszkowska (wsp\u00f3\u0142pracuje z nami od 26 marca 2008)

    \r\n\r\n

    m. in. opracowywa\u0142a \u201eGiaura\u201d Byrona oraz \u201eQuo vadis\u201d Sienkiewicza; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n

    Marysiabailey (wsp\u00f3\u0142pracuje z nami od 1 pa\u017adziernika 2007)

    \r\n\r\n

    m.in. bra\u0142a udzia\u0142 w tworzeniu listy motyw\u00f3w i temat\u00f3w literackich oraz opisywaniu ich u\u017cycia; opracowywa\u0142a \u201eCh\u0142op\u00f3w\u201d Reymonta, \u201eLalk\u0119\u201d Prusa, \u201eNie-Bosk\u0105 komedi\u0119\u201d Krasi\u0144skiego, \u201eBajki\u201d i \u201eSatyry\u201d Krasickiego, \u201eAntygon\u0119\u201d Sofoklesa oraz utwory Kochanowskiego, Morsztyna, Mickiewicza, Kasprowicza, Goethego, Oppmana, Kasprowicza; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; ponadto przygotowywa\u0142a i prowadzi\u0142a szkolenie dla wolontariuszy 15 marca 2008; zajmowa\u0142a si\u0119 proofreadingiem, a obecnie kieruje pracami nad audiobookami.

    \r\n\r\n\r\n

    Olga_Wojtczak (wsp\u00f3\u0142pracuje z nami od 21 pa\u017adziernika 2008)

    \r\n\r\n

    m.in. opracowywa\u0142a powie\u015bci Sienkiewicza (Trylogia), Reymonta, \u017beromskiego, dramaty Shakespeare'a; zob. te\u017c na naszej stronie \u201ewk\u0142ad u\u017cytkownika\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n

    Renataml (wsp\u00f3\u0142pracuje z nami od 30 czerwca 2007)

    \r\n\r\n

    bra\u0142a udzia\u0142 w dyskusji na temat listy motyw\u00f3w, wspomaga\u0142a nas radami jako do\u015bwiadczona nauczycielka, edytowa\u0142a \u201eLalk\u0119\u201d Prusa, \u201eBalladyn\u0119\u201d S\u0142owackiego, \u201eSi\u0142aczk\u0119\u201d \u017beromskiego.\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    \r\n", + "page_title_en": "You can help us on WolneLektury.pl", + "page_title_es": "\ufeffPuedes ayudarnos en WolneLektury.pl", + "left_column_lt": "

    Savanori\u0161ka veikla

    \r\n\r\n

    D\u0117ka savanori\u0173 k\u016brini\u0173 apra\u0161ymai, kurie yra \u012fjungiami \u012f m\u016bs\u0173 bibliotek\u0105 yra kiekvien\u0105 kart\u0105 kruop\u0161\u010diai paruo\u0161iami.

    \r\n \r\n \r\n

    Kvie\u010diame visus, kurie nori kartu su mumis kurti mokykline internetine bibliotek\u0105 Laisvoji Literat\u016bra.

    \r\n \r\n

    Visiem savanoriams teikiame apmokym\u0105 ir praktik\u0105 suri\u0161ta su teksto editavimu: techninis ir esminis teksto redagavimas. \r\n Savanoriai gali susipa\u017einti su problemom suri\u0161tomis su teksto platinimu internete, bet ir su galimybe juos i\u0161ri\u0161ti.\r\n Savanoriai padeda mums organizuoti apmokymus ir konferencijas, taip pat padeda paruo\u0161ti knyg\u0173 garso \u012fra\u0161us (taip vadinamos: audio knygos). \r\n Kiekvienam savanoriui kuris nori parvirtimo bei paliudijimo, kad dirbo (ir k\u0105 veik\u0117) m\u016bs\u0173 fonde, suteikiame tokia galimyb\u0119.\r\n Apmokymai, praktika ir paliudijimas gali prisid\u0117ti prie darbo kvalifikacij\u0173 pak\u0117limo.

    \r\n\r\n

    K\u0105 dar galima padaryti?

    \r\n \r\n

    Daug darbo yra ruo\u0161iant mokyklin\u0119 literat\u016br\u0105 leidimui. Perdirbti reikia tekst\u0105, kuri gauname i\u0161 Lenkijos Nacionalines\r\n Bibliotekos reikia pa\u0161alinti korekt\u016bros ir kitas klaidas, o veliau sukurti i\u0161na\u0161as, vis\u0105 laik\u0105 reikia tur\u0117ti omeny kad \r\n m\u016bs\u0173 svetain\u0119 aplanko da\u017eniausiai jaunimas ir visu pirma jiems tekstas turi b\u016bti \u012fdomus. \r\n Ankstesnieji knyg\u0173 ledinei turi pereiti kalbos modernizacij\u0105 (tai diktuoja autori\u0173 teis\u0117s) pvz.: ra\u0161ybos ar kaitybos kartu \r\n raikia stengtis kad nepa\u017eeisti menini\u0173 teksto savybi\u0173. Paskutinis etapas tai ie\u0161kojimas literat\u016brini\u0173 motyv\u0173 ir tem\u0173\r\n kurie per\u017eiures kuriny perd\u0117m. Visuose \u0161iouse darbuose rame mus savanoriai - mokytojai ir studentai - da\u017enai pataria atkreipia d\u0117mesy, padeda nuspr\u0119sti.

    \r\n \r\n

    Kaip prie m\u016bs prisijungti?

    \r\n \r\n

    Susidomejusius kvie\u010diame ra\u0161yti: e-pa\u0161tas fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Kvie\u010diame tai pat aplankyti redakcijos Laisvoji Literatura tinklap\u012f, \r\n kur galim surasti visas raikalingas \u017einias apie tai kaip prisijungi i redakciny darb\u0105.

    ", + "title_fr": "Vous pouvez nous aider", + "right_column_ru": "

    \u0421\u0430\u043c\u044b\u0435 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b

    \r\n\r\n\t

    Agatapaszkowska (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 15 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u201e\u0412 \u043f\u0443\u0441\u0442\u044b\u043d\u0435 \u0438 \u043f\u0443\u0449\u0435\u201d \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 ; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t

    AgnieszkaKappa (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 16 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c; \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 (\"\u041c\u0430\u044f\u0447\u043d\u0438\u043a\", \"\u042f\u043d\u043a\u043e-\u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\", \"\u041a\u0430\u043c\u043e \u0433\u0440\u044f\u0434\u0435\u0448\u0438\"); \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n

    Anerys (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 5 \u0438\u044e\u043b\u044f 2007)

    \r\n\r\n

    \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c, \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u0436\u0430\u043d\u0440\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0411\u043e\u0433\u043e\u0440\u043e\u0434\u0438\u0446\u0443, \u201e\u042d\u043f\u0438\u0433\u0440\u0430\u043c\u043c\u044b\u201d \u0438 \u201e\u0422\u0440\u0435\u043d\u044b\u201d \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e; \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u0421\u043b\u043e\u0432\u0430\u0446\u043a\u043e\u0433\u043e (Gr\u00f3b Agamemnona), \u201e\u041e\u0431\u043c\u0430\u043d\u0449\u0438\u043a\u0430\u201d \u041c\u043e\u043b\u044c\u0435\u0440\u0430, \u043f\u043e\u044d\u0437\u0438\u044e \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0438\u0447\u0430 (\u0432 \u0442.\u0447. \u0433\u0438\u043c\u043d \u201eDies Irae\u201d) \u0438 \u0434\u0440.; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\t

    EmiliaZdankiewicz (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 17 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0435 \u043c\u043e\u0442\u0438\u0432\u044b: \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u044f \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439 \"\u041a\u043e\u0440\u0434\u0438\u0430\u043d\"; \u041a\u043e\u043d\u043e\u043f\u043d\u0438\u0446\u043a\u0430\u044f \"Nasza szkapa\"; \u041c\u0438\u0446\u0435\u043a\u0432\u0438\u0447 \"\u0414\u0437\u044f\u0434\u044b \u0447. III\" \u0438 \u0434\u0440.; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\t

    Ewa_Serafin (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 15 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u043f\u043e\u044d\u0437\u0438\u044e \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0438\u0447\u0430 (\u201eZ wichr\u00f3w i hal\u201d, \u201eNad przepa\u015bciami\u201d, \u201eW ciemno\u015bci schodzi moja dusza\u201d), \u0430 \u0442\u0430\u043a\u0436\u0435 \u201eNad Niemnem\u201d \u041e\u0436\u0435\u0448\u043a\u043e; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \t

    Hanna_Golab (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 15 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u201e\u0426\u0430\u0440\u044f \u042d\u0434\u0438\u043f\u0430\u201d \u0421\u043e\u0444\u043e\u043a\u043b\u0430, \u0432 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u201eDusio\u0142ek\u201d \u041b\u0435\u0441\u044c\u043c\u044f\u043d\u0430; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\t

    Ingene (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 16 \u0438\u044e\u043b\u044f 2008)

    \r\n\r\n

    \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u201eSi\u0142aczka\u201d \u0416\u0435\u0440\u043e\u043c\u0441\u043a\u043e\u0433\u043e, \u201e\u041a\u0430\u043c\u043e \u0433\u0440\u044f\u0434\u0435\u0448\u0438\u201d \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430, \u201e\u0422\u0440\u0435\u043d\u044b\u201d \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u0438 \u0434\u0440.; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\t

    Jmyszkowska (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 26 \u043c\u0430\u0440\u0442\u0430 2008)

    \r\n\r\n

    \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u201e\u0413\u044f\u0443\u0440\u0430\u201d \u0411\u0430\u0439\u0440\u043e\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u201e\u041a\u0430\u043c\u043e \u0433\u0440\u044f\u0434\u0435\u0448\u0438\u201d \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n

    Marysiabailey (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 1 \u043e\u043a\u0442\u0430\u0431\u0440\u044f 2007)

    \r\n\r\n

    \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u0445 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f; \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0430 \u201e\u041c\u0443\u0436\u0438\u043a\u043e\u0432\u201d \u0420\u0435\u0439\u043c\u043e\u043d\u0442\u0430, \u201e\u041a\u0443\u043a\u043b\u0443\u201d \u041f\u0440\u0443\u0441\u0430, \u201e\u041d\u0435\u0431\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0435\u0434\u0438\u044e\u201d \u041a\u0440\u0430\u0441\u0438\u043d\u044c\u0441\u043a\u043e\u0433\u043e, \u201eBajki\u201d \u0438 \u201eSatyry\u201d \u041a\u0440\u0430\u0441\u0438\u0446\u043a\u043e\u0433\u043e, \u201e\u0410\u043d\u0442\u0438\u0433\u043e\u043d\u0443\u201d \u0421\u043e\u0444\u043e\u043a\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e, \u041c\u043e\u0440\u0448\u0442\u0438\u043d\u0430, \u041c\u0438\u0446\u043a\u0435\u0432\u0438\u0447\u0430, \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0438\u0447\u0430, \u0413\u0435\u0442\u0435, \u041e\u043f\u043f\u043c\u0430\u043d\u0430; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0430 \u0438 \u0432\u0435\u043b\u0430 \u0443\u0447\u0435\u0431\u0443 \u0434\u043b\u044f \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u043e\u0432 15 \u043c\u0430\u0440\u0442\u0430 2008; \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0443\u0440\u043e\u0439, \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043d\u0430\u0434 \u0430\u0443\u0434\u0438\u043e\u043a\u043d\u0438\u0433\u0430\u043c\u0438.

    \r\n\r\n\r\n

    Olga_Wojtczak (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 21 \u043e\u043a\u0442\u0430\u0431\u0440\u044f 2008)

    \r\n\r\n

    \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0430 \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u043e\u043c\u0430\u043d\u044b \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 (\"\u0422\u0440\u0438\u043b\u043e\u0433\u0438\u044f\"), \u0420\u0435\u0439\u043c\u043e\u043d\u0442\u0430, \u0416\u0435\u0440\u043e\u043c\u0441\u043a\u043e\u0433\u043e, \u0434\u0440\u0430\u043c\u044b \u0428\u0435\u043a\u0441\u043f\u0438\u0440\u0430; \u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0430\u0439\u0442\u0435 \u201e\u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n

    Renataml (\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0435\u0442 \u0441 \u043d\u0430\u043c\u0438 \u0441 30 \u0438\u044e\u043d\u044f 2007)

    \r\n\r\n

    \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u0438 \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0442\u0438\u0432\u043e\u0432; \u043a\u0430\u043a \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0443\u0447\u0438\u0442\u0435\u043b\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0430 \u043d\u0430\u0441 \u0441\u043e\u0432\u0435\u0442\u0430\u043c\u0438, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u201e\u041a\u0443\u043a\u043b\u0443\u201d \u041f\u0440\u0443\u0441\u0430, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u201eBalladyn\u0430\u201d \u0421\u043b\u043e\u0432\u0430\u0446\u043a\u043e\u0433\u043e, \u201eSi\u0142aczk\u0119\u201d \u0416\u0435\u0440\u043e\u043c\u0441\u043a\u043e\u0433\u043e.\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    ", + "left_column_fr": "

    B\u00e9n\u00e9volat

    \r\n\r\n

    Nous essayons de r\u00e9diger les oeuvres ajout\u00e9es successivement \u00e0 notre biblioth\u00e8que le mieux possible. Ce n'est possible que gr\u00e2ce \u00e0 nos b\u00e9n\u00e9voles.

    \r\n\r\n \r\n

    Nous invitons tous ceux qui veulent contribuer \u00e0 la cr\u00e9ation de la biblioth\u00e8que en ligne Lectures libres \u00e0 coop\u00e9rer avec nous.

    \r\n \r\n

    Tous les b\u00e9n\u00e9voles peuvent profiter de l'apprentissage et gagner de la pratique en \u00e9dition du texte: r\u00e9daction technique et du contenu. Les b\u00e9n\u00e9voles ont la possibilit\u00e9 de d\u00e9couvrir les probl\u00e8mes, mais aussi les possibilit\u00e9s li\u00e9es avec les publications en ligne. Ils co-organisent des entra\u00eenements et des conf\u00e9rences, aident \u00e0 pr\u00e9parer des versions des textes \u00e0 \u00e9couter (livres audio). Les b\u00e9n\u00e9voles obtiennent un contrat et un certificat pr\u00e9cisant quand et en quelle qualit\u00e9 ils ont aid\u00e9 notre fondation. Des entra\u00eenements, la pratique de l'\u00e9dition et les c\u00e9rtificats qui les confirment peuvent vous aider \u00e0 d\u00e9montrer vos comp\u00e9tences et peuvent \u00eatre tr\u00e8s precieux pour votre d\u00e9veloppement professionnel.

    \r\n\r\n \r\n

    Qu'est-ce qu'il y a \u00e0 faire?

    \r\n \r\n

    Le plus de travail est consacr\u00e9 \u00e0 pr\u00e9parer le texte pour la publication. Dans le texte qu'on re\u00e7oit de la Biblioth\u00e8que nationale il faut corriger les fautes de frappe ou autres erreurs m\u00e9caniques, et puis ajouter des annotations tout en sachant que norte offre est cibl\u00e9e aux \u00e9l\u00e8ves, pour lesquels beaucoup des mots sembleront anachroniques. Dans les \u00e9ditions plus anciennes (tout en vue du droit d'auteur) on introduit des modernisations de la langue par exemple en ce qui concerne l'orthographe ou flexion, tout en prenant soin \u00e0 ne pas d\u00e9former la sp\u00e9cificit\u00e9 artistique du texte. Derni\u00e8re \u00e9tape c'est la recherche des motifs et th\u00e8mes litt\u00e9raires, pour aider \u00e0 conna\u00eetre la litt\u00e9rature d'une fa\u00e7on r\u00e9element profonde. Dans tous ces travaux nous sommes aid\u00e9s par les b\u00e9n\u00e9voles - professeurs et \u00e9tudiants - dont les conseils et commentaires nous aident fr\u00e9quemment \u00e0 prendre des d\u00e9cisions importantes.

    \r\n \r\n

    Comment nous contacter?

    \r\n \r\n

    Toutes les personnes int\u00e9ress\u00e9es sont invit\u00e9es \u00e0 envoyer un message \u00e0 l'adresse fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Vous pouvez aussi visiter le site de la r\u00e9daction Lectures Libres, o\u00f9 on peut trouver toutes les informations n\u00e9cessaires, expliquant comment se joindre \u00e0 nos travaux de r\u00e9daction.

    ", + "title": "You can help us", + "title_lt": "Gali mums padeti", + "right_column": "

    The most noteworthy volunteers

    \r\n\r\n\t\r\n\r\n

    AgataPaszkowska (contributes to the website since March 15, 2008)

    \r\n\r\n

    Among the others, she worked on Henryk Sienkiewicz's \"In Desert nad Wilderness\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n

    AgnieszkaKappa (contributes to the website since March 16, 2008)

    \r\n\r\n

    Among the others, she participated in creating the booklist and descritpion of the usage of the motifs and themes; worked on Henryk Sienkiewicz's works (\"The Lighthouse Keeper\", \"Janko Muzykant\", \"Quo vadis\"); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Anerys (contributes to the website since July 5, 2007)

    \r\n\r\n

    Among the others, she took part in creating the list of literary motifs and themes, and dicussion on the literary genres, she worked on Bogurodzica, Jan Kochanowski's \"Fraszki\" and \"Laments\"; Juliusz S\u0142owacki's poems (\"Gr\u00f3b Agamemnona\"), Moliere's \"Tartuffe\" and Jan Kasprowicz's poems (together with \"Dies Irae\" hymn); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n

    EmiliaZdankiewicz (contributes to the website since March 17, 2008)

    \r\n\r\n

    Among the others: literary motifs, discussion and descriptions; Juliusz S\u0142owacki's \"Kordian\"; Maria Konopnicka's \"Nasza Szkapa\"; Adam Mickiewicz's \"Dziady, part III); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\r\n

    Ewa_Serafin (contributes to the website since March 15, 2008)

    \r\n\r\n

    Among the others, she participated in creating list and usage description of literary motifsand themes; she worked on Jan Kasprowicz poems (\"Z wichr\u00f3w i hal\", \"Nad przepa\u015bciami\", \"W ciemno\u015bci schodzi moja dusza\") and Eliza Orzeszkowa's \"On the Niemen\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Hanna_Golab (contributes to the website since March 15, 2008)

    \r\n\r\n

    She worked on Sophocles' \"Oedipus the King\" and Boles\u0142aw Le\u015bmian's \"Dusio\u0142ek\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\r\n

    Ingene (contributes to the website since July 16, 2008)

    \r\n\r\n

    Among the others, she worked on Stefan \u017beromski's \"Si\u0142aczka\", Henryk Sienkiewicz's \"Quo vadis\" and Jan Kochanowski's \"Laments\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\r\n\r\n\r\n

    Jmyszkowska (contributes to the website since March 26, 2008)

    Among the others, she worked on Byron's \"Giaour\" and Henryk Sienkiewicz's \"Quo vadis\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    Marysiabailey (contributes to the website since October 1, 2007)

    \r\n\r\n

    Among the others, she took part in creating the list of literary themes and motifs and description of usage of those bra\u0142a udzia\u0142; worked on W\u0142adys\u0142aw Reymont's \"Ch\u0142opi\", Boles\u0142aw Prus' \"The Doll\", Zygmunt Krasi\u0144ski's \"Nie-boska komedia\", Ignacy Krasicki's \"Fables\" and \"Satires\", Sophocles' \"Antigone\" and poems of Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Geothe and Oppman; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; Furthermore, she prepared and carried on the training for volunteers and took care of proofreading. Currently she's managing the works on audiobooks.

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Olga_Wojtczak (contributes to the website since October 21, 2008)

    \r\n\r\n

    Among the others, she worked on Henryk Sienkiewicz's novels (The Trilogy), the works of W\u0142adys\u0142aw Reymont and Stefan \u017beromski, as well as Shakespeare's dramas;cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Renataml (contributes to the website since June 30, 2007)

    \r\n\r\n

    She took part in the discussion on list of motifs, as a experienced teacher she supported us with pieces of advice; edited Boles\u0142aw Prus' \"The Doll\", Juliusz S\u0142owacki's \"Balladyna\", Stefan \u017beromski's \"Si\u0142aczka\". http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    ", + "right_column_es": "

    Los voluntarios a los que merecemos mucho

    \r\n\r\n\r\n\r\n\t

    Agatapaszkowska (trabaja con nosotros desde el 15 de marzo 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3, entre otros, \u201cW pustynii i w puszczy\u201d de Sienkiewicz ; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    AgnieszkaKappa (trabaja con nosotros desde el 16 de marzo 2008)

    \r\n\r\n\r\n\r\n

    particip\u00f3 en la creaci\u00f3n de la lista y la descripci\u00f3n del uso de los motivos y temas literarios, edit\u00f3 los textos de Sienkiewicz (\u201cFarero\u201d, \u201cJanko Muzykant\u201d, \u201cQuo vadis\u201d); ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n\r\n\r\n\r\n

    Anerys (trabaja con nosotros desde el 5 de julio 2007)

    \r\n\r\n\r\n\r\n

    particip\u00f3 en la creaci\u00f3nn de la lista de los motivos y temas literarios y la debate sobre los g\u00e9neros literarios, edit\u00f3 Bogurodzica, \u201cFraszki\u201d y \u201cTreny\u201d de Kochanowski, poemas de S\u0142owacki (\u201cLa tumba de Agamemnon\u201d), \u201cTartufo\u201d de Moliere y los poemas de Kasprowicz (el himno \u201cDies Irae\u201d); ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    EmiliaZdankiewicz (trabaja con nosotros desde el 17 de marzo 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3 y discut\u00f3 sobre los motivos literarios, \u201cKordian\u201d de S\u0142owacki, \u201cNasza Szkapa\u201d de Konopnicka,\u201dDziady\u201d parte III de Mickiewicz; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    Ewa_Serafin (trabaja con nosotros desde el 15 de marzo 2008)

    \r\n\r\n\r\n\r\n

    particip\u00f3 en la creaci\u00f3n de la lista y la descripci\u00f3n del uso de los motivos y temas literarios, edit\u00f3 los poemas de Kasprowicz (\u201cZ wichr\u00f3w i hal\u201d, \u201cNad przepa\u015bciami\u201d, \u201cW ciemno\u015bci schodzi moja dusza\u201d) y \u201cNad Niemnem\u201d de Orzeszkowa; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n\r\n\r\n\r\n \t

    Hanna_Golab (trabaja con nosotros desde el 15 de marzo 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3 \u201cEdipo Rey\u201d de S\u00f3focles y \u201cDusio\u0142ek\u201d de Le\u015bmian; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    Ingene (trabaja con nosotros desde el 16 de julio 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3 \u201eSi\u0142aczka\u201dde \u017beromski, \u201eQuo vadis\u201d de Sienkiewicz y \u201eTreny\u201d de Kochanowski; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n\r\n \r\n\r\n\t

    Jmyszkowska (trabaja con nosotros desde el 26 de marzo 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3 \u201cGiaur\u201d de Byron y \u201cQuo vadis\u201d de Sienkiewicz; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n

    Marysiabailey (trabaja con nosotros desde el 1 de octubre 2007)

    \r\n\r\n\r\n\r\n

    partici\u00f3 en la creaci\u00f3n de la lista de motivos y temas literarios y la descripci\u00f3n de su uso, edit\u00f3 \u201cLos campesinos\u201d de Reymont, \u201cLa mu\u00f1eca\u201d de Prus, \u201cNie-boska komedia\u201d de Krasi\u0144ski, \u201cFabulas\u201d y \u201cS\u00e1tiras\u201d de Krasicki, \u201cAnt\u00edgona\u201d de S\u00f3focles y las obras de Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Goethe, Oppman; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; adem\u00e1s prepar\u00f3 y condujo el curso para voluntarios el 15 de marzo 2008; se ocupaba de proofreading y actualmente coordina los trabajos sobre los audiolibros.

    \r\n\r\n\r\n\r\n\r\n\r\n

    Olga_Wojtczak (trabaja con nosotros desde el 21 de octubre 2008)

    \r\n\r\n\r\n\r\n

    edit\u00f3 las novelas de Sienkiewicz (\u201cLa Trilogia\u201d), Reymont, \u017beromski, las dramas de Shakespeare; ved tambi\u00e9n \u201ccontribuci\u00f3n del usuario\u201d en nuestra p\u00e1gina: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n\r\n\r\n\r\n

    Renataml (trabaja con nosotros desde el 30 de junio 2007)

    \r\n\r\n\r\n\r\n

    particip\u00f3 en la debate sobre la lista de motivos literarios, nos ayud\u00f3 con sus consejos de profesora con experiencia, edit\u00f3 \u201cLa mu\u00f1eca\u201d de Prus, \u201cBalladyna\u201d de S\u0142owacki, \u201cSi\u0142aczka\u201d de \u017beromski. http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    ", + "right_column_en": "

    The most noteworthy volunteers

    \r\n\r\n\t\r\n\r\n

    AgataPaszkowska (contributes to the website since March 15, 2008)

    \r\n\r\n

    Among the others, she worked on Henryk Sienkiewicz's \"In Desert nad Wilderness\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n

    AgnieszkaKappa (contributes to the website since March 16, 2008)

    \r\n\r\n

    Among the others, she participated in creating the booklist and descritpion of the usage of the motifs and themes; worked on Henryk Sienkiewicz's works (\"The Lighthouse Keeper\", \"Janko Muzykant\", \"Quo vadis\"); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Anerys (contributes to the website since July 5, 2007)

    \r\n\r\n

    Among the others, she took part in creating the list of literary motifs and themes, and dicussion on the literary genres, she worked on Bogurodzica, Jan Kochanowski's \"Fraszki\" and \"Laments\"; Juliusz S\u0142owacki's poems (\"Gr\u00f3b Agamemnona\"), Moliere's \"Tartuffe\" and Jan Kasprowicz's poems (together with \"Dies Irae\" hymn); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n

    EmiliaZdankiewicz (contributes to the website since March 17, 2008)

    \r\n\r\n

    Among the others: literary motifs, discussion and descriptions; Juliusz S\u0142owacki's \"Kordian\"; Maria Konopnicka's \"Nasza Szkapa\"; Adam Mickiewicz's \"Dziady, part III); cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\r\n

    Ewa_Serafin (contributes to the website since March 15, 2008)

    \r\n\r\n

    Among the others, she participated in creating list and usage description of literary motifsand themes; she worked on Jan Kasprowicz poems (\"Z wichr\u00f3w i hal\", \"Nad przepa\u015bciami\", \"W ciemno\u015bci schodzi moja dusza\") and Eliza Orzeszkowa's \"On the Niemen\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Hanna_Golab (contributes to the website since March 15, 2008)

    \r\n\r\n

    She worked on Sophocles' \"Oedipus the King\" and Boles\u0142aw Le\u015bmian's \"Dusio\u0142ek\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\r\n

    Ingene (contributes to the website since July 16, 2008)

    \r\n\r\n

    Among the others, she worked on Stefan \u017beromski's \"Si\u0142aczka\", Henryk Sienkiewicz's \"Quo vadis\" and Jan Kochanowski's \"Laments\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\r\n\r\n\r\n

    Jmyszkowska (contributes to the website since March 26, 2008)

    Among the others, she worked on Byron's \"Giaour\" and Henryk Sienkiewicz's \"Quo vadis\"; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    Marysiabailey (contributes to the website since October 1, 2007)

    \r\n\r\n

    Among the others, she took part in creating the list of literary themes and motifs and description of usage of those bra\u0142a udzia\u0142; worked on W\u0142adys\u0142aw Reymont's \"Ch\u0142opi\", Boles\u0142aw Prus' \"The Doll\", Zygmunt Krasi\u0144ski's \"Nie-boska komedia\", Ignacy Krasicki's \"Fables\" and \"Satires\", Sophocles' \"Antigone\" and poems of Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Geothe and Oppman; cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; Furthermore, she prepared and carried on the training for volunteers and took care of proofreading. Currently she's managing the works on audiobooks.

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Olga_Wojtczak (contributes to the website since October 21, 2008)

    \r\n\r\n

    Among the others, she worked on Henryk Sienkiewicz's novels (The Trilogy), the works of W\u0142adys\u0142aw Reymont and Stefan \u017beromski, as well as Shakespeare's dramas;cf. \"User's contribution\" on our website: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n \r\n\r\n\r\n\r\n

    Renataml (contributes to the website since June 30, 2007)

    \r\n\r\n

    She took part in the discussion on list of motifs, as a experienced teacher she supported us with pieces of advice; edited Boles\u0142aw Prus' \"The Doll\", Juliusz S\u0142owacki's \"Balladyna\", Stefan \u017beromski's \"Si\u0142aczka\". http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    ", + "left_column_de": "

    Volontariat

    \r\n\r\n

    Wir sind stets bem\u00fcht, unseren Bibliothekbestand st\u00e4ndig um neue Werke zu erweitern. Dies ist nur \r\n dank der Hilfe unserer Volont\u00e4re m\u00f6glich.

    \r\n\r\n

    Wir laden herzlich alle Menschen ein, die sich an der Mitgestaltung unserer Internet-Schulbibliothek beteiligen wollen.

    \r\n \r\n \r\n \r\n

    Allen Volont\u00e4ren bieten wir Schulungen und Praktikum im Bereich der Textverarbeitung an: \r\n technische und sachliche Redaktion. Volont\u00e4re k\u00f6nnen mehr \u00fcber Probleme und M\u00f6glichkeiten erfahren, \r\n die mit der Ver\u00f6ffentlichung von Internetpublikationen verbunden sind. Unsere Volont\u00e4re beteiligen \r\n sich zudem an der Organisation von Schulungen und Konferenzen, helfen bei der Vorbereitung \r\n von H\u00f6rtexten (sog. Audiobooks). Wir stellen Vertr\u00e4ge und Bescheinigungen unseren Volont\u00e4ren \r\n bez\u00fcglich der Art der T\u00e4tigkeit und deren Zeitrahmen aus. Schulungen, Verlagspraktikum sowie \r\n w\u00e4hrend des Volontariats erworbene Erfahrungen und Kompetenzen k\u00f6nnen ganz gewiss zum beruflichen Aufstieg verhelfen.

    \r\n \r\n \r\n

    Was zu tun ist?

    \r\n \r\n

    Der Gro\u00dfteil der Arbeit liegt in der Vorbereitung der Lekt\u00fcren zur Ver\u00f6ffentlichung. Die Texte, die wir \r\n von der Nationalbibliothek bekommen, m\u00fcssen auf Tipp- und andere mechanische Fehler \u00fcberpr\u00fcft werden. \r\n Die Anmerkungen m\u00fcssen in den Text eingef\u00fcgt werden. Es sei zu bedenken, dass unsere Zielgruppe Sch\u00fcler sind, \r\n so m\u00fcssen dementsprechend die W\u00f6rter und Wendungen an diese Altersgruppe angepasst werden. \u00c4ltere Ausgaben \r\n (hier gilt das strenge Uhrheberrecht) werden stets in Hinblick auf Rechtsschreibung und Flexion an die \r\n Gegenwartssprache angepasst und zwar unter gleichzeitiger Beachtung der Einheit von Form und literarischen Stilen. \r\n Das Aussuchen von literarischen Motiven und Themen, die uns helfen sollen, Literaturinhalte tiefgreifend zu verstehen, \r\n schlie\u00dfen unsere Projektarbeiten ab. Bei allen diesen Unternehmungen helfen uns Volont\u00e4re - Lehrer sowie Sch\u00fcller - \r\n die uns mit eigenen Ratschl\u00e4gen und Bemerkungen bei der Entscheidungsfindung unterst\u00fctzen.

    \r\n \r\n \r\n

    Wie Sie uns erreichen?

    \r\n \r\n

    Personen, die an der Zusammenarbeit interessiert sind, bitten wir um eine E-Mail an folgende Adresse zu richten: fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Wir laden Sie auch ein unter Redaktonseite der Freien Lekt\u00fcren, auf unserer Hompage finden Sie n\u00fctzliche Informationen rund um das Thema Redaktionsarbeit.

    ", + "title_uk": "\u041c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043c \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u0442\u0438", + "right_column_fr": "

    Nos b\u00e9n\u00e9voles les plus m\u00e9ritants

    \r\n\r\n\t

    Agatapaszkowska (coop\u00e8re avec nous depuis le 15 mars 2008)

    \r\n\r\n

    entre autres, elle a r\u00e9dig\u00e9 \"W pustyni i w puszczy\u201d de Henryk Sienkiewicz; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t

    AgnieszkaKappa (coop\u00e8re avec nous depuis le 16 mars 2008)

    \r\n\r\n

    entre autres, elle a particip\u00e9 \u00e0 la pr\u00e9paration de la liste des motifs et th\u00e8mes litt\u00e9raires et leurs descriptions, a r\u00e9dig\u00e9 les textes de Sienkiewicz (\"Latarnik\", \"Janko Muzykant\", \"Quo vadis\"); voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n

    Anerys (coop\u00e8re avec nous depuis le 5 juillet 2007)

    \r\n\r\n

    entre autres, elle a particip\u00e9 \u00e0 la pr\u00e9paration de la liste des motifs et th\u00e8mes litt\u00e9raires, dans la discussion sur les genres litt\u00e9raires, elle \u00e0 r\u00e9dig\u00e9 \"Bogurodzica\", \"Fraszki\u201d et \"Treny\u201d de Kochanowski; les po\u00e8mes de S\u0142owacki (\"Gr\u00f3b Agamemnona\"), \"Tartuffe, ou l'Imposteur\" de Moli\u00e8re, les po\u00e8mes de Kasprowicz (entre autres le hymne \"Dies Irae\u201d); voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\t

    EmiliaZdankiewicz (coop\u00e8re avec nous depuis le 17 mars 2008)

    \r\n\r\n

    entre autres, les motifs litt\u00e9raires - discussion et description, \"Kordian\" de S\u0142owacki; \"Nasza szkapa\" de Konopnicka; \"A\u00efeux p.III\" de Mickiewicz; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\t

    Ewa_Serafin (coop\u00e8re avec nous depuis le 15 mars 2008)

    \r\n\r\n

    entre autres a particip\u00e9 \u00e0 la cr\u00e9ation de la liste et de la description de l'utilisation des motifs et th\u00e8mes litt\u00e9raires, a r\u00e9dig\u00e9 les po\u00e8mes de Kasprowicz (\"Z wichr\u00f3w i hal\u201d, \"Nad przepa\u015bciami\u201d, \"W ciemno\u015bci schodzi moja dusza\u201d ainsi que \u201eNad Niemnem\u201d d'Orzeszkowa; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \t

    Hanna_Golab (coop\u00e8re avec nous depuis le 15 juillet 2008)

    \r\n\r\n

    elle a r\u00e9dig\u00e9 \"Oedipe roi\u201d de Sophocle et \"Dusio\u0142ek\u201d de Le\u015bmian; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\t

    Ingene (coop\u00e8re avec nous depuis le 16 juillet 2008)

    \r\n\r\n

    elle a r\u00e9dig\u00e9 \"Si\u0142aczka\u201d de \u017beromski, \"Quo vadis\u201d de Sienkiewicz ainsi que \"Treny\u201d de Kochanowski; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\t

    Jmyszkowska (coop\u00e8re avec nous depuis le 26 mars 2008)

    \r\n\r\n

    entre autres, elle a r\u00e9dig\u00e9 \"Giaour\u201d de Byron et \"Quo vadis\u201d de Sienkiewicz; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n

    Marysiabailey (coop\u00e8re avec nous depuis le 1 octobre 2007)

    \r\n\r\n

    elle a particip\u00e9 \u00e0 la pr\u00e9paration de la liste des motifs et th\u00e8mes litt\u00e9raires et de la description de leur utilisation; elle a r\u00e9dig\u00e9 \"Les Paysans\u201d de Reymont, \"La poup\u00e9e\u201d de Prus, \"Nie-Boska komedia\u201d de Krasi\u0144ski, \"Bajki\u201d et \"Satyry\u201d de Krasicki, \"Antigone\u201d de Sophocle et les oeuvres de Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Goethe, Oppman, Kasprowicz; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; elle a en plus pr\u00e9par\u00e9 et conduit l'entra\u00eenement pour les b\u00e9n\u00e9voles le 15 mars 2008; elle a fait la correcte des textes et est coordinatrice du travail sur les livres audio.

    \r\n\r\n\r\n

    Olga_Wojtczak (coop\u00e8re avec nous depuis le 21 octobre 2008)

    \r\n\r\n

    entre autres, elle a r\u00e9dig\u00e9 les romans de Sienkiewicz (la Trilogie), de Reymont, \u017beromski, les oeuvres de Shakespeare; voir aussi \"contribution de l'utilisateur\u201d sur notre site: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n

    Renataml (coop\u00e8re avec nous depuis le 30 juin 2007)

    \r\n\r\n

    a particip\u00e9 \u00e0 la discussion sur la liste des motifs, en tant qu'enseignante experiment\u00e9e, elle nous a donn\u00e9 des conseils pr\u00e9cieux, a \u00e9dit\u00e9 \"La poup\u00e9e\u201d de Prus, \"Balladyna\u201d de S\u0142owacki, \"Si\u0142aczka\u201d de \u017beromski.\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    \r\n", + "left_column": "

    Volunteering

    \r\n\r\n

    We try our best to elaborate works appended to our library. It is possible only thanks to the support of our volunteers.

    \r\n\r\n \r\n

    We invite every person who wants to take part in developing the web school library Wolne Lektury.

    \r\n

    We offer trainings and traineeships in proofreading and copy-editing for every and each volunteer. Our volunteers can learn not only about the problems, but also the opportunities concerning web publishing. They organize the trainings and conferences together with us, as well as they help in preparing the audio versions ob books (so called audiobooks). We are also able to issue voluneering contracts and certificates regarding sort and duration of volunteer's work for our foundation. The traineeships, proofreading and copywriting practice as well as the certificates confirming those may be found vital in acquiring professional qualifications and promotion. .

    \r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n

    What else is there to be done?

    \r\n \r\n

    Preparing the reading for publishing demands the most effort. One has to correct the typos nad other errors of this kind in the texts we receive from the National Library. Next, one needs to provide the book with the annotations, at the same time bearing in mind that our offering is addressed to the pupils, for whom many words and collocations may sound out of date. The older editions (the rule is determined by copyrights) are subject to essential lingustic modernisations, i.e. in spelling or inflection but we pay attention to not to violate the artistic specifity of the literary works. The last stage of the preparation is searching for literary motfis and themes, so the text is examined thoroughly. In each and every phase we are supported by the volunteers - teachers and students - who often advise us point out crucial matters as we take important decisions.

    \r\n \r\n\r\n\r\n\r\n\r\n\r\n

    How to contact us?

    \r\n \r\n

    We ask every interested person to send us an e-mail: fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Please, visit also the editorial website of Wolne Lektury. There you will find essential information on how to involve yourself in editorial works.

    \r\n\r\n", + "right_column_uk": "

    \u041d\u0430\u0439\u0431\u0456\u043b\u044c\u0448 \u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u0456 \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0438

    \r\n\r\n\r\n\r\n\t

    Agatapaszkowska (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 15 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u00ab\u0412 \u043f\u0443\u0441\u0442\u0435\u043b\u0456 \u0456 \u0432 \u0434\u0436\u0443\u043d\u0433\u043b\u044f\u0445\u00bb \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 ; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    AgnieszkaKappa (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 16 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u0431\u0440\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u044c \u0432 \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u0430 \u043e\u043f\u0438\u0441\u0443 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u043c\u043e\u0442\u0438\u0432\u0456\u0432 \u0442\u0430 \u0442\u0435\u043c; \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u0442\u0435\u043a\u0441\u0442\u0438 \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 (Latarnik,\u042f\u043d\u043a\u043e \u041c\u0443\u0437\u0438\u043a\u0430\u043d\u0442, Quo vadis); \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n\r\n\r\n\r\n

    Anerys (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 5 \u043b\u0438\u043f\u043d\u044f 2007)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u0431\u0440\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u044c \u0432 \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u043c\u043e\u0442\u0438\u0432\u0456\u0432 \u0442\u0430 \u0442\u0435\u043c, \u0434\u0438\u0441\u043a\u0443\u0441\u0456\u0457 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u0436\u0430\u043d\u0440\u0456\u0432, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u0433\u0456\u043c\u043d \u0411\u043e\u0433\u043e\u0440\u043e\u0434\u0438\u0446\u044f, \u00ab\u0424\u0440\u0430\u0448\u043a\u0438\u00bb \u0442\u0430 \u00ab\u0422\u0440\u0435\u043d\u0438\u00bb \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u044c\u043a\u043e\u0433\u043e; \u0432\u0456\u0440\u0448\u0456 \u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u043e\u0433\u043e (Gr\u00f3b Agamemnona), \u00ab\u0422\u0430\u0440\u0442\u044e\u0444\u0430\u00bb \u041c\u043e\u043b\u044c\u0454\u0440\u0430, \u0442\u0430 \u043f\u043e\u0435\u0437\u0456\u0457 \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0456\u0447\u0430 (\u0432 \u0446\u044c\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0456 \u0433\u0456\u043c\u043d \u201eDies Irae\u201d); \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    EmiliaZdankiewicz (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 17 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0456 \u043c\u043e\u0442\u0438\u0432\u0438 \u2014 \u0434\u0438\u0441\u043a\u0443\u0441\u0456\u044f \u0442\u0430 \u043e\u043f\u0438\u0441, \u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0438\u0439, \u041a\u043e\u0440\u0434\u0456\u0430\u043d; \u041a\u043e\u043d\u043e\u043f\u043d\u0456\u0446\u044c\u043a\u0430, Nasza szkapa; \u041c\u0456\u0446\u043a\u0435\u0432\u0438\u0447, \u0414\u0437\u044f\u0434\u0438 \u0447. III; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    Ewa_Serafin (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 15 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u0431\u0440\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u044c \u0432 \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u0430 \u043e\u043f\u0438\u0441\u0443 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u043c\u043e\u0442\u0438\u0432\u0456\u0432 \u0442\u0430 \u0442\u0435\u043c, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u043f\u043e\u0435\u0437\u0456\u0457 \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0456\u0447\u0430(\u201cZ wichr\u00f3w i hal\u201d, \u201cNad przepa\u015bciami\u201d, \u201cW ciemno\u015bci schodzi moja dusza\u201d), \u0430 \u0442\u0430\u043a\u043e\u0436 \u201cNad Niemnem\u201d \u0415\u043b\u0456\u0437\u0438 \u041e\u0436\u0435\u0448\u043a\u043e; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n\r\n\r\n\r\n \t

    Hanna_Golab (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 15 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u201c\u0426\u0430\u0440\u044f \u0415\u0434\u0456\u043f\u0430\u201d \u0421\u043e\u0444\u043e\u043a\u043b\u0430 \u0442\u0430 \u0432\u0456\u0440\u0448 \u201cDusio\u0142ek\u201d \u041b\u0435\u0441\u044c\u043c\u044f\u043d\u0430; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\r\n\r\n\r\n\t

    Ingene (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 16 \u043b\u0438\u043f\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u043e\u043f\u043e\u0432\u0456\u0434\u0430\u043d\u043d\u044f \u201cSi\u0142aczk\u0119\u201d \u0416\u0435\u0440\u043e\u043c\u0441\u044c\u043a\u043e\u0433\u043e, \u201cQuo vadis\u201d \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 \u0442\u0430 \u201c\u0422\u0440\u0435\u043d\u0438\u201d \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u044c\u043a\u043e\u0433\u043e; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n\r\n \r\n\r\n\t

    Jmyszkowska (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 26 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u201c\u0413\u044f\u0443\u0440\u0430\u201d \u0411\u0430\u0439\u0440\u043e\u043d\u0430 \u0442\u0430 \u201cQuo vadis\u201d \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n\r\n\r\n\r\n

    Marysiabailey (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 1 \u0436\u043e\u0432\u0442\u043d\u044f 2007)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u0431\u0440\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u044c \u0443 \u0442\u0432\u043e\u0440\u0435\u043d\u043d\u0456 \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u0442\u0435\u043c \u0442\u0430 \u043e\u043f\u0438\u0441\u0456 \u0457\u0445 \u0437\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u043d\u043d\u044f; \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u0442\u0432\u043e\u0440\u0438: \u201c\u0421\u0435\u043b\u044f\u043d\u0438\u201d \u0420\u0435\u0439\u043c\u043e\u043d\u0442\u0430 , \u201cLalka\u201d \u041f\u0440\u0443\u0441\u0430, \u201cNie-Boska komedia\u201d \u041a\u0440\u0430\u0441\u0456\u043d\u0441\u044c\u043a\u043e\u0433\u043e, \u201eBajki\u201d \u0442\u0430 \u201eSatyry\u201d \u041a\u0440\u0430\u0441\u0456\u0446\u044c\u043a\u043e\u0433\u043e, \u201c\u0410\u043d\u0442\u0438\u0433\u043e\u043d\u0430\u201d \u0421\u043e\u0444\u043e\u043a\u043b\u0430, \u0430 \u0442\u0430\u043a\u043e\u0436 \u0442\u0432\u043e\u0440\u0438 \u041a\u043e\u0445\u0430\u043d\u043e\u0432\u0441\u044c\u043a\u043e\u0433\u043e, \u041c\u043e\u0440\u0448\u0442\u0438\u043d\u0430, \u041c\u0456\u0446\u043a\u0435\u0432\u0438\u0447\u0430, \u0490\u0435\u0442\u0435, \u041e\u043f\u043f\u043c\u0430\u043d\u0430, \u041a\u0430\u0441\u043f\u0440\u043e\u0432\u0456\u0447\u0430; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; \u043a\u0440\u0456\u043c \u0442\u043e\u0433\u043e, \u043f\u0456\u0434\u0433\u043e\u0442\u0443\u0432\u0430\u043b\u0430 \u0456 \u043f\u0440\u043e\u0432\u0435\u043b\u0430 \u0442\u0440\u0435\u043d\u0456\u043d\u0433 \u0434\u043b\u044f \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0456\u0432 15 \u0431\u0435\u0440\u0435\u0437\u043d\u044f 2008; \u0437\u0430\u044f\u043c\u0430\u043b\u0430\u0441\u044f \u0442\u0430\u043a\u043e\u0434 \u043a\u043e\u0440\u0435\u043a\u0442\u043e\u044e, \u0430 \u043d\u0430 \u0434\u0430\u043d\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0430\u0446\u044e\u0454 \u043d\u0430\u0434 \u0430\u0443\u0434\u0456\u043e-\u043a\u043d\u0438\u0433\u0430\u043c\u0438.

    \r\n\r\n\r\n\r\n\r\n\r\n

    Olga_Wojtczak (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 21 \u0436\u043e\u0432\u0442\u043d\u044f 2008)

    \r\n\r\n\r\n\r\n

    \u043c\u0456\u0436 \u0456\u043d\u0448\u0438\u043c\u0438, \u043e\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0430 \u0440\u043e\u043c\u0430\u043d\u0438 \u0421\u0435\u043d\u043a\u0435\u0432\u0438\u0447\u0430 (\u0422\u0440\u0438\u043b\u043e\u0433\u0456\u044f), \u0420\u0435\u0439\u043c\u043e\u043d\u0442\u0430, \u0416\u0435\u0440\u043e\u043c\u0441\u044c\u043a\u043e\u0433\u043e, \u0434\u0440\u0430\u043c\u0438 \u0428\u0435\u043a\u0441\u043f\u0456\u0440\u0430; \u0434\u0438\u0432\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0436 \u043d\u0430 \u043d\u0430\u0448\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456 \u00ab\u0432\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u00bb: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n\r\n\r\n\r\n

    Renataml (\u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0454 \u0437 \u043d\u0430\u043c\u0438 \u0432\u0456\u0434 30 \u0447\u0435\u0440\u0432\u043d\u044f 2007)

    \r\n\r\n\r\n\r\n

    \u0431\u0440\u0430\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u044c \u0432 \u0434\u0438\u0441\u043a\u0443\u0441\u0456\u0457 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u043c\u043e\u0442\u0438\u0432\u0456\u0432; \u044f\u043a \u0434\u043e\u0441\u0432\u0456\u0434\u0447\u0435\u043d\u0430 \u0432\u0447\u0438\u0442\u0435\u043b\u044c\u043a\u0430, \u043d\u0430\u0434\u0430\u0432\u0430\u043b\u0430 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 \u0442\u0430 \u043f\u043e\u0440\u0430\u0434\u0438, \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043b\u0430 \u0440\u043e\u043c\u0430\u043d \u00abLalka\u00bb \u041f\u0440\u0443\u0441\u0430, \u0434\u0440\u0430\u043c\u0443 \u00ab\u0411\u0430\u043b\u043b\u0430\u0434\u0438\u043d\u0430\u00bb \u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u043e\u0433\u043e, \u043e\u043f\u043e\u0432\u0456\u0434\u0430\u043d\u043d\u044f \u00abSi\u0142aczka\u00bb \u0416\u0435\u0440\u043e\u043c\u0441\u044c\u043a\u043e\u0433\u043e.\r\n\r\n\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    ", + "title_en": "You can help us", + "left_column_pl": "

    Wolontariat

    \r\n\r\n

    Utwory w\u0142\u0105czane sukcesywnie do naszej biblioteki staramy si\u0119 opracowywa\u0107 jak najdok\u0142adniej. Jest to mo\u017cliwe\r\n tylko dzi\u0119ki wsp\u00f3\u0142pracuj\u0105cym z nami wolontariuszom.

    \r\n \r\n

    Zapraszamy wszystkie osoby, kt\u00f3re chc\u0105 wsp\u00f3\u0142tworzy\u0107 szkoln\u0105 bibliotek\u0119 internetow\u0105 Wolne Lektury.

    \r\n \r\n

    Wszystkim wolontariuszom oferujemy szkolenia i praktyk\u0119 w zakresie edycji tekst\u00f3w: redakcji technicznej i\r\n merytorycznej. Wolontariusze mog\u0105 pozna\u0107 problemy, ale i mo\u017cliwo\u015bci, jakie wi\u0105\u017c\u0105 si\u0119 z publikacjami internetowymi.\r\n Wsp\u00f3\u0142organizuj\u0105 z nami szkolenia i konferencje, pomagaj\u0105 w przygotowaniu wersji tekst\u00f3w do s\u0142uchania (tzw.\r\n audiobook\u00f3w). Wystawiamy umowy i za\u015bwiadczenia o tym, kiedy i jakie prace wykonywa\u0142 wolontariusz na rzecz naszej\r\n fundacji. Szkolenia, praktyka edytorska i potwierdzaj\u0105ce je za\u015bwiadczenia mog\u0105 si\u0119 okaza\u0107 istotne w procesie\r\n podnoszenia kwalifikacji i awansu zawodowego.

    \r\n\r\n \r\n

    Co jest do zrobienia?

    \r\n \r\n

    Najwi\u0119cej pracy mamy przy przygotowaniu lektur do publikacji. Z tekstu, kt\u00f3ry otrzymujemy z Biblioteki\r\n Narodowej, nale\u017cy usun\u0105\u0107 liter\u00f3wki i inne mechaniczne b\u0142\u0119dy, a nast\u0119pnie opatrzy\u0107 tekst przypisami, pami\u0119taj\u0105c o\r\n tym, \u017ce nasza oferta skierowana jest przede wszystkim do uczni\u00f3w, dla kt\u00f3rych wiele s\u0142\u00f3w i zwrot\u00f3w b\u0119dzie brzmia\u0142o\r\n anachronicznie. Wydania dawniejsze (rygor wyznacza tu prawo autorskie) poddawane s\u0105 koniecznym uwsp\u00f3\u0142cze\u015bnieniom\r\n j\u0119zykowym, np. w zakresie ortografii lub fleksji, przy czym pilnujemy, aby nie narusza\u0107 artystycznej swoisto\u015bci\r\n tekstu. Ostatnim etapem jest wyszukiwanie motyw\u00f3w i temat\u00f3w literackich, maj\u0105ce pom\u00f3c przejrze\u0107 literatur\u0119 \"na\r\n wskro\u015b\". We wszystkich tych pracach wspomagaj\u0105 nas wolontariusze \u2013 nauczyciele i studenci \u2013 cz\u0119sto s\u0142u\u017c\u0105c r\u00f3wnie\u017c\r\n radami i uwagami przy podejmowaniu wa\u017cnych decyzji.

    \r\n \r\n

    Jak si\u0119 do nas zg\u0142osi\u0107?

    \r\n \r\n

    Wszystkie zainteresowane osoby prosimy o przys\u0142anie maila na adres fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Zapraszamy tak\u017ce na stron\u0119 redakcji Wolnych Lektur, na kt\u00f3rej znajduj\u0105 si\u0119 wszystkie niezb\u0119dne informacje o tym, jak w\u0142\u0105czy\u0107 si\u0119 w prace redakcyjne.

    \r\n", + "left_column_ru": "

    \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e

    \r\n\r\n

    \u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\r\n \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u0448\u0438\u043c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c-\u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c.

    \r\n\r\n \r\n

    \u041c\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u0441\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0448\u043a\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Wolne Lektury \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u043c\u0438.

    \r\n \r\n

    \u041c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u043f\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u043e\u0432: \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0438\r\n \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443. \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438.\r\n \u041e\u043d\u0438, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u043c\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0442 \u0443\u0447\u0435\u0431\u0443 \u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u0430\u0433\u0430\u044e\u0442 \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0448\u0430\u043d\u0438\u044f (\u0442.\u043d.\r\n \u0430\u0443\u0434\u0438\u043e\u043a\u043d\u0438\u0433). \u041c\u044b \u0432\u044b\u0434\u0430\u0435\u043c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u044b \u0438 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \r\n \u0438 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u043e\u043c \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \r\n \u0444\u043e\u043d\u0434\u0430. \u0423\u0447\u0435\u0431\u0430, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0438\u0445 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435\r\n \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043b\u0443\u0436\u0431\u0435.

    \r\n\r\n \r\n

    \u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?

    \r\n \r\n

    \u0421\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043c\u0438 \u0438\u0437 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \r\n \u0417\u0430\u0442\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u043e\u0441\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u043e \u043a \u0443\u0447\u0435\u043d\u0438\u043a\u0430\u043c, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432 \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0437\u0432\u0443\u0447\u0438\u0442 \u0430\u043d\u0430\u0445\u0440\u043e\u043d\u0438\u0447\u043d\u043e.\r\n \u041f\u0440\u0435\u0436\u043d\u0438\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u044f (\u0440\u0435\u0436\u0438\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430) \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440. \u043f\u043e \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u043b\u0438 \u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041f\u0440\u0438\u0447\u0435\u043c, \u043c\u044b \u0437\u0430\u0431\u043e\u0442\u0438\u043c\u0441\u044f \u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438\r\n \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \"\u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c\".\r\n \u0412\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0445 \u0441\u0432\u043e\u044e \u043f\u043e\u043c\u043e\u0449\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b - \u0443\u0447\u0438\u0442\u0435\u043b\u044f \u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b, \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0438 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f\r\n \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \r\n \r\n

    \u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 \u0444\u043e\u043d\u0434?

    \r\n \r\n

    \u0412\u0441\u0435\u0445 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0438-\u043c\u0435\u0439\u043b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    \u041c\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 Wolne Lektury, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043c.

    ", + "right_column_lt": "

    Labiausiai nusipeln\u0119 savanoriai

    \r\n\r\n\t

    Agatapaszkowska (bendradarbiauja su mumis nuo 2008 m. kovo 15 d.)

    \r\n\r\n

    tarp kitko pareng\u0117 \u201eW pustyni i w puszczy\u201d Sienkiewicza ; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t

    AgnieszkaKappa (bendradarbiauja su mumis nuo 2008 m. kovo 16 d.)

    \r\n\r\n

    tarp kitko pad\u0117jo paruo\u0161ti literat\u016bros tem\u0173 ir motyv\u0173 s\u0105ra\u0161\u0105; parsiuo\u0161\u0117 teksto apra\u0161ymus: Sienkiewicz (Latarnik, Janko Muzykant, Quo vadis); aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n

    Anerys (bendradarbiauja su mumis nuo 2007 m. liepos 5 d.)

    \r\n\r\n

    tarp kitko pad\u0117jo paruo\u0161ti literat\u016bros tem\u0173 ir motyv\u0173 s\u0105ra\u0161\u0105, diskusija apie literat\u016brin\u0119s r\u016b\u0161is, parsiuo\u0161\u0117 \u0161iu tekstu apra\u0161ymus; BogurodzicA, \u201eFraszki\u201d i \u201eTreny\u201d Kochanowskiego; eil\u0117ra\u0161\u010diai: S\u0142owacki (Gr\u00f3b Agamemnona), \u201e\u015awi\u0119toszek\u201d Molier, ar poezija Kasprowicz (himnas \u201eDies Irae\u201d);aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d:\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n\r\n\r\n\t

    EmiliaZdankiewicz (bendradarbiauja su mumis nuo 2008 m. kovo 17 d.

    \r\n\r\n

    tarp kitko literat\u016brinai motyvai, diskusijos, apra\u0161ymai: S\u0142owacki, Kordian; Konopnicka, Nasza szkapa; Mickiewicz, Dziady cz. III; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n\r\n\t

    Ewa_Serafin (bendradarbiauja su mumis nuo 2008 m. kovo 15 d.)

    \r\n\r\n

    tarp kitko pad\u0117jo paruo\u0161ti literat\u016bros tem\u0173 ir motyv\u0173 s\u0105ra\u0161\u0105, parsiuo\u0161\u0117 \u0161iu poeti\u0161ku tekstu apra\u0161ymus: Kasprowicz (\u201eZ wichr\u00f3w i hal\u201d, \u201eNad przepa\u015bciami\u201d, \u201eW ciemno\u015bci schodzi moja dusza\u201d oraz \u201eNad Niemnem\u201d Orzeszkowej; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \t

    Hanna_Golab (bendradarbiauja su mumis nuo 2008 m. kovo 15 d.)

    \r\n\r\n

    apra\u0161\u0117:\u201eKr\u00f3la Edypa\u201d Sofoklesa ir \u201eDusio\u0142k\u201d Le\u015bmian; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\t

    Ingene (bendradarbiauja su mumis nuo 2008 m. liepos 16 d.)

    \r\n\r\n

    tarp kitko apra\u0161\u0117: \u201eSi\u0142aczka\u201d \u017beromski, \u201eQuo vadis\u201d Sienkiewicz ir \u201eTreny\u201d Kochanowski; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\t

    Jmyszkowska (bendradarbiauja su mumis nuo 2008 m. kovo 26 d.)

    \r\n\r\n

    tarp kitko apra\u0161\u0117 \u201eGiaura\u201d Byron ir \u201eQuo vadis\u201d Sienkiewicz; aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n

    Marysiabailey (bendradarbiauja su mumis nuo 2007 m. spalio 1 d.)

    \r\n\r\n

    tarp kitko pad\u0117jo paruo\u0161ti literat\u016bros tem\u0173 ir motyv\u0173 s\u0105ra\u0161\u0105; apra\u0161\u0117 \u201eCh\u0142opi\u201d Reymont, \u201eLalka\u201d Prus, \u201eNie-Bosk\u0105 komedia\u201d Krasi\u0144skie, \u201eBajki\u201d ir \u201eSatyry\u201d Krasicki, \u201eAntygona\u201d Sofokles ir k\u016brinius: Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Goethe, Oppman, Kasprowicz; zob. ;aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey; parose ir ved\u0117 apmokymus savanoriams 2008 m. kovo 15 d.; u\u017esiimin\u0117jo proofreading, o dabartiniu metu vadovauja darbams susijusiems su audio knyg\u0173 ruo\u0161imu.

    \r\n\r\n\r\n

    Olga_Wojtczak (bendradarbiauja su mumis nuo 2008 m. spalio 21 d.)

    \r\n\r\n

    tarp kitko apra\u0161e roman\u0105 Sienkiewicz (Trilogija), Reymont, \u017beromski, dramos Shakespear; ;aplankyk taip pat tinklap\u012f \u201evartotojo \u012fna\u0161\u0105\u201d: http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n\r\n

    Renataml (bendradarbiauja su mumis nuo 2007 m. bir\u017eelio 30 d.)

    \r\n\r\n

    pad\u0117jo parsiuo\u0161ti diskusij\u0105 apie motyv\u0173 s\u0105ra\u0161\u0105, patar\u0117 mums, nes tai patyrusi mokytoja, \u201eLalk\u0119\u201d Prusa, \u201eBalladyn\u0119\u201d S\u0142owackiego, \u201eSi\u0142aczk\u0119\u201d \u017beromskiego.\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    \r\n", + "title_es": "\ufeffPuedes ayudarnos", + "page_title_fr": "Vous pouvez nous aider avec WolneLektury.pl", + "page_title_uk": "\u041c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043c \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u0442\u0438 \u0443 WolneLektury.pl", + "page_title_de": "Du kannst uns helfen unter WolneLektury.pl", + "slug": "help_us", + "page_title_lt": "Gali mums pad\u0117ti LaisvojiLiteratura.lt", + "right_column_de": "

    Wohlverdiente Volont\u00e4re

    \r\n\r\n\t

    Agatapaszkowska (Mitarbeit seit 15. M\u00e4rz 2008)

    \r\n\r\n

    bearbeitete u.a. \"Durch W\u00fcste und Wildnis\" von Sienkiewicz; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Agatapaszkowska

    \r\n\r\n\r\n\t

    AgnieszkaKappa (Mitarbeit seit 16. M\u00e4rz 2008)

    \r\n\r\n

    arbeitete u.a. an der Erstellung der Liste und Beschreibung der literarischen Themen und Motive;bearbeitete Texten von Sienkiewicz ( Der Leuchtturmw\u00e4rter, Janko der Musikant, Quo vadis);s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=AgnieszkaKappa

    \r\n\r\n\r\n \r\n \r\n\r\n

    Anerys (Mitarbeit seit 5. Juli 2007)

    \r\n\r\n

    arbeitete u.a. an der Erstellung der Liste und Beschreibung der literarischen Themen und Motive;nahm an der Diskussion \u00fcber Literaturgattungen teil, bearbeitete folgende Werke: Bogurodzica, \"Spruchgedichte\" und \"Klagelieder\" von Kochanowski; Gedichte von Slowacki ( Agamemnons Grab), \"Tartuffe oder der Betr\u00fcger\" von Moliere, ob Poesien von Kasprowicz (u.a. eine Hymne \"Dies Irae\"); s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Anerys

    \r\n \r\n\r\n\t

    EmiliaZdankiewicz (Mitarbeit seit 17. M\u00e4rz 2008)

    \r\n\r\n

    nahm u.a. an der Diskussion und Beschreibung literarischer Motive teil, S\u0142owacki, Kordian; Konopnicka, Unsere M\u00e4hre; Mickiewicz, Totenfeier Teil III; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/EmiliaZdankiewicz

    \r\n\r\n \r\n\t\r\n\t

    Ewa_Serafin (Mitarbeit seit 15. M\u00e4rz 2008)

    \r\n\r\n

    arbeitete u.a. an der Erstellung der Liste und Beschreibung der literarischen Themen und Motive, bearbeitete Kasprowicz Gedichte (\u201eZ wichr\u00f3w i hal\u201d, \u201eNad przepa\u015bciami\u201d, \u201eW ciemno\u015bci schodzi moja dusza\u201d oraz \u201eNad Niemnem\u201d Orzeszkowej; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ewa_Serafin

    \r\n\r\n\r\n \t

    Hanna_Golab (Mitarbeit seit 15. M\u00e4rz 2008)

    \r\n\r\n

    bearbeitete \" K\u00f6nig \u00d6dipus\" von Sophokles sowie \"Dusio\u0142ek\" von Lesmian; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Hanna_Golab

    \r\n\r\n\r\n\t

    Ingene (Mitarbeit seit 16. Juli 2008)

    \r\n\r\n

    bearbeitete u.a. \u201eSi\u0142aczka\u201d von \u017beromski, \u201eQuo vadis\u201d von Sienkiewicz sowie \u201eKlagelieder\u201d von Kochanowski; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Ingene

    \r\n \r\n\t

    Jmyszkowska (Mitarbeit seit 26. M\u00e4rz 2008)

    \r\n\r\n

    bearbeitete u.a. \u201eGiaur\u201d von Byron sowie \u201eQuo vadis\u201d von Sienkiewicz; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Jmyszkowska

    \r\n\r\n\r\n

    Marysiabailey (Mitarbeit seit 1. Oktober 2007)

    \r\n\r\n

    arbeitete u.a. an der Erstellung der Liste und Beschreibung der literarischen Themen und Motive sowie deren Benutzung; bearbeitete folgende Werke: \"Die Bauern\" von Reymont, \"Die Puppe\" von Prus, \"Un-g\u00f6ttliche Kom\u00f6die\" von Krasinski, \"M\u00e4rchens\" und \"Satire\" von Krasickiego, \"Antigone\" von Sophokles sowie Werke von Kochanowski, Morsztyn, Mickiewicz, Kasprowicz, Goethe, Oppman, Kasprowicz; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\u201c: http://wiki.wolnepodreczniki.pl/index.php?title=Specjalna:Wk%C5%82ad&limit=500&target=Marysiabailey\r\n\r\n\r\n

    Olga_Wojtczak (Mitarbeit seit 21. Oktober 2008)

    \r\n\r\n

    bearbeitete u.a. Romane von Sienkiewicz ( Die Trilogie), Reymont, \u017beromski und Dramen von Shakespeare; s. auf unserer Website die \"Benutzerbeitr\u00e4ge\": http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Olga_Wojtczak

    \r\n\r\n

    Renataml (Mitarbeit seit 30. Juni 2007)

    \r\n\r\n

    nahm an der Diskussion \u00fcber Motivlisten teil, als erfahrene Lehrerin unterst\u00fctzte sie uns mit vielen Ratschl\u00e4gen, bearbeitete folgende Werke: \"Die Puppe\" von Prus, \"Balladyna\" von Slowacki, \"Si\u0142aczka\" \u017beromski.\r\n\r\n http://wiki.wolnepodreczniki.pl/Specjalna:Wk%C5%82ad/Renataml

    \r\n", + "page_title_pl": "Mo\u017cesz nam pom\u00f3c w WolneLektury.pl", + "left_column_es": "

    Voluntariado

    \r\n\r\n\r\n\r\n

    Hacemos todo lo posible para elaborar las obras de nuestra biblioteca con la mayor perfecci\u00f3n. Esto es posible s\u00f3lo gracias al apoyo de nuestros voluntarios.

    \r\n\r\n\r\n\r\n \r\n\r\n

    Invitamos a todos quienes quieren formar parte en el desarrollo de la biblioteca virtual de Wolne Lektury.

    \r\n\r\n \r\n\r\n

    A todos los voluntarios les ofrecemos cursos y pr\u00e1cticas en cuanto a la redacci\u00f3n t\u00e9cnica y pr\u00e1ctica. Los voluntarios tienen la posibilidad de conocer tanto los problemas como las oportunidades relacionadas con las publicaciones virtuales. Nos ayudan en la organizaci\u00f3n de conferencias y cursos de formaci\u00f3n, asimismo asisten en la edici\u00f3n de los textos en forma auditiva (audiolibros). Los proporcionamos contratos y certificados con los detalles del trabajo y tipo de tareas realizadas para nuestra fundaci\u00f3n. Los cursos, las pr\u00e1cticas realizadas y los certificados correspondientes podr\u00e1n resultar \u00fatiles en el proceso del desarrollo profesional y para el futuro trabajo profesional.

    \r\n\r\n \r\n\r\n

    \u00bfEn qu\u00e9 nos puedes ayudar?

    \r\n\r\n La Biblioteca\r\n\r\n Nacional proporciona textos, pero hay que eliminar las faltas de ortograf\u00eda y otros errores mec\u00e1nicos y, a continuaci\u00f3n, a\u00f1adir glosas.\r\n\r\n

    La mayor\u00eda de trabajo la tenemos con la preparaci\u00f3n de los libros para la publicaci\u00f3n. La Biblioteca Nacional proporciona textos pero hay que corregir las erratas y otros errores, despu\u00e9s a\u00f1adir las anotaciones a pie de p\u00e1gina teniendo en cuenta que nuestra oferta es dirigida especialmente a estudiantes para quienes muchas palabras o expresiones pueden ser anacr\u00f3nicas. Tratamos de modernizar las ediciones antiguas (respetando el derecho de autor) respecto a la ortograf\u00eda o la inflexi\u00f3n pero cuidamos para no violar el valor art\u00edstico del texto. La \u00faltima etapa es buscar todos los motivos y temas literarios que ayudar\u00e1n en conocer la lectura totalmente. En todos los trabajos nos ayudan los voluntarios, profesores y estudiantes, a menudo ayudando tambi\u00e9n en la toma de decisiones importantes.

    \r\n\r\n \r\n\r\n

    \u00bfC\u00f3mo inscribirse?

    \r\n\r\n \r\n\r\n

    Todos que est\u00e9n interesados enviad un mail a fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n\r\n\r\n

    Os invitamos tambi\u00e9n a visitar la p\u00e1gina de la redacci\u00f3n de Wolne Lektury donde hay todas las informaciones necesarias para empezar el trabajo editorial.

    \r\n\r\n", + "left_column_en": "

    Volunteering

    \r\n\r\n

    We try our best to elaborate works appended to our library. It is possible only thanks to the support of our volunteers.

    \r\n\r\n \r\n

    We invite every person who wants to take part in developing the web school library Wolne Lektury.

    \r\n

    We offer trainings and traineeships in proofreading and copy-editing for every and each volunteer. Our volunteers can learn not only about the problems, but also the opportunities concerning web publishing. They organize the trainings and conferences together with us, as well as they help in preparing the audio versions ob books (so called audiobooks). We are also able to issue voluneering contracts and certificates regarding sort and duration of volunteer's work for our foundation. The traineeships, proofreading and copywriting practice as well as the certificates confirming those may be found vital in acquiring professional qualifications and promotion. .

    \r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n

    What else is there to be done?

    \r\n \r\n

    Preparing the reading for publishing demands the most effort. One has to correct the typos nad other errors of this kind in the texts we receive from the National Library. Next, one needs to provide the book with the annotations, at the same time bearing in mind that our offering is addressed to the pupils, for whom many words and collocations may sound out of date. The older editions (the rule is determined by copyrights) are subject to essential lingustic modernisations, i.e. in spelling or inflection but we pay attention to not to violate the artistic specifity of the literary works. The last stage of the preparation is searching for literary motfis and themes, so the text is examined thoroughly. In each and every phase we are supported by the volunteers - teachers and students - who often advise us point out crucial matters as we take important decisions.

    \r\n \r\n\r\n\r\n\r\n\r\n\r\n

    How to contact us?

    \r\n \r\n

    We ask every interested person to send us an e-mail: fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    Please, visit also the editorial website of Wolne Lektury. There you will find essential information on how to involve yourself in editorial works.

    \r\n\r\n", + "title_pl": "Mo\u017cesz nam pom\u00f3c", + "title_ru": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c", + "page_title_ru": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c \u0432 WolneLektury.pl" + } + }, + { + "pk": 1, + "model": "infopages.infopage", + "fields": { + "title_de": "Volontariat f\u00fcr Wissen", + "page_title": "Volunteering for knowledge on WolneLektury.pl", + "left_column_uk": "

    \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e

    \r\n

    \r\n \u0411\u0456\u043e\u0433\u0440\u0430\u043c\u0438 \u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u0438\u043a\u0456\u0432 \u0442\u0430 \u0434\u0435\u0444\u0456\u043d\u0456\u0446\u0456\u0457 \u0435\u043f\u043e\u0445 \u0442\u0430 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0445 \u0436\u0430\u043d\u0440\u0456\u0432 \u0432 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u0446\u0456 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0456 \u0443\u0447\u043d\u044f\u043c\u0438 \u0447\u043e\u0442\u0438\u0440\u044c\u043e\u0445 \u0448\u043a\u0456\u043b \u043f\u0456\u0434\u0447\u0430\u0441 \u043c\u0430\u0439\u0441\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0456\u0432 \u201c\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432 \u043e\u0441\u0432\u0456\u0442\u0456\u201d.\r\n

    \r\n\r\n

    \r\n \u0423\u0447\u043d\u0456 \u0441\u043f\u0456\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0446\u044e\u0432\u0430\u043b\u0438 \u0432\u0456\u0434 \u0434\u043e\u0433\u043b\u044f\u0434\u043e\u043c \u0432\u0447\u0438\u0442\u0435\u043b\u0456\u0432 \u0442\u0430 \u0441\u043f\u0435\u0446\u0456\u0430\u043b\u0456\u0441\u0442\u0456\u0432 \u2014 \u043b\u0456\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0437\u043d\u0430\u0432\u0446\u0456\u0432 \u043d\u0430 \r\n\r\n \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u0432\u0456\u0439 \u0432\u0456\u043a\u0456-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0456\r\n \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0456\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u044e\r\n 2ia. \u0420\u043e\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0446\u0438\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0431\u0443\u043b\u0430 \u0432\u043e\u0434\u043d\u043e\u0447\u0430\u0441 \u043d\u0430\u0443\u043a\u043e\u044e \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u043e\u043c \u0442\u0430 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u0448\u0443\u043a\u0443 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457, \u0430 \u0442\u0430\u043a\u043e\u0436 \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u043a\u0438 \u0457\u0457 \u0432\u0456\u0440\u043e\u0433\u0456\u0434\u043d\u043e\u0441\u0442\u0456.\r\n

    \r\n\r\n

    \r\n \u041f\u0440\u043e\u0435\u043a\u0442 \"\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432 \u043e\u0441\u0432\u0456\u0442\u0456\" \u0437\u0434\u0456\u0439\u0441\u043d\u0435\u043d\u043e \u0437\u0430\u0432\u0434\u044f\u043a\u0438 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0446\u0456 \r\n \r\n \u041c\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0430 \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0457 \u043e\u0441\u0432\u0456\u0442\u0438. \u041f\u0440\u0438\u0437\u0438 \u0434\u043b\u044f \u0443\u0447\u043d\u0456\u0432 \u043f\u0440\u0438\u0433\u043e\u0442\u0443\u0432\u0430\u043b\u0438 \r\n\r\n \u0412\u0438\u0434\u0430\u0432\u043d\u0438\u0446\u0442\u0432\u043e Nasza Ksi\u0119garnia\r\n \u0442\u0430\r\n \u0412\u0438\u0434\u0430\u0432\u043d\u0438\u0446\u0442\u0432\u043e Helion. \u0422\u0435\u043a\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043d\u043e \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0456 \r\n Plagiat.pl.\r\n

    \r\n\r\n

    \r\n \u0417\u0432\u0456\u0442 \u0437 \u0440\u0435\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u0457 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \"\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432 \u043e\u0441\u0432\u0456\u0442\u0456\".\r\n

    \r\n\r\n

    \r\n \r\n \r\n \r\n \r\n \r\n

    ", + "right_column_pl": "\t

    Autorzy

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\t

      \r\n\t\t\t\tGimnazjum nr 40 z Oddzia\u0142ami Integracyjnymi w Zespole\r\n\t\t\t\tSzk\u00f3\u0142 nr 69 im. Armii Krajowej Grupy Bojowej \u201eKRYBAR\u201d,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; klasa druga pod opiek\u0105\r\n\t\t\t\tAnny Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Liceum Og\u00f3lnokszta\u0142c\u0105ce im. Miko\u0142aja Kopernika,\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; klasa pierwsza o profilu\r\n\t\t\t\tbiologiczno-chemicznym pod opiek\u0105 El\u017cbiety Konkowskiej:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\tAutorskie Niepubliczne Liceum Og\u00f3lnokszta\u0142c\u0105ce nr\r\n\t\t\t\t\t42, ul. Iwicka 47 B, 00-735 Warszawa; klasa pierwsza\r\n\t\t\t\t\to profilu og\u00f3lnym pod opiek\u0105 Micha\u0142a Friedricha:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV Liceum Og\u00f3lnokszta\u0142c\u0105ce im. St. I. Witkiewicza,\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; klasa pierwsza o\r\n\t\t\t\t\tprofilu og\u00f3lnym pod opiek\u0105 Daniela Zycha:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    \r\n", + "page_title_en": "Volunteering for knowledge on WolneLektury.pl", + "page_title_es": "Voluntariado para el conocimiento en WolneLektury.pl", + "left_column_lt": "

    Savanoriai

    \r\n\t

    \r\n\t\tAutoriu biografijos ir literat\u016brinis r\u016b\u0161i\u0173 apra\u0161ymus \r\n\t\tinternetineje bibliotekoje Laisvoji Literatura paruo\u0161e mokiniai\r\n\t\ti\u0161 keturi\u0173 mokykl\u0173 seminarijos \u201eLik savanoriu kad su\u017einoti daugiau\u201d.\r\n\t

    \r\n\r\n\t

    \r\n\t\tMokiniai dirbo visi kartu globojami mokytoj\u0173 ir literaturos \u017einov\u0173.\r\n\t\t\r\n\r\n\t\t\tinternetine platforma viki\r\n\t\tparuo\u0161ta grup\u0117s\r\n\t\t2ia. Kuriant apra\u0161ymus naudojo kompiuterius, internet\u0105 tamkad\r\n\t\t surasti informacij\u0105 ir patikrinti jos tik\u0117tingum\u0105.\r\n\t

    \r\n\r\n\t

    \r\n\t\tProjektas \"Lik savanoriu kad su\u017einoti daugiau\" buvo \u012fvykdytas\r\n\t\t d\u0117ka\r\n\t\t\r\n\t\t\tMinisterstwa Edukacji Narodowej. Dovanas mokiniams \u012fsteig\u0117\r\n\t\t\r\n\r\n\t\t\tLeidykla M\u016bs\u016b Knygynas\r\n\t\ti\r\n\t\tWydawnictwo Helion. Patikrinta servise.\r\n\t\t\r\n\t\t\tPlagiat.pl.\r\n\t

    \r\n\r\n\t

    \r\n\t\tRaportas suristas su \u012fgyvendinimu projekto \u201eLik savanoriu kad su\u017einoti daugiau\".\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    \r\n", + "title_fr": "B\u00e9n\u00e9volat pour le savoir", + "right_column_ru": "\t

    \u0410\u0432\u0442\u043e\u0440\u044b

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\t

      \r\n\t\t\t\t\u0413\u0438\u043c\u043d\u0430\u0437\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 40 \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0435\r\n\t\t\t\t\u0448\u043a\u043e\u043b \u043d\u043e\u043c\u0435\u0440 69 \u0438\u043c. \u0410\u0440\u0438\u043c\u0438\u0438 \u043a\u0440\u0430\u0439\u043e\u0432\u043e\u0439 \u0431\u043e\u0435\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u201eKRYBAR\u201d,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c\r\n\t\t\t\tAnny Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII \u041e\u0431\u0449\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u0439 \u0438\u043c. \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u041a\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0430,\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u0438\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e-\u0445\u0438\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\r\n\t\t\t\t\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c El\u017cbiety Konkowskiej:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\t\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0439 \u043d\u0435\u043f\u0443\u0431\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0431\u0449\u0435\u043e\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u0439 \u043d\u043e\u043c\u0435\u0440\r\n\t\t\t\t\t42, ul. Iwicka 47 B, 00-735 Warszawa;\u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\r\n\t\t\t\t\t\u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c Micha\u0142a Friedricha:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV \u041e\u0431\u0449\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u0439 \u0438\u043c. \u0421. \u0418. \u0412\u0438\u0442\u043a\u0435\u0432\u0438\u0447\u0430,\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\r\n\t\t\t\t\t\u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c Daniela Zycha:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    ", + "left_column_fr": "

    B\u00e9n\u00e9volat

    \r\n\t

    \r\n\t\tLes histoires de vie des auteurs ainsi que les d\u00e9finitions des \u00e9poques et genres litt\u00e9raires dans la biblioth\u00e8que en ligne Lectures libres ont \u00e9t\u00e9 \u00e9crites par les \u00e9l\u00e8ves des quatre \u00e9coles pendant les ateliers \"B\u00e9n\u00e9volat pour le savoir\"\r\n\t

    \r\n\r\n\t

    \r\n\t\tLes \u00e9l\u00e8ves ont travaill\u00e9 ensemble sous la supervision des professeurs et sp\u00e9cialistes \u2013 hommes des lettres sur\r\n\t\t\r\n\r\n\t\tune platforme en ligne wiki\r\n\t\tmise en place par l'\u00e9quipe\r\n\t\t2ia. Le travail sur les fiches comprenait aussi la ma\u00eetrise de l'ordinateur et de l'internet pour chercher des informations, ainsi que pour v\u00e9rifier leur fiabilit\u00e9.\r\n\t

    \r\n\r\n\t

    \r\n\t\tLe projet \"B\u00e9n\u00e9volat pour le savoir\" a \u00e9t\u00e9 r\u00e9alis\u00e9 gr\u00e2ce \u00e0 l'appui \t\r\n\t\tdu Minist\u00e8re de l'Education nationale\t. Des r\u00e9compenses pour les \u00e9l\u00e8ves ont \u00e9t\u00e9 fond\u00e9es par \r\n\r\n\t\t\tla Maison d'\u00e9dition Nasza Ksi\u0119garnia\r\n\t\tet\r\n\t\tla Maison d'\u00e9dition Helion. Les fiches ont \u00e9t\u00e9 v\u00e9rifi\u00e9es sur le site\r\n\t\t\r\n\t\t\tPlagiat.pl.\r\n\t

    \r\n\r\n\t

    \r\n\t\t Le rapport sur la r\u00e9alisation du projet \"B\u00e9n\u00e9volat pour le savoir\"\r\n.\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    ", + "title": "Volunteering for knowledge", + "title_lt": "Lik savanoriu kad su\u009einoti daugiau", + "right_column": "

    Authors

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\tGimnazjum nr 40 z Oddzia\u0142ami Integracyjnymi w Zespole\r\n\t\t\t\tSzk\u00f3\u0142 nr 69 im. Armii Krajowej Grupy Bojowej \u201eKRYBAR\u201d,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; second form attented by\t\t\t\tAnna Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Liceum Og\u00f3lnokszta\u0142c\u0105ce im. Miko\u0142aja Kopernika,\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; first year, biologyoriented class attented by El\u017cbieta Konkowskiej:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\tAutorskie Niepubliczne Liceum Og\u00f3lnokszta\u0142c\u0105ce nr\r\n\t\t\t\t\t42, ul. Iwicka 47 B, 00-735 Warszawa; first year, general education class attented by Micha\u0142 Friedrich:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV Liceum Og\u00f3lnokszta\u0142c\u0105ce im. St. I. Witkiewicza,\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; first year, general education class attented by Daniel Zych:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    ", + "right_column_es": "\t

    Autores

    \r\n\r\n\r\n\r\n\t
      \r\n\r\n\t\t
    1. \r\n\r\n\t\t\t

      \r\n\r\n\t\t\t\tGimnazjum nr 40 z Oddzia\u0142ami Integracyjnymi w Zespole\r\n\r\n\t\t\t\tSzk\u00f3\u0142 nr 69 im. Armii Krajowej Grupy Bojowej \u201eKRYBAR\u201d,\r\n\r\n\t\t\t\tC/ Drewniana 8, 00-345 Varsovia; segundo curso bajo la supervisi\u00f3n de\r\n\r\n\t\t\t\tAnna Budziarek-Friedrich:\r\n\r\n\t\t\t

      \r\n\r\n\r\n\r\n\t\t\t
        \r\n\r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\r\n\t\t\t
      \r\n\r\n\t\t
    2. \r\n\r\n\r\n\r\n\t\t
    3. \r\n\r\n\t\t\t

      \r\n\r\n\t\t\t\tXXXIII Liceum Og\u00f3lnokszta\u0142c\u0105ce im. Miko\u0142aja Kopernika,\r\n\r\n\t\t\t\tC/ Bema 76, 01-225 Varsovia; primer curso de perfil biol\u00f3gico-qu\u00edmico bajo la supervisi\u00f3n de El\u017cbieta Konkowska:\r\n\r\n\t\t\t

      \r\n\r\n\r\n\r\n\t\t\t
        \r\n\r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\r\n\t\t\t
      \r\n\r\n\t\t\t
    4. \r\n\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t\tAutorskie Niepubliczne Liceum Og\u00f3lnokszta\u0142c\u0105ce nr\r\n\r\n\t\t\t\t\t42, C/ Iwicka 47 B, 00-735 Varsovia; primer curso\r\n\r\n\t\t\t\t\tbajo la supervisi\u00f3n de Micha\u0142 Friedrich:\r\n\r\n\t\t\t\t

      \r\n\r\n\r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\r\n\t\t\t\t
      \r\n\r\n\t\t\t
    5. \r\n\r\n\t\t\t
    6. \r\n\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t\tLXIV Liceum Og\u00f3lnokszta\u0142c\u0105ce im. St. I. Witkiewicza,\r\n\r\n\t\t\t\t\tC/ Elbl\u0105ska 51, 01-737 Varsovia; primer curso bajo la supervisi\u00f3n de Daniel Zych:\r\n\r\n\t\t\t\t

      \r\n\r\n\r\n\r\n\t\t\t\t
        \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\r\n\t\t\t\t
      \r\n\r\n\t\t\t
    7. \r\n\r\n\t \r\n\r\n\t
    ", + "right_column_en": "

    Authors

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\tGimnazjum nr 40 z Oddzia\u0142ami Integracyjnymi w Zespole\r\n\t\t\t\tSzk\u00f3\u0142 nr 69 im. Armii Krajowej Grupy Bojowej \u201eKRYBAR\u201d,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; second form attented by\t\t\t\tAnna Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Liceum Og\u00f3lnokszta\u0142c\u0105ce im. Miko\u0142aja Kopernika,\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; first year, biologyoriented class attented by El\u017cbieta Konkowskiej:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\tAutorskie Niepubliczne Liceum Og\u00f3lnokszta\u0142c\u0105ce nr\r\n\t\t\t\t\t42, ul. Iwicka 47 B, 00-735 Warszawa; first year, general education class attented by Micha\u0142 Friedrich:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV Liceum Og\u00f3lnokszta\u0142c\u0105ce im. St. I. Witkiewicza,\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; first year, general education class attented by Daniel Zych:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    ", + "left_column_de": "

    Volontariat

    \r\n\t

    \r\n\t\tSchriftsteller-Biographien und Definitionen von Epochen und Literaturgattungen\r\n in der Internetbibliothek Freie Lekt\u00fcren haben unsere Sch\u00fcler aus vier\r\n Schulen w\u00e4hrend Workshops \"Volontariat f\u00fcr Wissen\" geschrieben.\r\n\t

    \r\n\r\n\t

    \r\n\t\tDie Sch\u00fcler haben gemeinsam unter Aufsicht der Lehrer\r\n\t\tund Spezialisten -Literaturwissenschaftler - gearbeitet\r\n\t\t\r\n\r\n\t\t\tauf \"wiki\" Internetplattform\r\n\t\tvorbereitet von unserem Team\r\n\t\t2ia. Der Einsatz von Computer und Internet wurde\r\n\t\t- w\u00e4hrend der Arbeiten an Noten - f\u00fcr die Informationssuche und Informationspr\u00fcfung genutzt\r\n\t\tund gleichzeitig als notwendiges Werkzeug in den Lernprozess einbezogen.\r\n\t

    \r\n \r\n\t

    \r\n\t\tDas Projekt \"Volontariat f\u00fcr Wissen\" wurde dank der Unterst\u00fctzung umgesetzt, von\r\n\t\t\r\n\t\t\tMinisterium f\u00fcr Bildung. Preise f\u00fcr Sch\u00fcler spendeten\r\n\t\t\r\n\r\n\t\t\tVerlag unsere Buchhandlung\r\n\t\tund\r\n\t\tWydawnictwo Helion. Noten wurden im Service verifiziert\r\n\t\t\r\n\t\t\tPlagiat.pl.\r\n\t

    \r\n\r\n\t

    \r\n\t\tder Bericht \u00fcber das Projekt \"Volontariat f\u00fcr Wissen\".\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    \r\n", + "title_uk": "\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432 \u043e\u0441\u0432\u0456\u0442\u0456", + "right_column_fr": "\t

    Auteurs

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\t

      \r\n\t\t\t\tColl\u00e8ge no. 40 avec classes d'int\u00e9gration dans l'Ensemble Scolaire no. 69 de Armia Krajowa Grupa Bojowa \u201eKRYBAR\u201d,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; classe seconde sous la supervision de\r\n\tAnna Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Lyc\u00e9e g\u00e9n\u00e9ral de Miko\u0142aj Kopernik,\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; classe premi\u00e8re, orientation biologie-chimique\r\n sous la supervision de El\u017cbieta Konkowska:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLyc\u00e9e priv\u00e9 g\u00e9n\u00e9ral no. 42, ul. Iwicka 47 B, 00-735 Warszawa; classe premi\u00e8re, orientation g\u00e9n\u00e9rale, sous la supervision de Micha\u0142 Friedrich:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV Lyc\u00e9e g\u00e9n\u00e9ral de St. I. Witkiewicz,\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; classe premi\u00e8re, orientation g\u00e9n\u00e9rale, sous la supervision de Daniel Zych:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    \r\n", + "left_column": "

    Volunteers

    \r\n\t

    Writers' biographical entries as well as periods' and genres'\r\ndefinitions placed on web library Wolne Lektury were written by students from four schools during \"Wolontariat dla wiedzy\" (\"Volunteering for knowledge\") workshops.

    \r\n The students worked together under the factual guidance of teachers and specialists - literary scholars\r\n\r\n\ton wiki platform\r\n prepared by 2ia team. At the same time the students learnt how to use a computer and the Internet while searching for necessary information how to verify the credibility of the source.

    \r\n\r\n

    \r\n\"Wolontariat dla wiedzy\" project was realised thanks to the support of \r\nMinisterstwo Edukacji Narodowej. The rewards for the student were funded by\r\n\r\nWydawnictwo Nasza Ksi\u0119garnia\r\nandWydawnictwo Helion. Each entry was verified on \r\nPlagiat.pl website.\r\n

    \r\n\r\n

    \r\n\t\tReport on completion of \"Wolontariat dla wiedzy\" project (PL).\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    ", + "right_column_uk": "

    \u0410\u0432\u0442\u043e\u0440\u0438

    \r\n\r\n
      \r\n
    1. \r\n

      \r\n \u0413\u0456\u043c\u043d\u0430\u0437\u0456\u044f \u211640 \u0437 \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0439\u043d\u0438\u043c\u0438 \u0432\u0456\u0434\u0434\u0456\u043b\u0430\u043c\u0438 \u0432 \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0456 \u0448\u043a\u0456\u043b \u2116 69 \u0456\u043c\u0435\u043d\u0456 \u0410\u0440\u043c\u0456\u0457 \u041a\u0440\u0430\u0439\u043e\u0432\u043e\u0457 \u0411\u043e\u0439\u043e\u0432\u043e\u0457 \u0413\u0440\u0443\u043f\u0438 \u201c\u041a\u0420\u0418\u0411\u0410\u0420\u201d,\r\n \u0432\u0443\u043b. \u0414\u0440\u0435\u0432\u043d\u044f\u043d\u0430 8, 00-345 \u0412\u0430\u0440\u0448\u0430\u0432\u0430; \u0434\u0440\u0443\u0433\u0438\u0439 \u043a\u043b\u0430\u0441 \u043f\u0456\u0434 \u043e\u043f\u0456\u043a\u043e\u044e \u0410\u043d\u043d\u0438 \u0411\u0443\u0434\u0437\u044f\u0440\u0435\u043a-\u0424\u0440\u0456\u0434\u0440\u0456\u0445:\r\n

      \r\n\r\n
        \r\n
      • \u0411\u0443\u0440\u0434\u043e\u043d \u0424\u0456\u043b\u0456\u043f;
      • \r\n\r\n
      • \u0414\u0435\u043c\u0431\u0441\u044c\u043a\u0456 \u0411\u0430\u0440\u0442\u0435\u043a;
      • \r\n
      • \u042f\u0446\u043a\u043e\u0432\u0456\u0447 \u041a\u0430\u043c\u0456\u043b;
      • \r\n
      • \u041a\u0443\u0440\u0435\u043a \u041f\u0430\u0432\u0435\u043b;
      • \r\n
      • \u041c\u0430\u043a\u043b\u0435\u0441 \u0411\u0430\u0440\u0442\u043e\u0448;
      • \r\n
      • \u041c\u0430\u0440\u043a\u0435\u0432\u0456\u0447 \u0404\u0440\u0435\u043c\u044f\u0448;
      • \r\n
      • \u041c\u0456\u0433\u0434\u0430\u043b \u041a\u0430\u0442\u0430\u0436\u0438\u043d\u0430;
      • \r\n\r\n
      • \u041c\u0456\u043e\u0434\u0443\u0448\u0435\u0432\u0441\u044c\u043a\u0456 \u041c\u0456\u0445\u0430\u043b;
      • \r\n
      • \u0424\u0430\u0439\u0444\u0435\u0440 \u0406\u0434\u0430;
      • \r\n
      • \u041f\u043b\u0430\u0441\u043a\u043e\u0432\u0456\u0446\u044c\u043a\u0430 \u041a\u0430\u0440\u043e\u043b\u0456\u043d\u0430;
      • \r\n
      • \u0421\u0430\u0439\u043b\u0435\u0440 \u0415\u0432\u0430.
      • \r\n
      \r\n
    2. \r\n\r\n
    3. \r\n

      \r\n XXXIII \u0417\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u043e\u0441\u0432\u0456\u0442\u043d\u0438\u0439 \u043b\u0456\u0446\u0435\u0439 \u0456\u043c\u0435\u043d\u0456 \u041c\u0438\u043a\u043e\u043b\u0430\u044f \u041a\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0430,\r\n \u0432\u0443\u043b. \u0411\u0435\u043c\u0430 76, 01-225 \u0412\u0430\u0440\u0448\u0430\u0432\u0430; \u043f\u0435\u0440\u0448\u0438\u0439 \u043a\u043b\u0430\u0441 \u0431\u0456\u043e\u043b\u043e\u0433\u0456\u0447\u043d\u043e-\u0445\u0456\u043c\u0456\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0456\u043b\u044e \u043f\u0456\u0434 \u043e\u043f\u0456\u043a\u043e\u044e \u0415\u043b\u044c\u0436\u0431\u0454\u0442\u0438 \u041a\u043e\u043d\u043a\u043e\u0432\u0441\u044c\u043a\u043e\u0457 :\r\n

      \r\n\r\n
        \r\n
      • \u0425\u0432\u0456\u043b \u0411\u0430\u0440\u0442\u043b\u043e\u043c\u0454\u0439;
      • \r\n
      • \u0427\u0430\u0440\u043d\u0435\u0446\u044c\u043a\u0430 \u041d\u0430\u0442\u0430\u043b\u0456\u044f ;
      • \r\n
      • \u0490\u0430\u0432\u0440\u043e\u043d\u0441\u044c\u043a\u0430 \u0406\u0491\u0430 ;
      • \r\n\r\n
      • \u0490\u0440\u0430\u0431\u0430\u0440\u0447\u0438\u043a \u041c\u0430\u0440\u0442\u0430;
      • \r\n
      • \u042f\u0430\u0441\u0442\u0436\u043e\u043c\u0431 \u041a\u0430\u0442\u0430\u0436\u0438\u043d\u0430;
      • \r\n
      • \u041a\u0440\u0430\u0432\u0447\u0430\u043a \u041e\u043b\u044c\u0433\u0430;
      • \r\n
      • \u041a\u0440\u0430\u0432\u0447\u0438\u043a \u041c\u0430\u0440\u0456\u0430\u043d\u043d\u0430 ;
      • \r\n
      • \u041a\u0443\u0440 \u041d\u0430\u0442\u0430\u043b\u0456\u044f;
      • \r\n
      • \u041a\u0432\u044f\u0442\u0435\u043a \u041c\u0430\u0440\u0442\u0430;
      • \r\n\r\n
      • \u041b\u0430\u0441\u044c\u043a\u0435\u0432\u0438\u0447 \u0419\u043e\u0430\u043d\u043d\u0430;
      • \r\n
      • \u041c\u0430\u0445\u0447\u0438\u043d\u0441\u044c\u043a\u0430 \u0414\u0430\u0440\u0456\u044f;
      • \r\n
      • \u041c\u0454\u0447\u043d\u0456\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u0406\u0437\u0430\u0431\u0435\u043b\u044f;
      • \r\n
      • \u041c\u043e\u0447\u0443\u043b\u0441\u044c\u043a\u0430 \u041a\u0430\u0440\u043e\u043b\u0456\u043d\u0430;
      • \r\n
      • \u041c\u043e\u0441\u044c\u0446\u0456\u0446\u043a\u0430 \u0410\u043d\u0435\u0442\u0430;
      • \r\n
      • \u041d\u0430\u0440\u043b\u043e\u0445 \u0421\u0430\u0431\u0456\u043d\u0430;
      • \r\n\r\n
      • \u041f\u0448\u0438\u0431\u0438\u0448 \u041f\u0430\u0432\u0435\u043b;
      • \r\n
      • \u041f\u0443\u0445\u0442\u0430 \u041c\u0430\u0440\u0435\u043a;
      • \r\n
      • \u0420\u0438\u0441\u043a\u0430 \u0426\u0435\u0437\u0430\u0440\u0438;
      • \r\n
      • \u0421\u0430\u043d\u0434\u043e\u043c\u0454\u0440\u0441\u044c\u043a\u0456 \u0411\u0430\u0440\u043b\u043e\u043c\u0454\u0439;
      • \r\n
      • \u0421\u043b\u0430\u0432\u0456\u043d\u0441\u044c\u043a\u0456 \u0422\u043e\u043c\u0430\u0448;
      • \r\n
      • \u0421\u043b\u043e\u0432\u0456\u043a \u041e\u043b\u044c\u0433\u0430;
      • \r\n\r\n
      • \u0421\u0442\u0430\u0436\u0438\u0446\u044c\u043a\u0430 \u041a\u0430\u0442\u0430\u0436\u0438\u043d\u0430;
      • \r\n
      • \u0421\u0442\u0436\u0435\u043b\u0447\u0430\u043a \u041a\u0430\u0440\u043e\u043b\u0456\u043d\u0430;
      • \r\n
      • \u0428\u0430\u0444\u0440\u0430\u043d \u0414\u0430\u043d\u0443\u0442\u0430;
      • \r\n
      • \u0428\u043c\u0456\u0491\u0454\u043b\u044c\u0441\u044c\u043a\u0430 \u041c\u0430\u0491\u0434\u0430\u043b\u0435\u043d\u0430;
      • \r\n
      • \u0428\u0443\u043b\u043a\u043e\u0432\u0430\u0441\u044c\u043a\u0430 \u0410\u043b\u0456\u0446\u0456\u044f;
      • \r\n
      • \u0421\u044c\u043b\u0443\u0441\u0430\u0440\u0447\u0438\u043a \u0410\u043d\u043d\u0430;
      • \r\n\r\n
      • \u0422\u0438\u0442\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u0410\u043d\u043d\u0430.
      • \r\n
      \r\n
    4. \r\n

      \r\n \u0410\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u041d\u0435\u043f\u0443\u0431\u043b\u0456\u0447\u043d\u0438\u0439 \u0417\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u043e\u0441\u0432\u0456\u0442\u043d\u0456\u0439 \u041b\u0456\u0446\u0435\u0439 \u2116 42, \u0432\u0443\u043b. \u0406\u0432\u0456\u0446\u044c\u043a\u0430 47 B, 00-735 \u0412\u0430\u0440\u0448\u0430\u0432\u0430; \u043f\u0435\u0440\u0448\u0438\u0439 \u043a\u043b\u0430\u0441 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0456\u043b\u044e \u043f\u0456\u0434 \u043e\u043f\u0456\u043a\u043e\u044e \u041c\u0456\u0445\u0430\u043b\u0430 \u0424\u0440\u0456\u0434\u0440\u0456\u0445\u0430:\r\n

      \r\n\r\n
        \r\n
      • \u0411\u0430\u0440\u0430\u043d\u0454\u0446\u044c\u043a\u0430 \u041c\u0430\u0440\u0442\u0430;
      • \r\n\r\n
      • \u0490\u043e\u043b\u0430\u0448\u0435\u0432\u0441\u044c\u043a\u0430 \u0415\u0432\u0430;
      • \r\n
      • \u041a\u0432\u044f\u0442\u043a\u043e\u0432\u0441\u044c\u043a\u0456 \u041c\u0456\u0445\u0430\u043b;
      • \r\n
      • \u041c\u0430\u0445\u043d\u0456\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u041c\u043e\u043d\u0456\u043a\u0430;
      • \r\n
      • \u041f\u0454\u0442\u0436\u0430\u043a \u0411\u0430\u0440\u0442\u043e\u0448;
      • \r\n
      • \u041f\u0448\u0435\u0441\u043f\u043e\u043b\u0435\u0432\u0441\u044c\u043a\u0456 \u041f\u0448\u0435\u043c\u0438\u0441\u043b\u0430\u0432;
      • \r\n
      • \u0420\u043e\u0441\u0456\u043d\u0441\u044c\u043a\u0430 \u0417\u0443\u0437\u0430\u043d\u043d\u0430;
      • \r\n\r\n
      • \u0421\u0456\u0431\u0456\u0491\u0430 \u041c\u0430\u0491\u0434\u0430\u043b\u0435\u043d\u0430.
      • \r\n
      \r\n
    5. \r\n
    6. \r\n

      \r\n LXIV \u0417\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u043e\u0441\u0432\u0456\u0442\u043d\u0456\u0439 \u041b\u0456\u0446\u0435\u0439 \u0456\u043c\u0435\u043d\u0456 \u0421\u0442.\u0406. \u0412\u0456\u0442\u043a\u0454\u0432\u0456\u0447\u0430,\r\n \u0432\u0443\u043b. \u0415\u043b\u044c\u0431\u043b\u043e\u043d\u0437\u044c\u043a\u0430 51, 01-737 \u0412\u0430\u0440\u0448\u0430\u0432\u0430; \u043f\u0435\u0440\u0448\u0438\u0439 \u043a\u043b\u0430\u0441 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0456\u043b\u044e \u043f\u0456\u0434 \u043e\u043f\u0456\u043a\u043e\u044e \u0414\u0430\u043d\u0454\u043b\u0430 \u0417\u0438\u0445\u0430:\r\n

      \r\n\r\n
        \r\n\r\n
      • \u0410\u043d\u0434\u0436\u0435\u0439\u0447\u0430\u043a \u041a\u0430\u043c\u0456\u043b;
      • \r\n
      • \u0427\u0443\u0431\u0430\u0439 \u041a\u043e\u043d\u0440\u0430\u0434;
      • \r\n
      • \u0414\u0440\u043e\u043d\u0491\u043e\u0432\u0441\u044c\u043a\u0430 \u041a\u0430\u0442\u0430\u0436\u0438\u043d\u0430;
      • \r\n
      • \u0490\u0430\u0454\u0432\u0441\u044c\u043a\u0430 \u041c\u0430\u0491\u0434\u0430\u043b\u0435\u043d\u0430;
      • \r\n
      • \u0490\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0456 \u042f\u043d;
      • \r\n
      • \u0490\u0440\u0430\u0434 \u041f\u0430\u0432\u0435\u043b;
      • \r\n\r\n
      • \u0413\u043d\u0430\u0442\u043e\u0432\u0441\u044c\u043a\u0456 \u0411\u0430\u0440\u0442\u0435\u043a;
      • \r\n
      • \u041a\u0430\u0440\u0432\u043e\u0432\u0441\u044c\u043a\u0456 \u041c\u0430\u0440\u0446\u0456\u043d;
      • \r\n
      • \u041a\u043b\u043e\u0441 \u0410\u043d\u0435\u0442\u0430;
      • \r\n
      • \u041a\u043e\u0437\u0454\u043b \u0411\u0430\u0440\u0431\u0430\u0440\u0430;
      • \r\n
      • \u041a\u043e\u0437\u043b\u043e\u0432\u0441\u044c\u043a\u0430 \u0410\u043d\u043d\u0430;
      • \r\n
      • \u041a\u0440\u0443\u0491 \u041f\u0430\u043c\u0435\u043b\u0430;
      • \r\n\r\n
      • \u041a\u0436\u043e\u0441\u0435\u043a \u042f\u043a\u0443\u0431;
      • \r\n
      • \u041b\u0443\u0431\u0430\u0441\u044c \u041c\u0456\u0445\u0430\u043b;
      • \r\n
      • \u041c\u0430\u0441\u0435\u0432\u0456\u0447 \u041d\u0430\u0442\u0430\u043b\u0456\u044f;
      • \r\n
      • \u041c\u0430\u0441\u0442\u0430\u043b\u0435\u0436 \u0410\u0491\u043d\u0454\u0448\u043a\u0430;
      • \r\n
      • \u041c\u043e\u0434\u0435\u043b\u044c\u0441\u044c\u043a\u0430 \u041c\u0430\u0440\u0442\u0430;
      • \r\n
      • \u041d\u043e\u0432\u0430\u043a \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430;
      • \r\n\r\n
      • \u041f\u0430\u0431\u044f\u043d \u0410\u0491\u043d\u0454\u0448\u043a\u0430;
      • \r\n
      • \u041f\u0430\u0448\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430;
      • \r\n
      • \u041f\u0454\u043b\u0430\u0442 \u0417\u043e\u0444\u0456\u044f;
      • \r\n
      • \u041f\u043e\u043d\u0454\u0446\u044c\u043a\u0430 \u0410\u0491\u043d\u0454\u0448\u043a\u0430;
      • \r\n
      • \u041f\u0438\u0442\u043b\u0430\u043a \u0423\u0440\u0448\u0443\u043b\u044f;
      • \r\n
      • \u0420\u043e\u0441\u0430 \u041a\u0430\u0440\u043e\u043b\u0456\u043d\u0430;
      • \r\n\r\n
      • \u0421\u043c\u0447\u0438\u043d\u0441\u044c\u043a\u0430 \u041a\u0430\u043c\u0456\u043b\u044f;
      • \r\n
      • \u0421\u0442\u043e\u043b\u0456\u043d\u0441\u044c\u043a\u0430 \u0411\u0430\u0440\u0431\u0430\u0440\u0430;
      • \r\n
      • \u0428\u0438\u043c\u0430\u043d\u0441\u044c\u043a\u0430 \u041a\u0430\u0442\u0430\u0436\u0438\u043d\u0430;
      • \r\n
      • \u0421\u044c\u0446\u0456\u0431\u043e\u0440 \u0415\u0432\u0430;
      • \r\n
      • \u0412\u0456\u0442\u0447\u0430\u043a \u041c\u0430\u0491\u0434\u0430;
      • \r\n
      • \u0412\u0456\u0442\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u042e\u0441\u0442\u0438\u043d\u0430;
      • \r\n\r\n
      • \u0412\u0438\u0436\u0438\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u0419\u043e\u0432\u0456\u0442\u0430;
      • \r\n
      • \u0417\u044e\u043b\u043a\u043e\u0432\u0441\u044c\u043a\u0430 \u0410\u0434\u0440\u0456\u0430\u043d\u043d\u0430.
      • \r\n
      \r\n
    7. \r\n \r\n
    ", + "title_en": "Volunteering for knowledge", + "left_column_pl": "

    Wolontariat

    \r\n\t

    \r\n\t\tBiogramy pisarzy oraz definicje epok i gatunk\u00f3w literackich w\r\n\t\tbibliotece internetowej Wolne Lektury napisali uczniowie\r\n\t\tczterech szk\u00f3\u0142 podczas warsztat\u00f3w \u201eWolontariat dla wiedzy\u201d.\r\n\t

    \r\n\r\n\t

    \r\n\t\tUczniowie pracowali wsp\u00f3lnie pod merytorycznym nadzorem\r\n\t\tnauczycieli i specjalist\u00f3w \u2013 literaturoznawc\u00f3w na\r\n\t\t\r\n\r\n\t\t\tplatformie internetowej wiki\r\n\t\tprzygotowanej przez zesp\u00f3\u0142\r\n\t\t2ia. Praca nad notami by\u0142a jednocze\u015bnie nauk\u0105 wykorzystywania\r\n\t\tkomputer\u00f3w i internetu do wyszukiwania informacji, a tak\u017ce\r\n\t\tweryfikowania ich wiarygodno\u015bci.\r\n\t

    \r\n\r\n\t

    \r\n\t\tProjekt \"Wolontariat dla wiedzy\" zosta\u0142 zrealizowany dzi\u0119ki\r\n\t\twsparciu\r\n\t\t\r\n\t\t\tMinisterstwa Edukacji Narodowej. Nagrody dla uczni\u00f3w ufundowali\r\n\t\t\r\n\r\n\t\t\tWydawnictwo Nasza Ksi\u0119garnia\r\n\t\ti\r\n\t\tWydawnictwo Helion. Noty zweryfikowano w serwisie\r\n\t\t\r\n\t\t\tPlagiat.pl.\r\n\t

    \r\n\r\n\t

    \r\n\t\tRaport z realizacji projektu \u201eWolontariat dla wiedzy\".\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    \r\n", + "left_column_ru": "

    \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e

    \r\n\r\n

    \u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u042d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\r\n \u043b\u0438\u0448\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u0448\u0438\u043c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c-\u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c.

    \r\n\r\n \r\n

    \u041c\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0448\u043a\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Wolne Lektury \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u043c\u0438.

    \r\n \r\n

    \u041c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0430\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u043f\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u043e\u0432: \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0438\r\n \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443. \u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438.\r\n \u041e\u043d\u0438, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u043c\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0442 \u0443\u0447\u0435\u0431\u0443 \u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0448\u0430\u043d\u0438\u044f (\u0442.\u043d.\r\n \u0430\u0443\u0434\u0438\u043e\u043a\u043d\u0438\u0433). \u041c\u044b \u0432\u044b\u0434\u0430\u0435\u043c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u044b \u0438 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \r\n \u0438 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u043e\u043c \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \r\n \u0444\u043e\u043d\u0434\u0430. \u0423\u0447\u0435\u0431\u0430, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0438\u0445 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435\r\n \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043b\u0443\u0436\u0431\u0435.

    \r\n\r\n \r\n

    \u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?

    \r\n \r\n

    \u0421\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412 \u0442\u0435\u043a\u0441\u0442\u0430\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043c\u0438 \u0438\u0437 \u041d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \r\n \u0417\u0430\u0442\u0435\u043c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u043e\u0441\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u043e \u043a \u0443\u0447\u0435\u043d\u0438\u043a\u0430\u043c, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432 \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0437\u0432\u0443\u0447\u0438\u0442 \u0430\u043d\u0430\u0445\u0440\u043e\u043d\u0438\u0447\u043d\u043e.\r\n \u041f\u0440\u0435\u0436\u043d\u0438\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u044f (\u0440\u0435\u0436\u0438\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0430) \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440. \u043f\u043e \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u043b\u0438 \u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041f\u0440\u0438\u0447\u0435\u043c, \u043c\u044b \u0437\u0430\u0431\u043e\u0442\u0438\u043c\u0441\u044f \u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438\r\n \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0442\u0438\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \"\u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c\".\r\n \u0412\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0445 \u0441\u0432\u043e\u044e \u043f\u043e\u043c\u043e\u0449\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u043c \u0432\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u044b - \u0443\u0447\u0438\u0442\u0435\u043b\u044f \u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b, \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0438 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f\r\n \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \r\n \r\n

    \u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 \u0444\u043e\u043d\u0434?

    \r\n \r\n

    \u0412\u0441\u0435\u0445 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0438-\u043c\u0435\u0439\u043b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 fundacja@nowoczesnapolska.org.pl.

    \r\n\r\n

    \u041c\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 Wolne Lektury, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043c.

    \r\n", + "right_column_lt": "\t

    Autoriai

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\t

      \r\n\t\t\t\tGimnazija nr 40 Lenkijos Armijos Koviokjan\u010dios Grup\u0117s \u201eKRYBAR\u201d vardo Mokykl\u0173 Kompleksas nr 69,\r\n\t\t\t\tul. Drewniana 8, 00-345 Warszawa; antra klas\u0117 globojama mokytojos\r\n\t\t\t\tAnny Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Miko\u0142ojaus Koperniko Bendrojo Lavinimo Licejus\r\n\t\t\t\tul. Bema 76, 01-225 Warszawa; pirma klas\u0117 biologijos chemijos profiles,\r\n\t\t\t\tglobojama mokytojos El\u017cbiety Konkowskiej:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t \tPrivatus Bendrojo Lavinimo Licejus nr\r\n\t\t\t\t\t42, ul. Iwicka 47 B, 00-735 Warszawa; \r\n\t\t\t\t\tpirma klas\u0117 bendros profiles,\r\n\t\t\t \tglobojama mokytojaus Micha\u0142 Friedrich\r\n\t\t\t\t\t\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV St. I. Witkiewicz Bendrojo Lavinimo Licejus\r\n\t\t\t\t\tul. Elbl\u0105ska 51, 01-737 Warszawa; pirma klas\u0117 bendros profiles,\r\n\t\t\t \tglobojama mokytojaus Daniel Zych:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    \r\n", + "title_es": "Voluntariado para el conocimiento", + "page_title_fr": "B\u00e9n\u00e9volat pour le savoir au WolneLektury.pl", + "page_title_uk": "\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432 \u043e\u0441\u0432\u0456\u0442\u0456 \u0443 WolneLektury.pl", + "page_title_de": "Volontariat f\u00fcr Wissen unter WolneLektury.pl", + "slug": "voluntary_services", + "page_title_lt": "Lik savanoriu LaisvojiLiteratura.lt kad su\u009einoti daugiau", + "right_column_de": "\t

    Autoren

    \r\n\r\n\t
      \r\n\t\t
    1. \r\n\t\t\t

      \r\n\t\t\t\tGymnasium Nr. 40 mit Integrationsabteilungen \r\n\t\t\t\tSchulverbund Nr. 69 Schulname: Armii Krajowej Grupy Bojowej \u201eKRYBAR\u201d, \r\n\t\t\t\tStr. Drewniana 8, 00-345 Warszawa; 2. Klasse\r\n\t\t\t\tKlassenlehrerin: Anna Budziarek-Friedrich:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Burdon Filip;
      • \r\n\r\n\t\t\t\t
      • D\u0119bski Bartek;
      • \r\n\t\t\t\t
      • Jackowicz Kamil;
      • \r\n\t\t\t\t
      • Kurek Pawe\u0142;
      • \r\n\t\t\t\t
      • Makles Bartosz;
      • \r\n\t\t\t\t
      • Markiewicz Jeremiasz;
      • \r\n\t\t\t\t
      • Migda\u0142 Katarzyna;
      • \r\n\r\n\t\t\t\t
      • Mioduszewski Micha\u0142;
      • \r\n\t\t\t\t
      • Pfeiffer Ida;
      • \r\n\t\t\t\t
      • P\u0142askowicka Karolina;
      • \r\n\t\t\t\t
      • Sailer Ewa.
      • \r\n\t\t\t
      \r\n\t\t
    2. \r\n\r\n\t\t
    3. \r\n\t\t\t

      \r\n\t\t\t\tXXXIII Kopernikus Oberschule,\r\n\t\t\t\tStr. Bema 76, 01-225 Warszawa; 1. Klasse; \r\n\t\t\t\tFachbereiche: Biologie-Chemie; Klassenlehrerin: El\u017cbieta Konkowska:\r\n\t\t\t

      \r\n\r\n\t\t\t
        \r\n\t\t\t\t
      • Chwil Bart\u0142omiej;
      • \r\n\t\t\t\t
      • Czarnecka Natalia;
      • \r\n\t\t\t\t
      • Gawro\u0144ska Iga;
      • \r\n\r\n\t\t\t\t
      • Grabarczyk Marta;
      • \r\n\t\t\t\t
      • Jastrz\u0105b Katarzyna;
      • \r\n\t\t\t\t
      • Krawczak Olga;
      • \r\n\t\t\t\t
      • Krawczyk Marianna;
      • \r\n\t\t\t\t
      • Kur Natalia;
      • \r\n\t\t\t\t
      • Kwiatek Marta;
      • \r\n\r\n\t\t\t\t
      • La\u015bkiewicz Joanna;
      • \r\n\t\t\t\t
      • Machczy\u0144ska Daria;
      • \r\n\t\t\t\t
      • Miecznikowska Izabela;
      • \r\n\t\t\t\t
      • Moczulska Karolina;
      • \r\n\t\t\t\t
      • Mo\u015bcicka Aneta;
      • \r\n\t\t\t\t
      • Narloch Sabina;
      • \r\n\r\n\t\t\t\t
      • Przybysz Pawe\u0142;
      • \r\n\t\t\t\t
      • Puchta Marek;
      • \r\n\t\t\t\t
      • Ryska Cezary;
      • \r\n\t\t\t\t
      • Sandomierski Bart\u0142omiej;
      • \r\n\t\t\t\t
      • S\u0142awi\u0144ski Tomasz;
      • \r\n\t\t\t\t
      • S\u0142owik Olga;
      • \r\n\r\n\t\t\t\t
      • Starzycka Katarzyna;
      • \r\n\t\t\t\t
      • Strzelczak Karolina;
      • \r\n\t\t\t\t
      • Szafran Danuta;
      • \r\n\t\t\t\t
      • Szmigielska Magdalena;
      • \r\n\t\t\t\t
      • Szulkowska Alicja;
      • \r\n\t\t\t\t
      • \u015alusarczyk Anna;
      • \r\n\r\n\t\t\t\t
      • Tytkowska Anna.
      • \r\n\t\t\t
      \r\n\t\t\t
    4. \r\n\t\t\t\t

      \r\n\t\t\t\t\tPrivate Oberschule Nr 42,\r\n\t\t\t\t\tStr. Iwicka 47 B, 00-735 Warszawa; 1. Klasse\r\n\t\t\t\t\tFachbereich: Allgemeinbildung; Klassenlehrer: Micha\u0142 Friedrich:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\t\t\t\t\t
      • Baraniecka Marta;
      • \r\n\r\n\t\t\t\t\t
      • Go\u0142aszewska Ewa;
      • \r\n\t\t\t\t\t
      • Kwiatkowski Micha\u0142;
      • \r\n\t\t\t\t\t
      • Machnikowska Monika;
      • \r\n\t\t\t\t\t
      • Pietrzak Bartosz;
      • \r\n\t\t\t\t\t
      • Przespolewski Przemys\u0142aw;
      • \r\n\t\t\t\t\t
      • Rosi\u0144ska Zuzanna;
      • \r\n\r\n\t\t\t\t\t
      • Sibiga Magdalena.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    5. \r\n\t\t\t
    6. \r\n\t\t\t\t

      \r\n\t\t\t\t\tLXIV Witkiewicz Oberschule,\r\n\t\t\t\t\tStr. Elbl\u0105ska 51, 01-737 Warszawa; 1. Klasse, \r\n\t\t\t\t\tFachbereich: Allgemeinbildung; Klassenlehrer: Daniel Zych:\r\n\t\t\t\t

      \r\n\r\n\t\t\t\t
        \r\n\r\n\t\t\t\t\t
      • Andrzejczak Kamil;
      • \r\n\t\t\t\t\t
      • Czubaj Konrad;
      • \r\n\t\t\t\t\t
      • Dr\u0105gowska Katarzyna;
      • \r\n\t\t\t\t\t
      • Gajewska Magdalena;
      • \r\n\t\t\t\t\t
      • G\u0142owacki Jan;
      • \r\n\t\t\t\t\t
      • Grad Pawe\u0142;
      • \r\n\r\n\t\t\t\t\t
      • Hnatowski Bartek;
      • \r\n\t\t\t\t\t
      • Karwowski Marcin;
      • \r\n\t\t\t\t\t
      • K\u0142os Aneta;
      • \r\n\t\t\t\t\t
      • Kozie\u0142 Barbara;
      • \r\n\t\t\t\t\t
      • Koz\u0142owska Anna;
      • \r\n\t\t\t\t\t
      • Krug Pamela;
      • \r\n\r\n\t\t\t\t\t
      • Krzosek Jakub;
      • \r\n\t\t\t\t\t
      • Luba\u015b Micha\u0142;
      • \r\n\t\t\t\t\t
      • Masewicz Natalia;
      • \r\n\t\t\t\t\t
      • Mastalerz Agnieszka;
      • \r\n\t\t\t\t\t
      • Modelska Marta;
      • \r\n\t\t\t\t\t
      • Nowak Aleksandra;
      • \r\n\r\n\t\t\t\t\t
      • Pabian Agnieszka;
      • \r\n\t\t\t\t\t
      • Paszkowska Aleksandra;
      • \r\n\t\t\t\t\t
      • Pielat Zofia;
      • \r\n\t\t\t\t\t
      • Poniecka Agnieszka;
      • \r\n\t\t\t\t\t
      • Pytlak Urszula;
      • \r\n\t\t\t\t\t
      • Rosa Karolina;
      • \r\n\r\n\t\t\t\t\t
      • Smyczy\u0144ska Kamila;
      • \r\n\t\t\t\t\t
      • Stoli\u0144ska Barbara;
      • \r\n\t\t\t\t\t
      • Szyma\u0144ska Katarzyna;
      • \r\n\t\t\t\t\t
      • \u015acibior Ewa;
      • \r\n\t\t\t\t\t
      • Witczak Magda;
      • \r\n\t\t\t\t\t
      • Witkowska Justyna;
      • \r\n\r\n\t\t\t\t\t
      • Wyrzykowska Jowita;
      • \r\n\t\t\t\t\t
      • Zi\u00f3\u0142kowska Adrianna.
      • \r\n\t\t\t\t
      \r\n\t\t\t
    7. \r\n\t \r\n\t
    \r\n", + "page_title_pl": "Wolontariat dla wiedzy w WolneLektury.pl", + "left_column_es": "

    Voluntariado

    \r\n\r\n\t

    \r\n\r\n\t\tBiograf\u00edas de escritores y definiciones de las \u00e9pocas y g\u00e9neros literarios en la biblioteca virtual de Wolne Lektury fueron escritas por estudiantes de cuatro escuelas durante los talleres \u201cVoluntariado para el conocimiento\u201d.

    \r\n\r\n\r\n\r\n\t

    \r\n\r\n\t\tLos estudiantes trabajaron juntos bajo la supervisi\u00f3n de profesores y especialistas-fil\u00f3logos en\r\n\r\n\t\t\r\n\r\n\r\n\r\n\t\t\tla plataforma virtual wiki \r\n\r\n\t\tpreparada por el equipo\r\n\r\n\t\t2ia. Gracias a este trabajo los estudiantes aprendieron a usar los ordenadores e internet para encontrar informaciones y verificar si se les puede confiar.\t

    \r\n\r\n\r\n\r\n\t

    \r\n\r\n\t\tEl proyecto \"Voluntariado para el conocimiento\" se pudo realizar gracias al apoyo del\t\t\r\n\r\n\t\t\tMinisterio de la Educaci\u00f3n Nacional. Los premios para los estudiantes fueron fundados por\r\n\r\n\t\t\r\n\r\n\r\n\r\n\t\t\tEditorial Nasza Ksi\u0119garnia\r\n\r\n\t\ty\r\n\r\n\t\tEditorial Helion. Las notas fueron verificadas en la p\u00e1gina\r\n\r\n\t\t\r\n\r\n\t\t\tPlagiat.pl.\r\n\r\n\t

    \r\n\r\n\r\n\r\n\t

    \r\n\r\n\t\t El informe de la realizaci\u00f3n del proyecto \u201cVoluntariado para el conocimiento\u201d.\r\n\r\n\t

    \r\n\r\n\r\n\r\n\t

    \r\n\r\n\t\r\n\r\n\t\r\n\r\n\t\r\n\r\n \r\n\r\n \r\n\r\n\t

    ", + "left_column_en": "

    Volunteers

    \r\n\t

    Writers' biographical entries as well as periods' and genres'\r\ndefinitions placed on web library Wolne Lektury were written by students from four schools during \"Wolontariat dla wiedzy\" (\"Volunteering for knowledge\") workshops.

    \r\n The students worked together under the factual guidance of teachers and specialists - literary scholars\r\n\r\n\ton wiki platform\r\n prepared by 2ia team. At the same time the students learnt how to use a computer and the Internet while searching for necessary information how to verify the credibility of the source.

    \r\n\r\n

    \r\n\"Wolontariat dla wiedzy\" project was realised thanks to the support of \r\nMinisterstwo Edukacji Narodowej. The rewards for the student were funded by\r\n\r\nWydawnictwo Nasza Ksi\u0119garnia\r\nandWydawnictwo Helion. Each entry was verified on \r\nPlagiat.pl website.\r\n

    \r\n\r\n

    \r\n\t\tReport on completion of \"Wolontariat dla wiedzy\" project (PL).\r\n\t

    \r\n\r\n\t

    \r\n\t\r\n\t\r\n\t\r\n \r\n \r\n\t

    ", + "title_pl": "Wolontariat dla wiedzy", + "title_ru": "\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0437\u043d\u0430\u043d\u0438\u0439", + "page_title_ru": "\u0412\u043e\u043b\u043e\u043d\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0437\u043d\u0430\u043d\u0438\u0439 \u043d\u0430 WolneLektury.pl" + } + }, + { + "pk": 4, + "model": "infopages.infopage", + "fields": { + "title_de": "Widget", + "page_title": "Widget", + "left_column_uk": "", + "right_column_pl": "

    Jak umie\u015bci\u0107 wid\u017cet Wolne Lektury na stronie WWW

    \r\n

    T\u0119 cz\u0119\u015b\u0107 kodu nale\u017cy umie\u015bci\u0107 tam, gdzie ma pojawi\u0107 si\u0119 wid\u017cet.

    \r\n\" size=\"50\">\r\n\r\n

    T\u0119 cz\u0119\u015b\u0107 kodu nale\u017cy umie\u015bci\u0107 tu\u017c przed zamkni\u0119ciem taga body, czyli przed </body>

    \r\n\r\n\" size=\"50\">", + "page_title_en": "Widget", + "page_title_es": "Widget", + "left_column_lt": "", + "title_fr": "Widget", + "right_column_ru": "", + "left_column_fr": "", + "title": "Widget", + "title_lt": "Widget", + "right_column": "

    Jak umie\u015bci\u0107 wid\u017cet Wolne Lektury na stronie WWW

    \r\n

    T\u0119 cz\u0119\u015b\u0107 kodu nale\u017cy umie\u015bci\u0107 tam, gdzie ma pojawi\u0107 si\u0119 wid\u017cet.

    \r\n\" size=\"50\">\r\n\r\n

    T\u0119 cz\u0119\u015b\u0107 kodu nale\u017cy umie\u015bci\u0107 tu\u017c przed zamkni\u0119ciem taga body, czyli przed </body>

    \r\n\r\n\" size=\"50\">", + "right_column_es": "", + "right_column_en": "", + "left_column_de": "", + "title_uk": "Widget", + "right_column_fr": "", + "left_column": "

    Wid\u017cet Wolne Lektury na Twojej stronie WWW

    \r\n

    Umie\u015b\u0107 wid\u017cet \u2013 wyszukiwark\u0119 Wolnych Lektur umo\u017cliwiaj\u0105c\u0105 dost\u0119p do darmowych lektur i audiobook\u00f3w \u2013 na swojej stronie WWW!

    \r\n

    Po prostu skopiuj poni\u017cszy kod HTML.

    \r\n\r\n\r\n\r\n\r\n

    Tak b\u0119dzie prezentowa\u0142 si\u0119 wid\u017cet po umieszczeniu go na stronie:

    \r\n
    \r\n", + "right_column_uk": "", + "title_en": "Widget", + "left_column_pl": "

    Wid\u017cet Wolne Lektury na Twojej stronie WWW

    \r\n

    Umie\u015b\u0107 wid\u017cet \u2013 wyszukiwark\u0119 Wolnych Lektur umo\u017cliwiaj\u0105c\u0105 dost\u0119p do darmowych lektur i audiobook\u00f3w \u2013 na swojej stronie WWW!

    \r\n

    Po prostu skopiuj poni\u017cszy kod HTML.

    \r\n\r\n\r\n\r\n\r\n

    Tak b\u0119dzie prezentowa\u0142 si\u0119 wid\u017cet po umieszczeniu go na stronie:

    \r\n
    \r\n", + "left_column_ru": "", + "right_column_lt": "", + "title_es": "Widget", + "page_title_fr": "Widget", + "page_title_uk": "Widget", + "page_title_de": "Widget", + "slug": "widget", + "page_title_lt": "Widget", + "right_column_de": "", + "page_title_pl": "Wid\u017cet", + "left_column_es": "", + "left_column_en": "", + "title_pl": "Wid\u017cet Wolne Lektury", + "title_ru": "Widget", + "page_title_ru": "Widget" + } + } +] diff --git a/apps/infopages/migrations/0001_initial.py b/apps/infopages/migrations/0001_initial.py new file mode 100644 index 000000000..a28ce3aa2 --- /dev/null +++ b/apps/infopages/migrations/0001_initial.py @@ -0,0 +1,110 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'InfoPage' + db.create_table('infopages_infopage', ( + ('title_de', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title', self.gf('django.db.models.fields.CharField')(max_length=120, blank=True)), + ('left_column_uk', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('right_column_pl', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('page_title_en', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title_es', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('left_column_lt', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title_fr', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('right_column_ru', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('left_column_fr', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=120, blank=True)), + ('title_lt', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('right_column', self.gf('django.db.models.fields.TextField')(blank=True)), + ('right_column_es', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('right_column_en', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('left_column_de', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title_uk', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('right_column_fr', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('left_column', self.gf('django.db.models.fields.TextField')(blank=True)), + ('right_column_uk', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title_en', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('left_column_pl', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('left_column_ru', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('right_column_lt', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title_es', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title_fr', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title_uk', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title_de', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=120, db_index=True)), + ('page_title_lt', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('right_column_de', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('page_title_pl', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('left_column_es', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('left_column_en', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('title_pl', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('title_ru', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + ('page_title_ru', self.gf('django.db.models.fields.CharField')(max_length=120, null=True, blank=True)), + )) + + if not db.dry_run: + from django.core.management import call_command + call_command("loaddata", "wl_data") + + db.send_create_signal('infopages', ['InfoPage']) + + + def backwards(self, orm): + + # Deleting model 'InfoPage' + db.delete_table('infopages_infopage') + + + models = { + 'infopages.infopage': { + 'Meta': {'object_name': 'InfoPage'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'left_column': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'left_column_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'left_column_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'page_title': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}), + 'page_title_de': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_en': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_es': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_fr': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_lt': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_pl': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_ru': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'page_title_uk': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'right_column': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'right_column_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'right_column_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}), + 'title_de': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_en': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_es': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_fr': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_lt': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_pl': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_ru': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}), + 'title_uk': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': True, 'blank': True}) + } + } + + complete_apps = ['infopages'] diff --git a/apps/infopages/migrations/__init__.py b/apps/infopages/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/infopages/models.py b/apps/infopages/models.py new file mode 100644 index 000000000..9fe7b3287 --- /dev/null +++ b/apps/infopages/models.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +class InfoPage(models.Model): + """ + An InfoPage is used to display a two-column flatpage + """ + + page_title = models.CharField(_('page title'), max_length=120, blank=True) + slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) + title = models.CharField(_('title'), max_length=120, blank=True) + left_column = models.TextField(_('left column'), blank=True) + right_column = models.TextField(_('right column'), blank=True) + + class Meta: + ordering = ('slug',) + verbose_name = _('info page') + verbose_name_plural = _('info pages') + + def __unicode__(self): + return self.title + diff --git a/apps/infopages/views.py b/apps/infopages/views.py new file mode 100644 index 000000000..07a416bbf --- /dev/null +++ b/apps/infopages/views.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from django.shortcuts import render_to_response +from django.template import RequestContext + +from catalogue.forms import SearchForm +from infopages.models import InfoPage + +def infopage(request, slug): + form = SearchForm() + object = InfoPage.objects.get(slug=slug) + + return render_to_response('info/base.html', locals(), + context_instance=RequestContext(request)) \ No newline at end of file diff --git a/apps/lessons/admin.py b/apps/lessons/admin.py index 813621f91..1447453c2 100644 --- a/apps/lessons/admin.py +++ b/apps/lessons/admin.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.contrib import admin from django.utils.translation import ugettext_lazy as _ diff --git a/apps/lessons/locale/de/LC_MESSAGES/django.mo b/apps/lessons/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 000000000..512a6c329 Binary files /dev/null and b/apps/lessons/locale/de/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/de/LC_MESSAGES/django.po b/apps/lessons/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..99d4bd710 --- /dev/null +++ b/apps/lessons/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-06-03 01:40+0100\n" +"Last-Translator: Iwona Fiałkowska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +msgid "title" +msgstr "Titel" + +#: models.py:13 +msgid "slug" +msgstr "slug" + +#: models.py:14 +msgid "file" +msgstr "Datei" + +#: models.py:15 +msgid "author" +msgstr "Autor" + +#: models.py:16 +msgid "slideshare ID" +msgstr "Dia ID" + +#: models.py:17 +msgid "description" +msgstr "Beschreibung" + +#: models.py:29 +msgid "document" +msgstr "Dokument" + +#: models.py:29 +msgid "documents" +msgstr "Dokumente" + diff --git a/apps/lessons/locale/en/LC_MESSAGES/django.mo b/apps/lessons/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 000000000..daef48440 Binary files /dev/null and b/apps/lessons/locale/en/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/en/LC_MESSAGES/django.po b/apps/lessons/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..e001f69ab --- /dev/null +++ b/apps/lessons/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-06-09 16:44+0100\n" +"Last-Translator: K Izdebska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +msgid "title" +msgstr "title" + +#: models.py:13 +msgid "slug" +msgstr "slug" + +#: models.py:14 +msgid "file" +msgstr "file" + +#: models.py:15 +msgid "author" +msgstr "author" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "description" + +#: models.py:29 +msgid "document" +msgstr "document" + +#: models.py:29 +msgid "documents" +msgstr "documents" + diff --git a/apps/lessons/locale/es/LC_MESSAGES/django.mo b/apps/lessons/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 000000000..b674d7769 Binary files /dev/null and b/apps/lessons/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/es/LC_MESSAGES/django.po b/apps/lessons/locale/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..2c9d19bff --- /dev/null +++ b/apps/lessons/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-08-11 10:05+0100\n" +"Last-Translator: Katarzyna Flis \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +msgid "title" +msgstr "título" + +#: models.py:13 +msgid "slug" +msgstr "slug" + +#: models.py:14 +msgid "file" +msgstr "archivo" + +#: models.py:15 +msgid "author" +msgstr "autor" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "descripción" + +#: models.py:29 +msgid "document" +msgstr "documento" + +#: models.py:29 +msgid "documents" +msgstr "documentos" + diff --git a/apps/lessons/locale/fr/LC_MESSAGES/django.mo b/apps/lessons/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..f4d52c13f Binary files /dev/null and b/apps/lessons/locale/fr/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/fr/LC_MESSAGES/django.po b/apps/lessons/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..7a445c673 --- /dev/null +++ b/apps/lessons/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-07-12 20:34+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +msgid "title" +msgstr "titre" + +#: models.py:13 +msgid "slug" +msgstr "slug" + +#: models.py:14 +msgid "file" +msgstr "fichier" + +#: models.py:15 +msgid "author" +msgstr "auteur" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "description" + +#: models.py:29 +msgid "document" +msgstr "document" + +#: models.py:29 +msgid "documents" +msgstr "documents" + diff --git a/apps/lessons/locale/lt/LC_MESSAGES/django.mo b/apps/lessons/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..bbe12bdf2 Binary files /dev/null and b/apps/lessons/locale/lt/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/lt/LC_MESSAGES/django.po b/apps/lessons/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..eb94aba07 --- /dev/null +++ b/apps/lessons/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-07-09 22:59+0100\n" +"Last-Translator: Alicja Sinkiewicz \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: models.py:12 +msgid "title" +msgstr "pavadinimas" + +#: models.py:13 +msgid "slug" +msgstr "slugas" + +#: models.py:14 +msgid "file" +msgstr "failas" + +#: models.py:15 +msgid "author" +msgstr "autorius" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "aprašymas" + +#: models.py:29 +msgid "document" +msgstr "dokumentas" + +#: models.py:29 +msgid "documents" +msgstr "dokumentai" + diff --git a/apps/lessons/locale/pl/LC_MESSAGES/django.mo b/apps/lessons/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..92e6388e2 Binary files /dev/null and b/apps/lessons/locale/pl/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/pl/LC_MESSAGES/django.po b/apps/lessons/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..4967ba654 --- /dev/null +++ b/apps/lessons/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-05-19 16:19\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: models.py:12 +msgid "title" +msgstr "tytuł" + +#: models.py:13 +msgid "slug" +msgstr "" + +#: models.py:14 +msgid "file" +msgstr "plik" + +#: models.py:15 +msgid "author" +msgstr "autor" + +#: models.py:16 +msgid "slideshare ID" +msgstr "" + +#: models.py:17 +msgid "description" +msgstr "opis" + +#: models.py:29 +msgid "document" +msgstr "dokument" + +#: models.py:29 +msgid "documents" +msgstr "dokumenty" diff --git a/apps/lessons/locale/ru/LC_MESSAGES/django.mo b/apps/lessons/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 000000000..4d9da85be Binary files /dev/null and b/apps/lessons/locale/ru/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/ru/LC_MESSAGES/django.po b/apps/lessons/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..4f239c689 --- /dev/null +++ b/apps/lessons/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-06-02 17:07+0100\n" +"Last-Translator: I \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +msgid "title" +msgstr "заглавие" + +#: models.py:13 +msgid "slug" +msgstr "slug" + +#: models.py:14 +msgid "file" +msgstr "файл" + +#: models.py:15 +msgid "author" +msgstr "автор" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "описание" + +#: models.py:29 +msgid "document" +msgstr "документ" + +#: models.py:29 +msgid "documents" +msgstr "документы" + diff --git a/apps/lessons/locale/uk/LC_MESSAGES/django.mo b/apps/lessons/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0530fbaf0 Binary files /dev/null and b/apps/lessons/locale/uk/LC_MESSAGES/django.mo differ diff --git a/apps/lessons/locale/uk/LC_MESSAGES/django.po b/apps/lessons/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 000000000..0df9905f0 --- /dev/null +++ b/apps/lessons/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:00+0200\n" +"PO-Revision-Date: 2010-08-26 13:13+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: models.py:12 +#, fuzzy +msgid "title" +msgstr "заголовок" + +#: models.py:13 +msgid "slug" +msgstr "слуґ" + +#: models.py:14 +msgid "file" +msgstr "файл" + +#: models.py:15 +msgid "author" +msgstr "автор" + +#: models.py:16 +msgid "slideshare ID" +msgstr "slideshare ID" + +#: models.py:17 +msgid "description" +msgstr "опис" + +#: models.py:29 +msgid "document" +msgstr "документ" + +#: models.py:29 +msgid "documents" +msgstr "документи" + diff --git a/apps/lessons/models.py b/apps/lessons/models.py index b0cd59337..ffb2b6c96 100644 --- a/apps/lessons/models.py +++ b/apps/lessons/models.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.db import models from django.utils.translation import ugettext_lazy as _ from os import path class Document(models.Model): - """Dokument - materiał pomocniczy dla nauczycieli.""" + """Document - hand-out for teachers""" title = models.CharField(_('title'), max_length=120) slug = models.SlugField(_('slug')) file = models.FileField(_('file'), upload_to='lessons/document') @@ -13,14 +16,14 @@ class Document(models.Model): slideshare_id = models.CharField(_('slideshare ID'), blank=True, max_length=120) description = models.TextField(_('description'), blank=True) created_at = models.DateTimeField(auto_now_add=True) - + def slideshare_player(self): base, ext = path.splitext(self.file.name) if ext in ('.ppt', '.pps', '.pot', '.pptx', '.potx', '.ppsx', '.odp', '.key', '.zip', '.pdf',): return 'ssplayer2.swf' else: return 'ssplayerd.swf' - + class Meta: ordering = ['slug'] verbose_name, verbose_name_plural = _("document"), _("documents") diff --git a/apps/lessons/urls.py b/apps/lessons/urls.py index d43ac3ab1..1d256374b 100644 --- a/apps/lessons/urls.py +++ b/apps/lessons/urls.py @@ -1,18 +1,19 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.conf.urls.defaults import * from catalogue import forms -from lessons import models urlpatterns = patterns('', - url(r'^$', 'django.views.generic.list_detail.object_list', { - 'queryset': models.Document.objects.all(), - 'template_name': 'lessons/document_list.html', + url(r'^$', 'django.views.generic.simple.direct_to_template', { + 'template': 'lessons/document_list.html', 'extra_context': { 'form': forms.SearchForm(), }, }, name='lessons_document_list'), - + url(r'^(?P[a-zA-Z0-9_-]+)/$', 'lessons.views.document_detail', name='lessons_document_detail'), ) diff --git a/apps/lessons/views.py b/apps/lessons/views.py index e22691985..242526d86 100644 --- a/apps/lessons/views.py +++ b/apps/lessons/views.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from django.views.generic.list_detail import object_detail from catalogue import forms from lessons import models @@ -7,7 +11,7 @@ def document_detail(request, slug): template_name = 'lessons/document_detail.html' if request.is_ajax(): template_name = 'lessons/ajax_document_detail.html' - + return object_detail(request, slug=slug, slug_field='slug', diff --git a/apps/modeltranslation/__init__.py b/apps/modeltranslation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/modeltranslation/admin.py b/apps/modeltranslation/admin.py new file mode 100644 index 000000000..b51e3a332 --- /dev/null +++ b/apps/modeltranslation/admin.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +from copy import deepcopy + +from django import forms, template +from django.conf import settings +from django.contrib import admin +from django.contrib.contenttypes import generic + +from modeltranslation.translator import translator +from modeltranslation.utils import get_translation_fields +# Ensure that models are registered for translation before TranslationAdmin +# runs. The import is supposed to resolve a race condition between model import +# and translation registration in production (see issue 19). +import modeltranslation.models + + +class TranslationAdminBase(object): + """ + Mixin class which adds patch_translation_field functionality. + """ + def patch_translation_field(self, db_field, field, **kwargs): + trans_opts = translator.get_options_for_model(self.model) + + # Hide the original field by making it non-editable. + if db_field.name in trans_opts.fields: + db_field.editable = False + + # For every localized field copy the widget from the original field + if db_field.name in trans_opts.localized_fieldnames_rev: + orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name] + orig_formfield = self.formfield_for_dbfield( \ + self.model._meta.get_field(orig_fieldname), + **kwargs) + + # In case the original form field was required, make the default + # translation field required instead. + if db_field.language == settings.LANGUAGES[0][0] and \ + orig_formfield.required: + orig_formfield.required = False + orig_formfield.blank = True + field.required = True + field.blank = False + + field.widget = deepcopy(orig_formfield.widget) + + +class TranslationAdmin(admin.ModelAdmin, TranslationAdminBase): + def __init__(self, *args, **kwargs): + super(TranslationAdmin, self).__init__(*args, **kwargs) + + trans_opts = translator.get_options_for_model(self.model) + + # Replace original field with translation field for each language + if self.fields: + fields_new = list(self.fields) + for field in self.fields: + if field in trans_opts.fields: + index = fields_new.index(field) + translation_fields = get_translation_fields(field) + fields_new[index:index + 1] = translation_fields + self.fields = fields_new + + if self.fieldsets: + fieldsets_new = list(self.fieldsets) + for (name, dct) in self.fieldsets: + if 'fields' in dct: + fields_new = list(dct['fields']) + for field in dct['fields']: + if field in trans_opts.fields: + index = fields_new.index(field) + translation_fields = get_translation_fields(field) + fields_new[index:index + 1] = translation_fields + dct['fields'] = fields_new + self.fieldsets = fieldsets_new + + if self.list_editable: + editable_new = list(self.list_editable) + display_new = list(self.list_display) + for field in self.list_editable: + if field in trans_opts.fields: + index = editable_new.index(field) + display_index = display_new.index(field) + translation_fields = get_translation_fields(field) + editable_new[index:index + 1] = translation_fields + display_new[display_index:display_index + 1] = \ + translation_fields + self.list_editable = editable_new + self.list_display = display_new + + if self.prepopulated_fields: + prepopulated_fields_new = dict(self.prepopulated_fields) + for (k, v) in self.prepopulated_fields.items(): + translation_fields = get_translation_fields(v[0]) + prepopulated_fields_new[k] = tuple([translation_fields[0]]) + self.prepopulated_fields = prepopulated_fields_new + + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationAdmin, self).formfield_for_dbfield(db_field, + **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + +class TranslationTabularInline(admin.TabularInline, TranslationAdminBase): + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationTabularInline, + self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + +class TranslationStackedInline(admin.StackedInline, TranslationAdminBase): + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationStackedInline, + self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + +class TranslationGenericTabularInline(generic.GenericTabularInline, + TranslationAdminBase): + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationGenericTabularInline, + self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + +class TranslationGenericStackedInline(generic.GenericStackedInline, + TranslationAdminBase): + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationGenericStackedInline, + self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field diff --git a/apps/modeltranslation/fields.py b/apps/modeltranslation/fields.py new file mode 100644 index 000000000..be942f6a5 --- /dev/null +++ b/apps/modeltranslation/fields.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +from django.conf import settings +from django.db.models.fields import Field, CharField + +from modeltranslation.utils import get_language, build_localized_fieldname + + +class TranslationField(Field): + """ + The translation field functions as a proxy to the original field which is + wrapped. + + For every field defined in the model's ``TranslationOptions`` localized + versions of that field are added to the model depending on the languages + given in ``settings.LANGUAGES``. + + If for example there is a model ``News`` with a field ``title`` which is + registered for translation and the ``settings.LANGUAGES`` contains the + ``de`` and ``en`` languages, the fields ``title_de`` and ``title_en`` will + be added to the model class. These fields are realized using this + descriptor. + + The translation field needs to know which language it contains therefore + that needs to be specified when the field is created. + """ + def __init__(self, translated_field, language, *args, **kwargs): + # Store the originally wrapped field for later + self.translated_field = translated_field + self.language = language + + # Update the dict of this field with the content of the original one + # This might be a bit radical?! Seems to work though... + self.__dict__.update(translated_field.__dict__) + + # Translation are always optional (for now - maybe add some parameters + # to the translation options for configuring this) + self.null = True + self.blank = True + + # Adjust the name of this field to reflect the language + self.attname = build_localized_fieldname(translated_field.name, + language) + self.name = self.attname + + # Copy the verbose name and append a language suffix (will e.g. in the + # admin). This might be a proxy function so we have to check that here. + if hasattr(translated_field.verbose_name, '_proxy____unicode_cast'): + verbose_name = \ + translated_field.verbose_name._proxy____unicode_cast() + else: + verbose_name = translated_field.verbose_name + self.verbose_name = '%s [%s]' % (verbose_name, language) + + def pre_save(self, model_instance, add): + val = super(TranslationField, self).pre_save(model_instance, add) + if get_language() == self.language and not add: + # Rule is: 3. Assigning a value to a translation field of the + # default language also updates the original field + model_instance.__dict__[self.translated_field.name] = val + return val + + def get_internal_type(self): + return self.translated_field.get_internal_type() + + #def contribute_to_class(self, cls, name): + #super(TranslationField, self).contribute_to_class(cls, name) + ##setattr(cls, 'get_%s_display' % self.name, + ##curry(cls._get_FIELD_display, field=self)) + + def south_field_triple(self): + """Returns a suitable description of this field for South.""" + # We'll just introspect the _actual_ field. + from south.modelsinspector import introspector + field_class = '%s.%s' % (self.translated_field.__class__.__module__, + self.translated_field.__class__.__name__) + args, kwargs = introspector(self.translated_field) + + # This is patched in init and so should be here! -- lqc + kwargs['blank'], kwargs['null'] = True, True + + # That's our definition! + return (field_class, args, kwargs) + + def formfield(self, *args, **kwargs): + """Preserves the widget of the translated field.""" + trans_formfield = self.translated_field.formfield(*args, **kwargs) + defaults = {'widget': type(trans_formfield.widget)} + defaults.update(kwargs) + return super(TranslationField, self).formfield(*args, **defaults) + + +#class CurrentLanguageField(CharField): + #def __init__(self, **kwargs): + #super(CurrentLanguageField, self).__init__(null=True, max_length=5, + #**kwargs) + + #def contribute_to_class(self, cls, name): + #super(CurrentLanguageField, self).contribute_to_class(cls, name) + #registry = CurrentLanguageFieldRegistry() + #registry.add_field(cls, self) + + +#class CurrentLanguageFieldRegistry(object): + #_registry = {} + + #def add_field(self, model, field): + #reg = self.__class__._registry.setdefault(model, []) + #reg.append(field) + + #def get_fields(self, model): + #return self.__class__._registry.get(model, []) + + #def __contains__(self, model): + #return model in self.__class__._registry diff --git a/apps/modeltranslation/management/__init__.py b/apps/modeltranslation/management/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/modeltranslation/management/commands/__init__.py b/apps/modeltranslation/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/modeltranslation/management/commands/update_translation_fields.py b/apps/modeltranslation/management/commands/update_translation_fields.py new file mode 100644 index 000000000..adb5e6de9 --- /dev/null +++ b/apps/modeltranslation/management/commands/update_translation_fields.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from django.conf import settings +from django.core.management.base import (BaseCommand, CommandError, + NoArgsCommand) + +from modeltranslation.translator import translator +from modeltranslation.utils import build_localized_fieldname + + +class Command(NoArgsCommand): + help = 'Updates the default translation fields of all or the specified' \ + 'translated application using the value of the original field.' + + def handle(self, **options): + default_lang = settings.LANGUAGES[0][0] + print "Using default language:", default_lang + + for model, trans_opts in translator._registry.items(): + print "Updating data of model '%s'" % model + for obj in model.objects.all(): + for fieldname in trans_opts.fields: + def_lang_fieldname = \ + build_localized_fieldname(fieldname, default_lang) + #print "setting %s from %s to %s." % \ + #(def_lang_fieldname, fieldname, + #obj.__dict__[fieldname]) + if not getattr(obj, def_lang_fieldname): + setattr(obj, def_lang_fieldname, + obj.__dict__[fieldname]) + obj.save() diff --git a/apps/modeltranslation/models.py b/apps/modeltranslation/models.py new file mode 100644 index 000000000..739c89706 --- /dev/null +++ b/apps/modeltranslation/models.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +import sys + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import models + +from modeltranslation.translator import translator + +# Every model registered with the modeltranslation.translator.translator +# is patched to contain additional localized versions for every +# field specified in the model's translation options. + +# Import the project's global "translation.py" which registers model +# classes and their translation options with the translator object. +if getattr(settings, 'TRANSLATION_REGISTRY', False): + try: + __import__(settings.TRANSLATION_REGISTRY, {}, {}, ['']) + except ImportError: + sys.stderr.write("modeltranslation: Can't import module '%s'.\n" + "(If the module exists, it's causing an " + "ImportError somehow.)\n" %\ + settings.TRANSLATION_REGISTRY) + # For some reason ImportErrors raised in translation.py or in modules + # that are included from there become swallowed. Work around this + # problem by printing the traceback explicitly. + import traceback + traceback.print_exc() + + # After importing all translation modules, all translation classes are + # registered with the translator. + if settings.DEBUG: + try: + if sys.argv[1] in ('runserver', 'runserver_plus'): + translated_model_names = ', '.join( + t.__name__ for t in translator._registry.keys()) + print('modeltranslation: Registered %d models for ' + 'translation (%s).' % (len(translator._registry), + translated_model_names)) + except IndexError: + pass +else: + raise ImproperlyConfigured("You haven't set the TRANSLATION_REGISTRY " + "setting yet.") diff --git a/apps/modeltranslation/tests.py b/apps/modeltranslation/tests.py new file mode 100644 index 000000000..3e0f39bb8 --- /dev/null +++ b/apps/modeltranslation/tests.py @@ -0,0 +1,258 @@ +# -*- coding: utf-8 -*- +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from django.db import models +from django.test import TestCase +from django.utils.thread_support import currentThread +from django.utils.translation import get_language +from django.utils.translation import trans_real + +# TODO: tests for TranslationAdmin + +from modeltranslation import translator + +settings.LANGUAGES = (('de', 'Deutsch'), + ('en', 'English')) + + +class TestModel(models.Model): + title = models.CharField(max_length=255) + text = models.TextField(null=True) + + +class TestTranslationOptions(translator.TranslationOptions): + fields = ('title', 'text',) + + +translator.translator._registry = {} +translator.translator.register(TestModel, TestTranslationOptions) + + +class ModelTranslationTest(TestCase): + """Basic tests for the modeltranslation application.""" + urls = 'modeltranslation.testurls' + + def setUp(self): + trans_real.activate("de") + + def tearDown(self): + trans_real.deactivate() + + def test_registration(self): + self.client.post('/set_language/', data={'language': 'de'}) + #self.client.session['django_language'] = 'de-de' + #self.client.cookies[settings.LANGUAGE_COOKIE_NAME] = 'de-de' + + langs = tuple(l[0] for l in settings.LANGUAGES) + self.failUnlessEqual(2, len(langs)) + self.failUnless('de' in langs) + self.failUnless('en' in langs) + self.failUnless(translator.translator) + + # Check that only one model is registered for translation + self.failUnlessEqual(len(translator.translator._registry), 1) + + # Try to unregister a model that is not registered + self.assertRaises(translator.NotRegistered, + translator.translator.unregister, User) + + # Try to get options for a model that is not registered + self.assertRaises(translator.NotRegistered, + translator.translator.get_options_for_model, User) + + def test_translated_models(self): + # First create an instance of the test model to play with + inst = TestModel.objects.create(title="Testtitle", text="Testtext") + field_names = dir(inst) + self.failUnless('id' in field_names) + self.failUnless('title' in field_names) + self.failUnless('text' in field_names) + self.failUnless('title_de' in field_names) + self.failUnless('title_en' in field_names) + self.failUnless('text_de' in field_names) + self.failUnless('text_en' in field_names) + + inst.delete() + + def test_set_translation(self): + self.failUnlessEqual(get_language(), "de") + # First create an instance of the test model to play with + title1_de = "title de" + title1_en = "title en" + title2_de = "title2 de" + inst1 = TestModel(title_en=title1_en, text="Testtext") + inst1.title = title1_de + inst2 = TestModel(title=title2_de, text="Testtext") + inst1.save() + inst2.save() + + self.failUnlessEqual(inst1.title, title1_de) + self.failUnlessEqual(inst1.title_en, title1_en) + + self.failUnlessEqual(inst2.title, title2_de) + self.failUnlessEqual(inst2.title_en, None) + + del inst1 + del inst2 + + # Check that the translation fields are correctly saved and provide the + # correct value when retrieving them again. + n = TestModel.objects.get(title=title1_de) + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + + def test_titleonly(self): + title1_de = "title de" + n = TestModel.objects.create(title=title1_de) + self.failUnlessEqual(n.title, title1_de) + # Because the original field "title" was specified in the constructor + # it is directly passed into the instance's __dict__ and the descriptor + # which updates the associated default translation field is not called + # and the default translation will be None. + self.failUnlessEqual(n.title_de, None) + self.failUnlessEqual(n.title_en, None) + + # Now assign the title, that triggers the descriptor and the default + # translation field is updated + n.title = title1_de + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, None) + + def test_rule1(self): + """ + Rule 1: Reading the value from the original field returns the value in + translated to the current language. + """ + title1_de = "title de" + title1_en = "title en" + text_de = "Dies ist ein deutscher Satz" + text_en = "This is an english sentence" + + # Test 1. + n = TestModel.objects.create(title_de=title1_de, title_en=title1_en, + text_de=text_de, text_en=text_en) + n.save() + + # language is set to "de" at this point + self.failUnlessEqual(get_language(), "de") + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + self.failUnlessEqual(n.text, text_de) + self.failUnlessEqual(n.text_de, text_de) + self.failUnlessEqual(n.text_en, text_en) + # Now switch to "en" + trans_real.activate("en") + self.failUnlessEqual(get_language(), "en") + # Title should now be return the english one (just by switching the + # language) + self.failUnlessEqual(n.title, title1_en) + self.failUnlessEqual(n.text, text_en) + + n = TestModel.objects.create(title_de=title1_de, title_en=title1_en, + text_de=text_de, text_en=text_en) + n.save() + # language is set to "en" at this point + self.failUnlessEqual(n.title, title1_en) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + self.failUnlessEqual(n.text, text_en) + self.failUnlessEqual(n.text_de, text_de) + self.failUnlessEqual(n.text_en, text_en) + trans_real.activate("de") + self.failUnlessEqual(get_language(), "de") + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.text, text_de) + trans_real.deactivate() + + def test_rule2(self): + """ + Rule 2: Assigning a value to the original field also updates the value + in the associated translation field of the default language + """ + self.failUnlessEqual(get_language(), "de") + title1_de = "title de" + title1_en = "title en" + n = TestModel.objects.create(title_de=title1_de, title_en=title1_en) + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + + title2 = "Neuer Titel" + n.title = title2 + n.save() + self.failUnlessEqual(n.title, title2) + self.failUnlessEqual(n.title, n.title_de) + + trans_real.activate("en") + self.failUnlessEqual(get_language(), "en") + title3 = "new title" + + n.title = title3 + n.title_de = title1_de + n.save() + self.failUnlessEqual(n.title, title3) + self.failUnlessEqual(n.title, n.title_en) + self.failUnlessEqual(title1_de, n.title_de) + + trans_real.deactivate() + + def test_rule3(self): + """ + Rule 3: Assigning a value to a translation field of the default + language also updates the original field - note that the value of the + original field will not be updated until the model instance is saved. + """ + title1_de = "title de" + title1_en = "title en" + n = TestModel.objects.create(title_de=title1_de, title_en=title1_en) + self.failUnlessEqual(get_language(), "de") + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + + n.title_de = "Neuer Titel" + n.save() + self.failUnlessEqual(n.title, n.title_de) + + # Now switch to "en" + trans_real.activate("en") + self.failUnlessEqual(get_language(), "en") + n.title_en = "New title" + # the n.title field is not updated before the instance is saved + n.save() + self.failUnlessEqual(n.title, n.title_en) + trans_real.deactivate() + + def test_rule4(self): + """ + Rule 4: If both fields - the original and the translation field of the + default language - are updated at the same time, the translation field + wins. + """ + self.failUnlessEqual(get_language(), "de") + title1_de = "title de" + title1_en = "title en" + n = TestModel.objects.create(title_de=title1_de, title_en=title1_en) + self.failUnlessEqual(n.title, title1_de) + self.failUnlessEqual(n.title_de, title1_de) + self.failUnlessEqual(n.title_en, title1_en) + + title2_de = "neu de" + title2_en = "new en" + title_foo = "foo" + n.title = title_foo + n.title_de = title2_de + n.title_en = title2_en + n.save() + self.failUnlessEqual(n.title, title2_de) + self.failUnlessEqual(n.title_de, title2_de) + self.failUnlessEqual(n.title_en, title2_en) + + n.title = title_foo + n.save() + self.failUnlessEqual(n.title, title_foo) + self.failUnlessEqual(n.title_de, title_foo) + self.failUnlessEqual(n.title_en, title2_en) diff --git a/apps/modeltranslation/testurls.py b/apps/modeltranslation/testurls.py new file mode 100644 index 000000000..8cb4d86d2 --- /dev/null +++ b/apps/modeltranslation/testurls.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from django.conf.urls.defaults import * + +urlpatterns = patterns('', + url(r'^set_language/$', 'django.views.i18n.set_language', {}, + name='set_language'), +) diff --git a/apps/modeltranslation/translator.py b/apps/modeltranslation/translator.py new file mode 100644 index 000000000..0a5536261 --- /dev/null +++ b/apps/modeltranslation/translator.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +from django.conf import settings +#from django.contrib.contenttypes.models import ContentType +from django.db import models +from django.db.models import signals +from django.db.models.base import ModelBase +from django.utils.functional import curry + +from modeltranslation.fields import TranslationField +from modeltranslation.utils import (TranslationFieldDescriptor, + build_localized_fieldname) + + +class AlreadyRegistered(Exception): + pass + + +class NotRegistered(Exception): + pass + + +class TranslationOptions(object): + """ + The TranslationOptions object is used to specify the fields to translate. + + The options are registered in combination with a model class at the + ``modeltranslation.translator.translator`` instance. + + It caches the content type of the translated model for faster lookup later + on. + """ + def __init__(self, *args, **kwargs): + # self.translation_model = None + #self.model_ct = None + self.localized_fieldnames = list() + + +def add_localized_fields(model): + """ + Monkey patchs the original model class to provide additional fields for + every language. Only do that for fields which are defined in the + translation options of the model. + + Returns a dict mapping the original fieldname to a list containing the + names of the localized fields created for the original field. + """ + localized_fields = dict() + translation_opts = translator.get_options_for_model(model) + for field_name in translation_opts.fields: + localized_fields[field_name] = list() + for l in settings.LANGUAGES: + # Construct the name for the localized field + localized_field_name = build_localized_fieldname(field_name, l[0]) + # Check if the model already has a field by that name + if hasattr(model, localized_field_name): + raise ValueError("Error adding translation field. The model "\ + "'%s' already contains a field named '%s'. "\ + % (instance.__class__.__name__, + localized_field_name)) + + # This approach implements the translation fields as full valid + # django model fields and therefore adds them via add_to_class + localized_field = model.add_to_class( \ + localized_field_name, + TranslationField(model._meta.get_field(field_name), l[0])) + localized_fields[field_name].append(localized_field_name) + return localized_fields + + +#def translated_model_initialized(field_names, instance, **kwargs): + #print "translated_model_initialized instance:", \ + #instance, ", field:", field_names + #for field_name in field_names: + #initial_val = getattr(instance, field_name) + #print " field: %s, initialval: %s" % (field_name, initial_val) + #setattr(instance.__class__, field_name, + #TranslationFieldDescriptor(field_name, initial_val)) + + +#def translated_model_initializing(sender, args, kwargs, **signal_kwargs): + #print "translated_model_initializing", sender, args, kwargs + #trans_opts = translator.get_options_for_model(sender) + #for field_name in trans_opts.fields: + #setattr(sender, field_name, TranslationFieldDescriptor(field_name)) + + +class Translator(object): + """ + A Translator object encapsulates an instance of a translator. Models are + registered with the Translator using the register() method. + """ + def __init__(self): + # model_class class -> translation_opts instance + self._registry = {} + + def register(self, model_or_iterable, translation_opts, **options): + """ + Registers the given model(s) with the given translation options. + + The model(s) should be Model classes, not instances. + + If a model is already registered for translation, this will raise + AlreadyRegistered. + """ + # Don't import the humongous validation code unless required + if translation_opts and settings.DEBUG: + from django.contrib.admin.validation import validate + else: + validate = lambda model, adminclass: None + + #if not translation_opts: + #translation_opts = TranslationOptions + if isinstance(model_or_iterable, ModelBase): + model_or_iterable = [model_or_iterable] + + for model in model_or_iterable: + if model in self._registry: + raise AlreadyRegistered('The model %s is already registered ' + 'for translation' % model.__name__) + + # If we got **options then dynamically construct a subclass of + # translation_opts with those **options. + if options: + # For reasons I don't quite understand, without a __module__ + # the created class appears to "live" in the wrong place, + # which causes issues later on. + options['__module__'] = __name__ + translation_opts = type("%sAdmin" % model.__name__, + (translation_opts,), options) + + # Validate (which might be a no-op) + #validate(translation_opts, model) + + # Store the translation class associated to the model + self._registry[model] = translation_opts + + # Get the content type of the original model and store it on the + # translation options for faster lookup later on. + #translation_opts.model_ct = \ + #ContentType.objects.get_for_model(model) + + # Add the localized fields to the model and store the names of + # these fields in the model's translation options for faster lookup + # later on. + translation_opts.localized_fieldnames = add_localized_fields(model) + + # Create a reverse dict mapping the localized_fieldnames to the + # original fieldname + rev_dict = dict() + for orig_name, loc_names in \ + translation_opts.localized_fieldnames.items(): + for ln in loc_names: + rev_dict[ln] = orig_name + + translation_opts.localized_fieldnames_rev = rev_dict + + # print "Applying descriptor field for model %s" % model + for field_name in translation_opts.fields: + setattr(model, field_name, TranslationFieldDescriptor(field_name)) + + #signals.pre_init.connect(translated_model_initializing, sender=model, + #weak=False) + + def unregister(self, model_or_iterable): + """ + Unregisters the given model(s). + + If a model isn't already registered, this will raise NotRegistered. + """ + if isinstance(model_or_iterable, ModelBase): + model_or_iterable = [model_or_iterable] + for model in model_or_iterable: + if model not in self._registry: + raise NotRegistered('The model "%s" is not registered for ' + 'translation' % model.__name__) + del self._registry[model] + + def get_options_for_model(self, model): + """ + Returns the translation options for the given ``model``. If the + ``model`` is not registered a ``NotRegistered`` exception is raised. + """ + try: + return self._registry[model] + except KeyError: + raise NotRegistered('The model "%s" is not registered for ' + 'translation' % model.__name__) + + +# This global object represents the singleton translator object +translator = Translator() diff --git a/apps/modeltranslation/utils.py b/apps/modeltranslation/utils.py new file mode 100644 index 000000000..aeb57d14a --- /dev/null +++ b/apps/modeltranslation/utils.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.conf import settings +from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType +from django.utils.translation import get_language as _get_language + + +def get_language(): + """ + Return an active language code that is guaranteed to be in + settings.LANGUAGES (Django does not seem to guarantee this for us.) + + """ + lang = _get_language() + available_languages = [l[0] for l in settings.LANGUAGES] + if lang not in available_languages and '-' in lang: + lang = lang.split('-')[0] + if lang in available_languages: + return lang + return available_languages[0] + + +def get_translation_fields(field): + """Returns a list of localized fieldnames for a given field.""" + return [build_localized_fieldname(field, l[0]) for l in settings.LANGUAGES] + + +def build_localized_fieldname(field_name, lang): + return '%s_%s' % (field_name, lang.replace('-', '_')) + + +class TranslationFieldDescriptor(object): + """A descriptor used for the original translated field.""" + def __init__(self, name, initial_val=""): + """ + The ``name`` is the name of the field (which is not available in the + descriptor by default - this is Python behaviour). + """ + self.name = name + self.val = initial_val + + def __set__(self, instance, value): + lang = get_language() + loc_field_name = build_localized_fieldname(self.name, lang) + # also update the translation field of the current language + setattr(instance, loc_field_name, value) + # update the original field via the __dict__ to prevent calling the + # descriptor + instance.__dict__[self.name] = value + + def __get__(self, instance, owner): + if not instance: + raise ValueError(u"Translation field '%s' can only be " + "accessed via an instance not via " + "a class." % self.name) + lang = get_language() + loc_field_name = build_localized_fieldname(self.name, lang) + if hasattr(instance, loc_field_name): + return getattr(instance, loc_field_name) or \ + instance.__dict__[self.name] + return instance.__dict__[self.name] + + +#def create_model(name, fields=None, app_label='', module='', options=None, + #admin_opts=None): + #""" + #Create specified model. + #This is taken from http://code.djangoproject.com/wiki/DynamicModels + #""" + #class Meta: + ## Using type('Meta', ...) gives a dictproxy error during model + ## creation + #pass + + #if app_label: + ## app_label must be set using the Meta inner class + #setattr(Meta, 'app_label', app_label) + + ## Update Meta with any options that were provided + #if options is not None: + #for key, value in options.iteritems(): + #setattr(Meta, key, value) + + ## Set up a dictionary to simulate declarations within a class + #attrs = {'__module__': module, 'Meta': Meta} + + ## Add in any fields that were provided + #if fields: + #attrs.update(fields) + + ## Create the class, which automatically triggers ModelBase processing + #model = type(name, (models.Model,), attrs) + + ## Create an Admin class if admin options were provided + #if admin_opts is not None: + #class Admin(admin.ModelAdmin): + #pass + #for key, value in admin_opts: + #setattr(Admin, key, value) + #admin.site.register(model, Admin) + + #return model + + +def copy_field(field): + """ + Instantiate a new field, with all of the values from the old one, except + the to and to_field in the case of related fields. + + This taken from http://www.djangosnippets.org/snippets/442/ + """ + base_kw = dict([(n, getattr(field, n, '_null')) for n in \ + models.fields.Field.__init__.im_func.func_code.co_varnames]) + if isinstance(field, models.fields.related.RelatedField): + rel = base_kw.get('rel') + rel_kw = dict([(n, getattr(rel, n, '_null')) for n in \ + rel.__init__.im_func.func_code.co_varnames]) + if isinstance(field, models.fields.related.ForeignKey): + base_kw['to_field'] = rel_kw.pop('field_name') + base_kw.update(rel_kw) + base_kw.pop('self') + return field.__class__(**base_kw) diff --git a/apps/newtagging/admin.py b/apps/newtagging/admin.py index 956d2cf9b..a8f511058 100644 --- a/apps/newtagging/admin.py +++ b/apps/newtagging/admin.py @@ -17,7 +17,7 @@ class FilteredSelectMultiple(forms.SelectMultiple): js = ['js/SelectBox.js' , 'js/SelectFilter2.js'] return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) media = property(_media) - + def __init__(self, verbose_name, is_stacked, attrs=None, choices=()): self.verbose_name = verbose_name self.is_stacked = is_stacked @@ -44,7 +44,7 @@ class TaggableModelForm(forms.ModelForm): kwargs['initial']['tags'] = [tag.id for tag in self.tag_model.objects.get_for_object(kwargs['instance'])] super(TaggableModelForm, self).__init__(*args, **kwargs) self.fields['tags'].choices = [(tag.id, tag.name) for tag in self.tag_model.objects.all()] - + def save(self, commit): obj = super(TaggableModelForm, self).save() tag_ids = self.cleaned_data['tags'] @@ -59,7 +59,7 @@ class TaggableModelForm(forms.ModelForm): class TaggableModelAdmin(admin.ModelAdmin): form = TaggableModelForm - + def get_form(self, request, obj=None): form = super(TaggableModelAdmin, self).get_form(request, obj) form.tag_model = self.tag_model diff --git a/apps/newtagging/locale/de/LC_MESSAGES/django.mo b/apps/newtagging/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 000000000..989b38e2e Binary files /dev/null and b/apps/newtagging/locale/de/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/de/LC_MESSAGES/django.po b/apps/newtagging/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..0ea17f3bc --- /dev/null +++ b/apps/newtagging/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-06-03 01:45+0100\n" +"Last-Translator: Iwona Fiałkowska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "tags" + +#: models.py:491 +msgid "tag" +msgstr "tag" + +#: models.py:492 +msgid "content type" +msgstr "Inhaltstyp" + +#: models.py:493 +msgid "object id" +msgstr "ID Objekt" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "" + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "" + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "" + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "" + diff --git a/apps/newtagging/locale/en/LC_MESSAGES/django.mo b/apps/newtagging/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 000000000..78acb0359 Binary files /dev/null and b/apps/newtagging/locale/en/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/en/LC_MESSAGES/django.po b/apps/newtagging/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..14bcf1cd9 --- /dev/null +++ b/apps/newtagging/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-06-09 16:52+0100\n" +"Last-Translator: K Izdebska \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "tags" + +#: models.py:491 +msgid "tag" +msgstr "tag" + +#: models.py:492 +msgid "content type" +msgstr "content type" + +#: models.py:493 +msgid "object id" +msgstr "object id" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "tagged_object_list must be defined with a queryset or a model" + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "tagged_object_list must be defined with a tag model" + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "tagged_object_list must be defined with a tag" + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "Found no tags matching \"%s\"." + diff --git a/apps/newtagging/locale/es/LC_MESSAGES/django.mo b/apps/newtagging/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 000000000..1cd5353c0 Binary files /dev/null and b/apps/newtagging/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/es/LC_MESSAGES/django.po b/apps/newtagging/locale/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..4a242d3b5 --- /dev/null +++ b/apps/newtagging/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-08-11 10:10+0100\n" +"Last-Translator: Katarzyna Flis \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "tags" + +#: models.py:491 +msgid "tag" +msgstr "tag" + +#: models.py:492 +msgid "content type" +msgstr "tipo de contenido" + +#: models.py:493 +msgid "object id" +msgstr "id de objeto" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "lista_de_objetos_agregados debe ser llamada con un queryset o un modelo." + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "lista_de_objetos_agregados debe ser nombrada con un modelo de tag." + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "lista_de_objetos_agregados debe ser nombrada con un tag." + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "No se han encontrado tags correspondientes \"%s\"." + diff --git a/apps/newtagging/locale/fr/LC_MESSAGES/django.mo b/apps/newtagging/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0cc0b8619 Binary files /dev/null and b/apps/newtagging/locale/fr/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/fr/LC_MESSAGES/django.po b/apps/newtagging/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..4da9334ea --- /dev/null +++ b/apps/newtagging/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-07-12 20:36+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "tags" + +#: models.py:491 +msgid "tag" +msgstr "tag" + +#: models.py:492 +msgid "content type" +msgstr "type du contenu" + +#: models.py:493 +msgid "object id" +msgstr "ID d'objet" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "" + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "" + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "" + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "" + diff --git a/apps/newtagging/locale/lt/LC_MESSAGES/django.mo b/apps/newtagging/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..27346fc44 Binary files /dev/null and b/apps/newtagging/locale/lt/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/lt/LC_MESSAGES/django.po b/apps/newtagging/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..1181140fe --- /dev/null +++ b/apps/newtagging/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-07-12 19:41+0100\n" +"Last-Translator: Alicja Sinkiewicz \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: admin.py:38 +msgid "tags" +msgstr "tagai" + +#: models.py:491 +msgid "tag" +msgstr "tagas" + +#: models.py:492 +msgid "content type" +msgstr "turinio rūšis " + +#: models.py:493 +msgid "object id" +msgstr "id obiektas" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "sutagintas_objektų _ sąrašas turi būti iššaukas su queryset arba su modeliu." + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "sutagintas_objektų _ sąrašas turi būti iššaukas su tago modeliu." + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "sutagintas_objektų _ sąrašas turi būti iššaukas su tagu." + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "Ne surado tagu tinkančių prie \"%s\"." + diff --git a/apps/newtagging/locale/pl/LC_MESSAGES/django.mo b/apps/newtagging/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c904a23ba Binary files /dev/null and b/apps/newtagging/locale/pl/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/pl/LC_MESSAGES/django.po b/apps/newtagging/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..324580761 --- /dev/null +++ b/apps/newtagging/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-05-19 16:20\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: admin.py:38 +msgid "tags" +msgstr "tagi" + +#: models.py:491 +msgid "tag" +msgstr "tag" + +#: models.py:492 +msgid "content type" +msgstr "typ zawartości" + +#: models.py:493 +msgid "object id" +msgstr "id obiektu" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "" + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "" + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "" + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "" diff --git a/apps/newtagging/locale/ru/LC_MESSAGES/django.mo b/apps/newtagging/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 000000000..95c389c26 Binary files /dev/null and b/apps/newtagging/locale/ru/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/ru/LC_MESSAGES/django.po b/apps/newtagging/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..02133d259 --- /dev/null +++ b/apps/newtagging/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-06-02 17:08+0100\n" +"Last-Translator: I \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "таги" + +#: models.py:491 +msgid "tag" +msgstr "таг" + +#: models.py:492 +msgid "content type" +msgstr "тип содержания" + +#: models.py:493 +msgid "object id" +msgstr "ID объекта" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "список таг-объектов должен сочетаться с набором вопросов или с моделью." + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "список таг-объектов дожен сочетаться с таг-моделью." + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "список таг-объектов должен сочетаться с тагом." + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "Никакой таг не соответствует \"%s\"." + diff --git a/apps/newtagging/locale/uk/LC_MESSAGES/django.mo b/apps/newtagging/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 000000000..fdf2a70d7 Binary files /dev/null and b/apps/newtagging/locale/uk/LC_MESSAGES/django.mo differ diff --git a/apps/newtagging/locale/uk/LC_MESSAGES/django.po b/apps/newtagging/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 000000000..2a7631ada --- /dev/null +++ b/apps/newtagging/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-18 11:01+0200\n" +"PO-Revision-Date: 2010-08-26 13:14+0100\n" +"Last-Translator: Natalia Kertyczak \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:38 +msgid "tags" +msgstr "теґи" + +#: models.py:491 +msgid "tag" +msgstr "теґ" + +#: models.py:492 +msgid "content type" +msgstr "тип змісту" + +#: models.py:493 +msgid "object id" +msgstr "ІД об'єкту" + +#: views.py:30 +msgid "tagged_object_list must be called with a queryset or a model." +msgstr "tagged_object_list must be called with a queryset or a model." + +#: views.py:32 +msgid "tagged_object_list must be called with a tag model." +msgstr "tagged_object_list must be called with a tag model." + +#: views.py:34 +msgid "tagged_object_list must be called with a tag." +msgstr "tagged_object_list must be called with a tag." + +#: views.py:38 +#, python-format +msgid "No tags found matching \"%s\"." +msgstr "Не знайдено теґів відповідаючих \"%s\"." + diff --git a/apps/newtagging/managers.py b/apps/newtagging/managers.py index 1dbcb2999..3107070ea 100644 --- a/apps/newtagging/managers.py +++ b/apps/newtagging/managers.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Custom managers for Django models registered with the tagging application. @@ -13,15 +14,15 @@ class ModelTagManager(models.Manager): def __init__(self, tag_model): super(ModelTagManager, self).__init__() self.tag_model = tag_model - + def get_query_set(self): content_type = ContentType.objects.get_for_model(self.model) return self.tag_model.objects.filter( items__content_type__pk=content_type.pk).distinct() - + def related(self, tags, *args, **kwargs): return self.tag_model.objects.related_for_model(tags, self.model, *args, **kwargs) - + def usage(self, *args, **kwargs): return self.tag_model.objects.usage_for_model(self.model, *args, **kwargs) @@ -61,7 +62,7 @@ class TagDescriptor(object): """ def __init__(self, tag_model): self.tag_model = tag_model - + def __get__(self, instance, owner): if not instance: tag_manager = ModelTagManager(self.tag_model) diff --git a/apps/newtagging/models.py b/apps/newtagging/models.py index e121994c7..ea2a41f8e 100644 --- a/apps/newtagging/models.py +++ b/apps/newtagging/models.py @@ -1,8 +1,12 @@ +# -*- coding: utf-8 -*- """ Models and managers for generic tagging. """ + # Python 2.3 compatibility -if not hasattr(__builtins__, 'set'): +try: + set +except NameError: from sets import Set as set from django.contrib.contenttypes import generic @@ -11,6 +15,7 @@ from django.db import connection, models from django.utils.translation import ugettext_lazy as _ from django.db.models.base import ModelBase from django.core.exceptions import ObjectDoesNotExist +from django.dispatch import Signal qn = connection.ops.quote_name @@ -20,6 +25,8 @@ except ImportError: parse_lookup = None +tags_updated = Signal(providing_args=["affected_tags"]) + def get_queryset_and_model(queryset_or_model): """ Given a ``QuerySet`` or a ``Model``, returns a two-tuple of @@ -41,7 +48,17 @@ class TagManager(models.Manager): def __init__(self, intermediary_table_model): super(TagManager, self).__init__() self.intermediary_table_model = intermediary_table_model - + models.signals.pre_delete.connect(self.target_deleted) + + def target_deleted(self, instance, **kwargs): + """ clear tag relations before deleting an object """ + try: + int(instance.pk) + except ValueError: + return + + self.update_tags(instance, []) + def update_tags(self, obj, tags): """ Update tags associated with an object. @@ -50,7 +67,7 @@ class TagManager(models.Manager): current_tags = list(self.filter(items__content_type__pk=content_type.pk, items__object_id=obj.pk)) updated_tags = self.model.get_tag_list(tags) - + # Remove tags which no longer apply tags_for_removal = [tag for tag in current_tags \ if tag not in updated_tags] @@ -59,10 +76,14 @@ class TagManager(models.Manager): object_id=obj.pk, tag__in=tags_for_removal).delete() # Add new tags - for tag in updated_tags: + tags_to_add = [tag for tag in updated_tags + if tag not in current_tags] + for tag in tags_to_add: if tag not in current_tags: self.intermediary_table_model._default_manager.create(tag=tag, content_object=obj) - + + tags_updated.send(sender=obj, affected_tags=tags_to_add + tags_for_removal) + def remove_tag(self, obj, tag): """ Remove tag from an object. @@ -79,7 +100,7 @@ class TagManager(models.Manager): ctype = ContentType.objects.get_for_model(obj) return self.filter(items__content_type__pk=ctype.pk, items__object_id=obj.pk) - + def _get_usage(self, model, counts=False, min_count=None, extra_joins=None, extra_criteria=None, params=None, extra=None): """ Perform the custom SQL query for ``usage_for_model`` and @@ -90,12 +111,12 @@ class TagManager(models.Manager): model_table = qn(model._meta.db_table) model_pk = '%s.%s' % (model_table, qn(model._meta.pk.column)) tag_columns = self._get_tag_columns() - + if extra is None: extra = {} extra_where = '' if 'where' in extra: extra_where = 'AND ' + ' AND '.join(extra['where']) - + query = """ SELECT DISTINCT %(tag_columns)s%(count_sql)s FROM @@ -108,7 +129,7 @@ class TagManager(models.Manager): WHERE %(tagged_item)s.content_type_id = %(content_type_id)s %%s %(extra_where)s - GROUP BY %(tag)s.id, %(tag)s.name + GROUP BY %(tag_columns)s, %(tag)s.id, %(tag)s.name %%s ORDER BY %(tag)s.%(ordering)s ASC""" % { 'tag': qn(self.model._meta.db_table), @@ -220,12 +241,12 @@ class TagManager(models.Manager): tag_count = len(tags) tagged_item_table = qn(self.intermediary_table_model._meta.db_table) tag_columns = self._get_tag_columns() - + if extra is None: extra = {} extra_where = '' if 'where' in extra: extra_where = 'AND ' + ' AND '.join(extra['where']) - + # Temporary table in this query is a hack to prevent MySQL from executing # inner query as dependant query (which could result in severe performance loss) query = """ @@ -297,7 +318,7 @@ class TaggedItemManager(models.Manager): def __init__(self, tag_model): super(TaggedItemManager, self).__init__() self.tag_model = tag_model - + def get_by_model(self, queryset_or_model, tags): """ Create a ``QuerySet`` containing instances of the specified @@ -469,7 +490,7 @@ class TaggedItemManager(models.Manager): def create_intermediary_table_model(model): """Create an intermediary table model for the specific tag model""" name = model.__name__ + 'Relation' - + class Meta: db_table = '%s_relation' % model._meta.db_table unique_together = (('tag', 'content_type', 'object_id'),) @@ -479,8 +500,8 @@ def create_intermediary_table_model(model): return u'%s [%s]' % (self.content_type.get_object_for_this_type(pk=self.object_id), self.tag) except ObjectDoesNotExist: return u' [%s]' % self.tag - - # Set up a dictionary to simulate declarations within a class + + # Set up a dictionary to simulate declarations within a class attrs = { '__module__': model.__module__, 'Meta': Meta, @@ -509,15 +530,15 @@ class TagMeta(ModelBase): class TagBase(models.Model): """Abstract class to be inherited by model classes.""" __metaclass__ = TagMeta - + class Meta: abstract = True - + @staticmethod def get_tag_list(tag_list): """ Utility function for accepting tag input in a flexible manner. - + You should probably override this method in your subclass. """ if isinstance(tag_list, TagBase): diff --git a/apps/newtagging/views.py b/apps/newtagging/views.py index 150a08477..b88e9c42d 100644 --- a/apps/newtagging/views.py +++ b/apps/newtagging/views.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Tagging related views. """ diff --git a/apps/pagination/__init__.py b/apps/pagination/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/apps/pagination/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/pagination/middleware.py b/apps/pagination/middleware.py deleted file mode 100644 index 0bab76712..000000000 --- a/apps/pagination/middleware.py +++ /dev/null @@ -1,10 +0,0 @@ -class PaginationMiddleware(object): - """ - Inserts a variable representing the current page onto the request object if - it exists in either **GET** or **POST** portions of the request. - """ - def process_request(self, request): - try: - request.page = int(request.REQUEST['page']) - except (KeyError, ValueError): - request.page = 1 \ No newline at end of file diff --git a/apps/pagination/models.py b/apps/pagination/models.py deleted file mode 100644 index 8b1378917..000000000 --- a/apps/pagination/models.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/pagination/templates/pagination/pagination.html b/apps/pagination/templates/pagination/pagination.html deleted file mode 100644 index 3799314e4..000000000 --- a/apps/pagination/templates/pagination/pagination.html +++ /dev/null @@ -1,25 +0,0 @@ -{% if is_paginated %} - -{% endif %} diff --git a/apps/pagination/templatetags/__init__.py b/apps/pagination/templatetags/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/apps/pagination/templatetags/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/pagination/templatetags/pagination_tags.py b/apps/pagination/templatetags/pagination_tags.py deleted file mode 100644 index 4908421ea..000000000 --- a/apps/pagination/templatetags/pagination_tags.py +++ /dev/null @@ -1,202 +0,0 @@ -try: - set -except NameError: - from sets import Set as set -from django import template -from django.db.models.query import QuerySet -from django.core.paginator import Paginator, QuerySetPaginator, InvalidPage - -register = template.Library() - -DEFAULT_PAGINATION = 20 -DEFAULT_WINDOW = 4 -DEFAULT_ORPHANS = 0 - -def do_autopaginate(parser, token): - """ - Splits the arguments to the autopaginate tag and formats them correctly. - """ - split = token.split_contents() - if len(split) == 2: - return AutoPaginateNode(split[1]) - elif len(split) == 3: - try: - paginate_by = int(split[2]) - except ValueError: - raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2]) - return AutoPaginateNode(split[1], paginate_by=paginate_by) - elif len(split) == 4: - try: - paginate_by = int(split[2]) - except ValueError: - raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2]) - try: - orphans = int(split[3]) - except ValueError: - raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[3]) - return AutoPaginateNode(split[1], paginate_by=paginate_by, orphans=orphans) - else: - raise template.TemplateSyntaxError('%r tag takes one required argument and one optional argument' % split[0]) - -class AutoPaginateNode(template.Node): - """ - Emits the required objects to allow for Digg-style pagination. - - First, it looks in the current context for the variable specified. This - should be either a QuerySet or a list. - - 1. If it is a QuerySet, this ``AutoPaginateNode`` will emit a - ``QuerySetPaginator`` and the current page object into the context names - ``paginator`` and ``page_obj``, respectively. - - 2. If it is a list, this ``AutoPaginateNode`` will emit a simple - ``Paginator`` and the current page object into the context names - ``paginator`` and ``page_obj``, respectively. - - It will then replace the variable specified with only the objects for the - current page. - - .. note:: - - It is recommended to use *{% paginate %}* after using the autopaginate - tag. If you choose not to use *{% paginate %}*, make sure to display the - list of availabale pages, or else the application may seem to be buggy. - """ - def __init__(self, queryset_var, paginate_by=DEFAULT_PAGINATION, orphans=DEFAULT_ORPHANS): - self.queryset_var = template.Variable(queryset_var) - self.paginate_by = paginate_by - self.orphans = orphans - - def render(self, context): - key = self.queryset_var.var - value = self.queryset_var.resolve(context) - if issubclass(value.__class__, QuerySet): - model = value.model - paginator_class = QuerySetPaginator - else: - value = list(value) - try: - model = value[0].__class__ - except IndexError: - return u'' - paginator_class = Paginator - paginator = paginator_class(value, self.paginate_by, self.orphans) - try: - page_obj = paginator.page(context['request'].page) - except InvalidPage: - # context[key] = [] - # context['invalid_page'] = True - # return u'' - from django.http import Http404 - raise Http404 - context[key] = page_obj.object_list - context['paginator'] = paginator - context['page_obj'] = page_obj - return u'' - -def paginate(context, window=DEFAULT_WINDOW): - """ - Renders the ``pagination/pagination.html`` template, resulting in a - Digg-like display of the available pages, given the current page. If there - are too many pages to be displayed before and after the current page, then - elipses will be used to indicate the undisplayed gap between page numbers. - - Requires one argument, ``context``, which should be a dictionary-like data - structure and must contain the following keys: - - ``paginator`` - A ``Paginator`` or ``QuerySetPaginator`` object. - - ``page_obj`` - This should be the result of calling the page method on the - aforementioned ``Paginator`` or ``QuerySetPaginator`` object, given - the current page. - - This same ``context`` dictionary-like data structure may also include: - - ``getvars`` - A dictionary of all of the **GET** parameters in the current request. - This is useful to maintain certain types of state, even when requesting - a different page. - """ - try: - paginator = context['paginator'] - page_obj = context['page_obj'] - page_range = paginator.page_range - # First and last are simply the first *n* pages and the last *n* pages, - # where *n* is the current window size. - first = set(page_range[:window]) - last = set(page_range[-window:]) - # Now we look around our current page, making sure that we don't wrap - # around. - current_start = page_obj.number-1-window - if current_start < 0: - current_start = 0 - current_end = page_obj.number-1+window - if current_end < 0: - current_end = 0 - current = set(page_range[current_start:current_end]) - pages = [] - # If there's no overlap between the first set of pages and the current - # set of pages, then there's a possible need for elusion. - if len(first.intersection(current)) == 0: - first_list = sorted(list(first)) - second_list = sorted(list(current)) - pages.extend(first_list) - diff = second_list[0] - first_list[-1] - # If there is a gap of two, between the last page of the first - # set and the first page of the current set, then we're missing a - # page. - if diff == 2: - pages.append(second_list[0] - 1) - # If the difference is just one, then there's nothing to be done, - # as the pages need no elusion and are correct. - elif diff == 1: - pass - # Otherwise, there's a bigger gap which needs to be signaled for - # elusion, by pushing a None value to the page list. - else: - pages.append(None) - pages.extend(second_list) - else: - pages.extend(sorted(list(first.union(current)))) - # If there's no overlap between the current set of pages and the last - # set of pages, then there's a possible need for elusion. - if len(current.intersection(last)) == 0: - second_list = sorted(list(last)) - diff = second_list[0] - pages[-1] - # If there is a gap of two, between the last page of the current - # set and the first page of the last set, then we're missing a - # page. - if diff == 2: - pages.append(second_list[0] - 1) - # If the difference is just one, then there's nothing to be done, - # as the pages need no elusion and are correct. - elif diff == 1: - pass - # Otherwise, there's a bigger gap which needs to be signaled for - # elusion, by pushing a None value to the page list. - else: - pages.append(None) - pages.extend(second_list) - else: - pages.extend(sorted(list(last.difference(current)))) - to_return = { - 'pages': pages, - 'page_obj': page_obj, - 'paginator': paginator, - 'is_paginated': paginator.count > paginator.per_page, - } - if 'request' in context: - getvars = context['request'].GET.copy() - if 'page' in getvars: - del getvars['page'] - if len(getvars.keys()) > 0: - to_return['getvars'] = "&%s" % getvars.urlencode() - else: - to_return['getvars'] = '' - return to_return - except KeyError: - return {} -register.inclusion_tag('pagination/pagination.html', takes_context=True)(paginate) -register.tag('autopaginate', do_autopaginate) \ No newline at end of file diff --git a/apps/pagination/tests.py b/apps/pagination/tests.py deleted file mode 100644 index 837e55cfe..000000000 --- a/apps/pagination/tests.py +++ /dev/null @@ -1,52 +0,0 @@ -""" ->>> from django.core.paginator import Paginator ->>> from pagination.templatetags.pagination_tags import paginate ->>> from django.template import Template, Context - ->>> p = Paginator(range(15), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, 5, 6, 7, 8] - ->>> p = Paginator(range(17), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, 5, 6, 7, 8, 9] - ->>> p = Paginator(range(19), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, None, 7, 8, 9, 10] - ->>> p = Paginator(range(21), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, None, 8, 9, 10, 11] - -# Testing orphans ->>> p = Paginator(range(5), 2, 1) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2] - ->>> p = Paginator(range(21), 2, 1) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, None, 7, 8, 9, 10] - ->>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}") - -# WARNING: Please, please nobody read this portion of the code! ->>> class GetProxy(object): -... def __iter__(self): yield self.__dict__.__iter__ -... def copy(self): return self -... def urlencode(self): return u'' -... def keys(self): return [] ->>> class RequestProxy(object): -... page = 1 -... GET = GetProxy() ->>> -# ENDWARNING - ->>> t.render(Context({'var': range(21), 'request': RequestProxy()})) -u'\\n